MediaPlayer_to_android.cpp revision 321f2cffd7dd560bf2e5c898be6953e19bed8496
1eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi/*
2eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi *
4eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * you may not use this file except in compliance with the License.
6eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * You may obtain a copy of the License at
7eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi *
8eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi *
10eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * See the License for the specific language governing permissions and
14eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi * limitations under the License.
15eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi */
16eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
17eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "sles_allinclusive.h"
18eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "utils/RefBase.h"
19eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "android_prompts.h"
20eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
21581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi//-----------------------------------------------------------------------------
22581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivistatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
23581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi{
24581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    if (NULL == user) {
25581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        return;
26581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    }
27581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
28581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    CMediaPlayer* mp = (CMediaPlayer*) user;
29581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
30581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
31581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    switch(event) {
32581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
33581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    case android::AVPlayer::kEventPrepared: {
34581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        if (PLAYER_SUCCESS == data1) {
35581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            object_lock_exclusive(&mp->mObject);
36581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
37581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            mp->mAndroidObjState = ANDROID_READY;
38581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            object_unlock_exclusive(&mp->mObject);
39581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        }
40581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        }
41581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        break;
42581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
43581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    default:
44581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
45581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        break;
46581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    }
47581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi}
48581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
49eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
50eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
51eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel TriviXAresult android_Player_create(CMediaPlayer *mp) {
52eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
53eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
54eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
55eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify data source
56eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
57eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify audio data sink
58eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
59eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify image data sink
60eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
61eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
62eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
63eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch(sourceLocator) {
64f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
65f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        mp->mAndroidObjType = AV_PLR_TS_ABQ;
66eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
67f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_URI: // intended fall-through
68f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ADDRESS: // intended fall-through
69eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD: // intended fall-through
70eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
71eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
72eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
73eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
74eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
75eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
76eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
77f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
78f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
79f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mSessionId = android::AudioSystem::newAudioSessionId();
80eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
81f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
82f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
83f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
84f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
85f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
86f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mDirectLevel = 0; // no attenuation
87eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
88eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
89eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
90eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
91eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
92eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
93eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
94eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel TriviXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
95eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    SL_LOGI("android_Player_realize_l(%p)", mp);
96eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
97eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
98eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
99eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
100eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
101eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    AudioPlayback_Parameters ap_params;
102f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.sessionId = mp->mSessionId;
103f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.streamType = mp->mStreamType;
104eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcb = NULL;
105eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcbUser = NULL;
106eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
107f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    switch(mp->mAndroidObjType) {
108f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case AV_PLR_TS_ABQ: {
109eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        mp->mAVPlayer = new android::StreamPlayer(&ap_params);
110581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
111eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        }
112eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
113321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    case INVALID_TYPE: // intended fall-through
114eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
115f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
116eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
117eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
118eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
119eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
120eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
121eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
122eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
123eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
124eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
125f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi/**
1260e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi * pre-conditions: avp != NULL, surface != NULL
1270e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi */
1280e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel TriviXAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) {
1290e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
1300e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1310e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    avp->setVideoSurface(surface);
1320e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1330e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    return result;
1340e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi}
1350e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1360e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1370e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi//-----------------------------------------------------------------------------
1380e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi/**
139f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi * pre-condition: avp != NULL
140f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi */
141f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel TriviXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
142581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        AndroidObject_state* pObjState)
143eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi{
144eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
145581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    AndroidObject_state objState = *pObjState;
146eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
147eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch (playState) {
148eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_STOPPED: {
149f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
150f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         avp->stop();
151eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
152eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PAUSED: {
153f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
154eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
155eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
156581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
157f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->prepare();
158581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
159eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
160eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
161eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
162f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->pause();
163581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
164eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
165f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
166eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
167eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
168eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
169eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PLAYING: {
170f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
171eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
172eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
173581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
174581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             avp->prepare();
175581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
176eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
177581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
178eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
179f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->play();
180581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
181eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
182f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
183eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
184eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
185eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
186eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
187eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     default:
188eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         // checked by caller, should not happen
189eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         break;
190eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     }
191eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
192eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
193eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
194eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
195eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
196eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
197eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
198eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
199eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
200eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
201eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
202eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
203eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
204eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
205eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
206eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
207eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
208eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
209eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
210eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
211eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
212eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->appEnqueue(bufferId, length, event, pData);
213eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
214eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
215eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
216eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
217eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
218