MediaPlayer_to_android.cpp revision 581a0f550f15f6fc22199cb85775a220f668b480
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;
113f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case INVALID_TYPE:
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
121eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
122eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
123eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
124eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
125eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
126f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi/**
127f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi * pre-condition: avp != NULL
128f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi */
129f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel TriviXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
130581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        AndroidObject_state* pObjState)
131eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi{
132eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
133581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    AndroidObject_state objState = *pObjState;
134eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
135eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch (playState) {
136eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_STOPPED: {
137f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
138f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         avp->stop();
139eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
140eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PAUSED: {
141f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
142eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
143eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
144581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
145f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->prepare();
146581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
147eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
148eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
149eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
150f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->pause();
151581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
152eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
153f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
154eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
155eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
156eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
157eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PLAYING: {
158f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
159eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
160eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
161581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
162581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             avp->prepare();
163581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
164eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
165581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
166eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
167f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->play();
168581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
169eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
170f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
171eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
172eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
173eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     } break;
174eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
175eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     default:
176eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         // checked by caller, should not happen
177eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         break;
178eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     }
179eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
180eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
181eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
182eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
183eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
184eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
185eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
186eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
187eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
188eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
189eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
190eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
191eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
192eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
193eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
194eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
195eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
196eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
197eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
198eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
199eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
200eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->appEnqueue(bufferId, length, event, pData);
201eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
202eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
203eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
204eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
205eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
206