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