MediaPlayer_to_android.cpp revision 0e47a0657162bbff48886ea2f5c68d9edb607768
14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sles_allinclusive.h" 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "utils/RefBase.h" 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "android_prompts.h" 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//----------------------------------------------------------------------------- 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user) 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (NULL == user) { 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CMediaPlayer* mp = (CMediaPlayer*) user; 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //SL_LOGV("received event %d, data %d from AVPlayer", event, data1); 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch(event) { 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case android::AVPlayer::kEventPrepared: { 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (PLAYER_SUCCESS == data1) { 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project object_lock_exclusive(&mp->mObject); 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp); 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidObjState = ANDROID_READY; 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project object_unlock_exclusive(&mp->mObject); 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1); 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//----------------------------------------------------------------------------- 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectXAresult android_Player_create(CMediaPlayer *mp) { 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project XAresult result = XA_RESULT_SUCCESS; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // FIXME verify data source 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // FIXME verify audio data sink 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // FIXME verify image data sink 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch(sourceLocator) { 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidObjType = AV_PLR_TS_ABQ; 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case XA_DATALOCATOR_URI: // intended fall-through 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case XA_DATALOCATOR_ADDRESS: // intended fall-through 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SL_DATALOCATOR_ANDROIDFD: // intended fall-through 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = XA_RESULT_PARAMETER_INVALID; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidObjState = ANDROID_UNINITIALIZED; 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mSessionId = android::AudioSystem::newAudioSessionId(); 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f; 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f; 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAndroidAudioLevels.mAuxSendLevel = 0; 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mDirectLevel = 0; // no attenuation 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//----------------------------------------------------------------------------- 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SL_LOGI("android_Player_realize_l(%p)", mp); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project XAresult result = XA_RESULT_SUCCESS; 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AudioPlayback_Parameters ap_params; 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ap_params.sessionId = mp->mSessionId; 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ap_params.streamType = mp->mStreamType; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ap_params.trackcb = NULL; 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ap_params.trackcbUser = NULL; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch(mp->mAndroidObjType) { 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case AV_PLR_TS_ABQ: { 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAVPlayer = new android::StreamPlayer(&ap_params); 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case INVALID_TYPE: 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type"); 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = XA_RESULT_PARAMETER_INVALID; 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//----------------------------------------------------------------------------- 126/** 127 * pre-conditions: avp != NULL, surface != NULL 128 */ 129XAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) { 130 XAresult result = XA_RESULT_SUCCESS; 131 132 avp->setVideoSurface(surface); 133 134 return result; 135} 136 137 138//----------------------------------------------------------------------------- 139/** 140 * pre-condition: avp != NULL 141 */ 142XAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState, 143 AndroidObject_state* pObjState) 144{ 145 XAresult result = XA_RESULT_SUCCESS; 146 AndroidObject_state objState = *pObjState; 147 148 switch (playState) { 149 case SL_PLAYSTATE_STOPPED: { 150 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED"); 151 avp->stop(); 152 } break; 153 case SL_PLAYSTATE_PAUSED: { 154 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED"); 155 switch(objState) { 156 case(ANDROID_UNINITIALIZED): 157 *pObjState = ANDROID_PREPARING; 158 avp->prepare(); 159 break; 160 case(ANDROID_PREPARING): 161 break; 162 case(ANDROID_READY): 163 avp->pause(); 164 break; 165 default: 166 SL_LOGE("Android object in invalid state"); 167 break; 168 } 169 } break; 170 case SL_PLAYSTATE_PLAYING: { 171 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING"); 172 switch(objState) { 173 case(ANDROID_UNINITIALIZED): 174 *pObjState = ANDROID_PREPARING; 175 avp->prepare(); 176 // intended fall through 177 case(ANDROID_PREPARING): 178 // intended fall through 179 case(ANDROID_READY): 180 avp->play(); 181 break; 182 default: 183 SL_LOGE("Android object in invalid state"); 184 break; 185 } 186 } break; 187 188 default: 189 // checked by caller, should not happen 190 break; 191 } 192 193 return result; 194} 195 196 197//----------------------------------------------------------------------------- 198// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 199void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 200 if (mp->mAVPlayer != 0) { 201 SL_LOGI("android_Player_androidBufferQueue_registerCallback_l"); 202 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 203 splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback, 204 mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 205 } 206} 207 208// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 209void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp, 210 SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) { 211 if (mp->mAVPlayer != 0) { 212 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 213 splr->appEnqueue(bufferId, length, event, pData); 214 } 215} 216 217 218 219