MediaPlayer_to_android.cpp revision f271eea20f9fff6c101213b34652399f457bcd50
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2010 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * you may not use this file except in compliance with the License. 6608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 850c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wang * http://www.apache.org/licenses/LICENSE-2.0 9760943b5e7a09b602aba04ec451e97662f48b0a4James Dong * 10608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * Unless required by applicable law or agreed to in writing, software 11608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * See the License for the specific language governing permissions and 14608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * limitations under the License. 15608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber */ 16608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber 179c075bca0b75093ca0514a3c8f74d73c8e9e83fdNipun Kwatra#include "sles_allinclusive.h" 18ad452ffadf0ced7449395585a55255c915734e17Nipun Kwatra#include "utils/RefBase.h" 19608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber#include "android_prompts.h" 20a9741a9232c81eaf59179acef91f5be46c42264eGloria Wang 21608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber 22608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber//----------------------------------------------------------------------------- 23856990b491d84b7ed4fefe337485c8997ba9dd02Glenn KastenXAresult android_Player_create(CMediaPlayer *mp) { 241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 25608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber XAresult result = XA_RESULT_SUCCESS; 26608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber 270da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber // FIXME verify data source 28608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 29608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber // FIXME verify audio data sink 30608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 31608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber // FIXME verify image data sink 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 33afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 34608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 35608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber switch(sourceLocator) { 36608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: 37608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber mp->mAndroidObjType = AV_PLR_TS_ABQ; 38608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber break; 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber case XA_DATALOCATOR_URI: // intended fall-through 40608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber case XA_DATALOCATOR_ADDRESS: // intended fall-through 41608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber case SL_DATALOCATOR_ANDROIDFD: // intended fall-through 42608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber default: 43608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator); 44608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber result = XA_RESULT_PARAMETER_INVALID; 45608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber break; 46608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber 471a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi } 48608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber 49608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber mp->mAndroidObjState = ANDROID_UNINITIALIZED; 50608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 51608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber mp->mSessionId = android::AudioSystem::newAudioSessionId(); 524456da54bcd206ed1f518c69cc959ca65a179c83Andreas Huber 53608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f; 54b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f; 554456da54bcd206ed1f518c69cc959ca65a179c83Andreas Huber mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f; 5685f12e9b9062402d6110df3f7099707912040edbAndreas Huber mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mp->mAndroidAudioLevels.mAuxSendLevel = 0; 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mp->mDirectLevel = 0; // no attenuation 591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber 603254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang return result; 616c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong} 626c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong 63afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 64856990b491d84b7ed4fefe337485c8997ba9dd02Glenn Kasten//----------------------------------------------------------------------------- 6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 668cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas HuberXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SL_LOGI("android_Player_realize_l(%p)", mp); 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber XAresult result = XA_RESULT_SUCCESS; 6943b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block 70dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 71afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 7243b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block 73afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber AudioPlayback_Parameters ap_params; 74afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ap_params.sessionId = mp->mSessionId; 75afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ap_params.streamType = mp->mStreamType; 76afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ap_params.trackcb = NULL; 7743b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block ap_params.trackcbUser = NULL; 7843b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block 79afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber switch(mp->mAndroidObjType) { 80afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber case AV_PLR_TS_ABQ: { 81afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mp->mAVPlayer = new android::StreamPlayer(&ap_params); 82afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mp->mAVPlayer->init(); 83afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 84afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber break; 85afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber case INVALID_TYPE: 86afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber default: 87afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type"); 88afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber result = XA_RESULT_PARAMETER_INVALID; 8943b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block break; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 92f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 93c71f6e2392bf55cc85ee7c1a376441e9b9aae4c8James Dong return result; 9429a84457aed4c45bc900998b5e11c03023264208James Dong} 9559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 96093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber 97965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang//----------------------------------------------------------------------------- 984d1265cd007b9754d0645bc4fb95701140a45648Andreas Huber/** 99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * pre-condition: avp != NULL 100e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber */ 101608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas HuberXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState, 102856990b491d84b7ed4fefe337485c8997ba9dd02Glenn Kasten AndroidObject_state objState) 10343b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block{ 10434fba6695fe1b55710baef561785caa0486654fbAndreas Huber XAresult result = XA_RESULT_SUCCESS; 10543b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block 1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber switch (playState) { 107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber case SL_PLAYSTATE_STOPPED: { 10843b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED"); 10934fba6695fe1b55710baef561785caa0486654fbAndreas Huber avp->stop(); 11034fba6695fe1b55710baef561785caa0486654fbAndreas Huber } break; 111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber case SL_PLAYSTATE_PAUSED: { 112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED"); 113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber switch(objState) { 114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber case(ANDROID_UNINITIALIZED): 1155e0067b486c3862316aa1f293cf9690c0cf54bdaJeff Brown avp->prepare(); 11672b56ef3d9f164159f58725781b01dd3b052b51aMarco Nelissen break; 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case(ANDROID_PREPARING): 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber break; 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber case(ANDROID_READY): 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber avp->pause(); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber break; 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber default: 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber SL_LOGE("Android object in invalid state"); 124 break; 125 } 126 } break; 127 case SL_PLAYSTATE_PLAYING: { 128 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING"); 129 switch(objState) { 130 case(ANDROID_UNINITIALIZED): 131 // FIXME PRIORITY1 prepare should update the obj state 132 // for the moment test app sets state to PAUSED to prepare, then to PLAYING 133 //avp->prepare(); 134 135 // fall through 136 case(ANDROID_PREPARING): 137 case(ANDROID_READY): 138 avp->play(); 139 break; 140 default: 141 SL_LOGE("Android object in invalid state"); 142 break; 143 } 144 } break; 145 146 default: 147 // checked by caller, should not happen 148 break; 149 } 150 151 return result; 152} 153 154 155//----------------------------------------------------------------------------- 156// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 157void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 158 if (mp->mAVPlayer != 0) { 159 SL_LOGI("android_Player_androidBufferQueue_registerCallback_l"); 160 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 161 splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback, 162 mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 163 } 164} 165 166// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 167void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp, 168 SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) { 169 if (mp->mAVPlayer != 0) { 170 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 171 splr->appEnqueue(bufferId, length, event, pData); 172 } 173} 174 175 176 177