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