MediaPlayer_to_android.cpp revision 68d56b8ebaf60184a3aef988e3d2b09ed8b88c05
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
3368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    case android::GenericPlayer::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
6297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
63eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch(sourceLocator) {
6497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    // FIXME support Android simple buffer queue as well
65f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
66f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        mp->mAndroidObjType = AV_PLR_TS_ABQ;
67eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
68f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_URI: // intended fall-through
6997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
70b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi        mp->mAndroidObjType = AV_PLR_URIFD;
7197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        break;
72f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ADDRESS: // intended fall-through
73eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
74eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
75eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
76eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
77eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
78eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
79f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
80f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
81f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mSessionId = android::AudioSystem::newAudioSessionId();
82eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
83f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
84f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
85f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
86f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
87f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
88f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mDirectLevel = 0; // no attenuation
89eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
90eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
91eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
92eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
93eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
94eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
95eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
96eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel TriviXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
97eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    SL_LOGI("android_Player_realize_l(%p)", mp);
98eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
99eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
100eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
101eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
102eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
103eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    AudioPlayback_Parameters ap_params;
104f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.sessionId = mp->mSessionId;
105f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.streamType = mp->mStreamType;
106eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcb = NULL;
107eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcbUser = NULL;
108eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
109f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    switch(mp->mAndroidObjType) {
110f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case AV_PLR_TS_ABQ: {
11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mp->mAVPlayer = new android::StreamPlayer(&ap_params, true /*hasVideo*/);
112581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
113eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        }
114eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
115b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi    case AV_PLR_URIFD: {
11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mp->mAVPlayer = new android::LocAVPlayer(&ap_params, true /*hasVideo*/);
11797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
11897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        switch (mp->mDataSource.mLocator.mLocatorType) {
11997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        case XA_DATALOCATOR_URI:
12097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
12197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (const char*)mp->mDataSource.mLocator.mURI.URI);
12297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            break;
12397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        case XA_DATALOCATOR_ANDROIDFD: {
12497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
12597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
12697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (int)mp->mDataSource.mLocator.mFD.fd,
12797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
12897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
12997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (int64_t)mp->mDataSource.mLocator.mFD.length);
13097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            }
13197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            break;
13297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        default:
13397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
13497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    mp->mDataSource.mLocator.mLocatorType);
13597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            result = XA_RESULT_PARAMETER_INVALID;
13697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        }
13797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        }
13897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        break;
139321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    case INVALID_TYPE: // intended fall-through
140eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
141f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
142eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
143eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
144eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
145eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
146eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
147eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
148eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
14997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-----------------------------------------------------------------------------
15097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviXAresult android_Player_destroy(CMediaPlayer *mp) {
15197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    SL_LOGI("android_Player_destroy(%p)", mp);
15297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
15397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
15497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
15597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        mp->mAVPlayer.clear();
15697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    }
15797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
15897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    return result;
15997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
160eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
161eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
162f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi/**
1630e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi * pre-conditions: avp != NULL, surface != NULL
1640e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi */
16568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviXAresult android_Player_setVideoSurface(android::GenericMediaPlayer *avp, void* surface) {
1660e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
1670e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1680e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    avp->setVideoSurface(surface);
1690e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1700e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    return result;
1710e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi}
1720e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1730e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
1740e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi//-----------------------------------------------------------------------------
1750e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi/**
176f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi * pre-condition: avp != NULL
177f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi */
17868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviXAresult android_Player_setPlayState(android::GenericPlayer *avp, SLuint32 playState,
179581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        AndroidObject_state* pObjState)
180eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi{
181eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
182581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    AndroidObject_state objState = *pObjState;
183eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
184eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch (playState) {
185eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_STOPPED: {
186f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
187f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         avp->stop();
18897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
18997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
190eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PAUSED: {
191f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
192eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
193eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
194581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
195f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->prepare();
196581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
197eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
198eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
199eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
200f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->pause();
201581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
202eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
203f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
204eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
205eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
20697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
20797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
208eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PLAYING: {
209f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
210eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
211eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
212581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
213581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             avp->prepare();
214581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
215eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
216581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
217eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
218f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->play();
219581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
220eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
221f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
222eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
223eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
22497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
22597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
226eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     default:
227eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         // checked by caller, should not happen
228eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         break;
229eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     }
230eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
231eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
232eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
233eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
234eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
235eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
236eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
237eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
238eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
239eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
240eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
241eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
242eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
243eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
244eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
245eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
246eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
247eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
248eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
249eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
250eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
251eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->appEnqueue(bufferId, length, event, pData);
252eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
253eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
254eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
255eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
256eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
257