MediaPlayer_to_android.cpp revision b2aeb0f1009555181dabb944fe05901cb6e6f632
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "sles_allinclusive.h" 18#include "utils/RefBase.h" 19#include "android_prompts.h" 20 21//----------------------------------------------------------------------------- 22static void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user) 23{ 24 if (NULL == user) { 25 return; 26 } 27 28 CMediaPlayer* mp = (CMediaPlayer*) user; 29 //SL_LOGV("received event %d, data %d from AVPlayer", event, data1); 30 31 switch(event) { 32 33 case android::AVPlayer::kEventPrepared: { 34 if (PLAYER_SUCCESS == data1) { 35 object_lock_exclusive(&mp->mObject); 36 SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp); 37 mp->mAndroidObjState = ANDROID_READY; 38 object_unlock_exclusive(&mp->mObject); 39 } 40 } 41 break; 42 43 default: 44 SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1); 45 break; 46 } 47} 48 49 50//----------------------------------------------------------------------------- 51XAresult android_Player_create(CMediaPlayer *mp) { 52 53 XAresult result = XA_RESULT_SUCCESS; 54 55 // FIXME verify data source 56 const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 57 // FIXME verify audio data sink 58 const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink; 59 // FIXME verify image data sink 60 const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink; 61 62 XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator; 63 switch(sourceLocator) { 64 // FIXME support Android simple buffer queue as well 65 case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: 66 mp->mAndroidObjType = AV_PLR_TS_ABQ; 67 break; 68 case XA_DATALOCATOR_URI: // intended fall-through 69 case SL_DATALOCATOR_ANDROIDFD: 70 mp->mAndroidObjType = AV_PLR_URIFD; 71 break; 72 case XA_DATALOCATOR_ADDRESS: // intended fall-through 73 default: 74 SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator); 75 result = XA_RESULT_PARAMETER_INVALID; 76 break; 77 } 78 79 mp->mAndroidObjState = ANDROID_UNINITIALIZED; 80 mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 81 mp->mSessionId = android::AudioSystem::newAudioSessionId(); 82 83 mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f; 84 mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f; 85 mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f; 86 mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 87 mp->mAndroidAudioLevels.mAuxSendLevel = 0; 88 mp->mDirectLevel = 0; // no attenuation 89 90 return result; 91} 92 93 94//----------------------------------------------------------------------------- 95// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 96XAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) { 97 SL_LOGI("android_Player_realize_l(%p)", mp); 98 XAresult result = XA_RESULT_SUCCESS; 99 100 const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource; 101 const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator; 102 103 AudioPlayback_Parameters ap_params; 104 ap_params.sessionId = mp->mSessionId; 105 ap_params.streamType = mp->mStreamType; 106 ap_params.trackcb = NULL; 107 ap_params.trackcbUser = NULL; 108 109 switch(mp->mAndroidObjType) { 110 case AV_PLR_TS_ABQ: { 111 mp->mAVPlayer = new android::StreamPlayer(&ap_params); 112 mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 113 } 114 break; 115 case AV_PLR_URIFD: { 116 mp->mAVPlayer = new android::LocAVPlayer(&ap_params); 117 mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp); 118 switch (mp->mDataSource.mLocator.mLocatorType) { 119 case XA_DATALOCATOR_URI: 120 ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 121 (const char*)mp->mDataSource.mLocator.mURI.URI); 122 break; 123 case XA_DATALOCATOR_ANDROIDFD: { 124 int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset; 125 ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource( 126 (int)mp->mDataSource.mLocator.mFD.fd, 127 offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 128 (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 129 (int64_t)mp->mDataSource.mLocator.mFD.length); 130 } 131 break; 132 default: 133 SL_LOGE("Invalid or unsupported data locator type %lu for data source", 134 mp->mDataSource.mLocator.mLocatorType); 135 result = XA_RESULT_PARAMETER_INVALID; 136 } 137 } 138 break; 139 case INVALID_TYPE: // intended fall-through 140 default: 141 SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type"); 142 result = XA_RESULT_PARAMETER_INVALID; 143 break; 144 } 145 146 return result; 147} 148 149//----------------------------------------------------------------------------- 150XAresult android_Player_destroy(CMediaPlayer *mp) { 151 SL_LOGI("android_Player_destroy(%p)", mp); 152 XAresult result = XA_RESULT_SUCCESS; 153 154 if (mp->mAVPlayer != 0) { 155 mp->mAVPlayer.clear(); 156 } 157 158 return result; 159} 160 161//----------------------------------------------------------------------------- 162/** 163 * pre-conditions: avp != NULL, surface != NULL 164 */ 165XAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) { 166 XAresult result = XA_RESULT_SUCCESS; 167 168 avp->setVideoSurface(surface); 169 170 return result; 171} 172 173 174//----------------------------------------------------------------------------- 175/** 176 * pre-condition: avp != NULL 177 */ 178XAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState, 179 AndroidObject_state* pObjState) 180{ 181 XAresult result = XA_RESULT_SUCCESS; 182 AndroidObject_state objState = *pObjState; 183 184 switch (playState) { 185 case SL_PLAYSTATE_STOPPED: { 186 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED"); 187 avp->stop(); 188 } 189 break; 190 case SL_PLAYSTATE_PAUSED: { 191 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED"); 192 switch(objState) { 193 case(ANDROID_UNINITIALIZED): 194 *pObjState = ANDROID_PREPARING; 195 avp->prepare(); 196 break; 197 case(ANDROID_PREPARING): 198 break; 199 case(ANDROID_READY): 200 avp->pause(); 201 break; 202 default: 203 SL_LOGE("Android object in invalid state"); 204 break; 205 } 206 } 207 break; 208 case SL_PLAYSTATE_PLAYING: { 209 SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING"); 210 switch(objState) { 211 case(ANDROID_UNINITIALIZED): 212 *pObjState = ANDROID_PREPARING; 213 avp->prepare(); 214 // intended fall through 215 case(ANDROID_PREPARING): 216 // intended fall through 217 case(ANDROID_READY): 218 avp->play(); 219 break; 220 default: 221 SL_LOGE("Android object in invalid state"); 222 break; 223 } 224 } 225 break; 226 default: 227 // checked by caller, should not happen 228 break; 229 } 230 231 return result; 232} 233 234 235//----------------------------------------------------------------------------- 236// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 237void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) { 238 if (mp->mAVPlayer != 0) { 239 SL_LOGI("android_Player_androidBufferQueue_registerCallback_l"); 240 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 241 splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback, 242 mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf)); 243 } 244} 245 246// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer 247void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp, 248 SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) { 249 if (mp->mAVPlayer != 0) { 250 android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get()); 251 splr->appEnqueue(bufferId, length, event, pData); 252 } 253} 254 255 256 257