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