MediaPlayer_to_android.cpp revision eae4df541ba1d46f65d37e959baf2127aa632c93
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 The Android Open Source Project 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * you may not use this file except in compliance with the License. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You may obtain a copy of the License at 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * See the License for the specific language governing permissions and 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * limitations under the License. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "sles_allinclusive.h" 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "utils/RefBase.h" 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "android_prompts.h" 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//----------------------------------------------------------------------------- 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochXAresult android_Player_create(CMediaPlayer *mp) { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) XAresult result = XA_RESULT_SUCCESS; 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME verify data source 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 2906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // FIXME verify audio data sink 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME verify image data sink 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch(sourceLocator) { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SL_DATALOCATOR_URI: // intended fall-through 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SL_DATALOCATOR_ANDROIDFD: // intended fall-through 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case SL_DATALOCATOR_BUFFERQUEUE: // intended fall-through 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: // intended fall-through 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator); 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = XA_RESULT_PARAMETER_INVALID; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // FIXME port all CAudioPlayer initialization to CMediaPlayer 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME verify play state is correctly initialized 52a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch/* 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED; 5407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAudioTrack = NULL; 56a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mSessionId = android::AudioSystem::newAudioSessionId(); 5807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch pAudioPlayer->mAmplFromVolLevel = 1.0f; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAmplFromStereoPos[0] = 1.0f; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAmplFromStereoPos[1] = 1.0f; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mDirectLevel = 0; // no attenuation 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pAudioPlayer->mAuxSendLevel = 0; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // initialize interface-specific fields that can be used regardless of whether the interface 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is exposed on the AudioPlayer or not 69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // (section no longer applicable, as all previous initializations were the same as the defaults) 70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)*/ 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//----------------------------------------------------------------------------- 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)XAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SL_LOGI("android_Player_realize_l(%p)", mp); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) XAresult result = XA_RESULT_SUCCESS; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84 AudioPlayback_Parameters ap_params; 85 ap_params.sessionId = 0;// FIXME mp->mSessionId; 86 ap_params.streamType = android::AudioSystem::MUSIC;// FIXME mp->mStreamType; 87 ap_params.trackcb = NULL; 88 ap_params.trackcbUser = NULL; 89 90 switch(sourceLocator) { 91 case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: { 92 mp->mAVPlayer = new android::StreamPlayer(&ap_params); 93 mp->mAVPlayer->init(); 94 } 95 break; 96 case SL_DATALOCATOR_URI: // intended fall-through 97 case SL_DATALOCATOR_ANDROIDFD: // intended fall-through 98 case SL_DATALOCATOR_BUFFERQUEUE: // intended fall-through 99 case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: // intended fall-through 100 default: 101 SL_LOGE("Unable to realize MediaPlayer for data source locator 0x%lx", sourceLocator); 102 result = XA_RESULT_PARAMETER_INVALID; 103 break; 104 105 } 106 107 return result; 108} 109 110 111//----------------------------------------------------------------------------- 112// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 113XAresult android_Player_setPlayState(CMediaPlayer *mp, SLuint32 playState, 114 AndroidObject_state objState) 115{ 116 XAresult result = XA_RESULT_SUCCESS; 117 118 switch (playState) { 119 case SL_PLAYSTATE_STOPPED: { 120 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_STOPPED"); 121 if (mp->mAVPlayer != 0) { 122 mp->mAVPlayer->stop(); 123 } 124 } break; 125 case SL_PLAYSTATE_PAUSED: { 126 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_PAUSED"); 127 switch(objState) { 128 case(ANDROID_UNINITIALIZED): 129 if (mp->mAVPlayer != 0) { 130 mp->mAVPlayer->prepare(); 131 } 132 break; 133 case(ANDROID_PREPARING): 134 break; 135 case(ANDROID_READY): 136 if (mp->mAVPlayer != 0) { 137 mp->mAVPlayer->pause(); 138 } 139 break; 140 default: 141 break; 142 } 143 } break; 144 case SL_PLAYSTATE_PLAYING: { 145 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_PLAYING"); 146 switch(objState) { 147 case(ANDROID_UNINITIALIZED): 148 // FIXME PRIORITY1 prepare should update the obj state 149 // for the moment test app sets state to PAUSED to prepare, then to PLAYING 150 /*if (mp->mAVPlayer != 0) { 151 mp->mAVPlayer->prepare(); 152 }*/ 153 // fall through 154 case(ANDROID_PREPARING): 155 case(ANDROID_READY): 156 if (mp->mAVPlayer != 0) { 157 mp->mAVPlayer->play(); 158 } 159 break; 160 default: 161 break; 162 } 163 } break; 164 165 default: 166 // checked by caller, should not happen 167 break; 168 } 169 170 return result; 171} 172 173 174//---------------------------------------------------------------- 175// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 176void android_StreamPlayer_setPlayState(CAudioPlayer *ap, SLuint32 playState, 177 AndroidObject_state objState) 178{ 179 switch (playState) { 180 case SL_PLAYSTATE_STOPPED: { 181 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_STOPPED"); 182 if (ap->mStreamPlayer != 0) { 183 ap->mStreamPlayer->stop(); 184 } 185 } break; 186 case SL_PLAYSTATE_PAUSED: { 187 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_PAUSED"); 188 switch(objState) { 189 case(ANDROID_UNINITIALIZED): 190 if (ap->mStreamPlayer != 0) { 191 ap->mStreamPlayer->prepare(); 192 } 193 break; 194 case(ANDROID_PREPARING): 195 break; 196 case(ANDROID_READY): 197 if (ap->mStreamPlayer != 0) { 198 ap->mStreamPlayer->pause(); 199 } 200 break; 201 default: 202 break; 203 } 204 } break; 205 case SL_PLAYSTATE_PLAYING: { 206 SL_LOGV("setting StreamPlayer to SL_PLAYSTATE_PLAYING"); 207 switch(objState) { 208 case(ANDROID_UNINITIALIZED): 209 // FIXME PRIORITY1 prepare should update the obj state 210 // for the moment test app sets state to PAUSED to prepare, then to PLAYING 211 /*if (ap->mStreamPlayer != 0) { 212 ap->mStreamPlayer->prepare(); 213 }*/ 214 // fall through 215 case(ANDROID_PREPARING): 216 case(ANDROID_READY): 217 if (ap->mStreamPlayer != 0) { 218 ap->mStreamPlayer->play(); 219 } 220 break; 221 default: 222 break; 223 } 224 } break; 225 226 default: 227 // checked by caller, should not happen 228 break; 229 } 230} 231 232 233//----------------------------------------------------------------------------- 234// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 235void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 236 if (mp->mAVPlayer != 0) { 237 SL_LOGI("android_Player_androidBufferQueue_registerCallback_l"); 238 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 239 splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback, 240 mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 241 } 242} 243 244// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 245void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp, 246 SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) { 247 if (mp->mAVPlayer != 0) { 248 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 249 splr->appEnqueue(bufferId, length, event, pData); 250 } 251} 252 253 254 255