MediaPlayer_to_android.cpp revision 97876858aa17c7f24c6a1d60be09a57bc1824ba3
1cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/*
2cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
4cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * you may not use this file except in compliance with the License.
6cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * You may obtain a copy of the License at
7cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
8cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten *
10cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * See the License for the specific language governing permissions and
14cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * limitations under the License.
15cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten */
16cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
17cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#include "sles_allinclusive.h"
18cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#include "utils/RefBase.h"
19cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten#include "android_prompts.h"
20cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
21cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
22cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastenstatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
23cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten{
24cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    if (NULL == user) {
25cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        return;
26cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
27cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
28cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    CMediaPlayer* mp = (CMediaPlayer*) user;
29cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
30cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
31cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    switch(event) {
32cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
33cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case android::AVPlayer::kEventPrepared: {
34cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        if (PLAYER_SUCCESS == data1) {
35cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            object_lock_exclusive(&mp->mObject);
36cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
37cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            mp->mAndroidObjState = ANDROID_READY;
38cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            object_unlock_exclusive(&mp->mObject);
39cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        }
40cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        }
41cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
42cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
43cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    default:
44cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
45cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
46cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
47cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
48cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
49cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
50cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
51cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn KastenXAresult android_Player_create(CMediaPlayer *mp) {
52cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
53cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
54cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
55cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // FIXME verify data source
56cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
57cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // FIXME verify audio data sink
58cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
59cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // FIXME verify image data sink
60cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
61cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
62cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
63cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    switch(sourceLocator) {
64cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    // FIXME support Android simple buffer queue as well
65cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
66cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAndroidObjType = AV_PLR_TS_ABQ;
67cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
68cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case XA_DATALOCATOR_URI: // intended fall-through
69cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case SL_DATALOCATOR_ANDROIDFD:
70cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAndroidObjType = AV_PLR_URI_FD;
71cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
72cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case XA_DATALOCATOR_ADDRESS: // intended fall-through
73cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    default:
74cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
75cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        result = XA_RESULT_PARAMETER_INVALID;
76cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
77cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
78cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
79cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
80cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
81cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mSessionId = android::AudioSystem::newAudioSessionId();
82cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
83cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
84cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
85cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
86cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
87cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
88cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    mp->mDirectLevel = 0; // no attenuation
89cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
90cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    return result;
91cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
92cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
93cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
94cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
95cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
96cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn KastenXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
97cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SL_LOGI("android_Player_realize_l(%p)", mp);
98cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
99cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
100cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
101cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
102cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
103cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    AudioPlayback_Parameters ap_params;
104cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ap_params.sessionId = mp->mSessionId;
105cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ap_params.streamType = mp->mStreamType;
106cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ap_params.trackcb = NULL;
107cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    ap_params.trackcbUser = NULL;
108cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
109cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    switch(mp->mAndroidObjType) {
110cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case AV_PLR_TS_ABQ: {
111cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAVPlayer = new android::StreamPlayer(&ap_params);
112cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
113cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        }
114cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
115cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case AV_PLR_URI_FD: {
116cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAVPlayer = new android::LocAVPlayer(&ap_params);
117cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
118cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        switch (mp->mDataSource.mLocator.mLocatorType) {
119cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        case XA_DATALOCATOR_URI:
120cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
121cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                    (const char*)mp->mDataSource.mLocator.mURI.URI);
122cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            break;
123cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        case XA_DATALOCATOR_ANDROIDFD: {
124cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
125cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
126cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                    (int)mp->mDataSource.mLocator.mFD.fd,
127cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
128cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
129cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                    (int64_t)mp->mDataSource.mLocator.mFD.length);
130cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            }
131cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            break;
132cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        default:
133cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
134cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                    mp->mDataSource.mLocator.mLocatorType);
135cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten            result = XA_RESULT_PARAMETER_INVALID;
136cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        }
137cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        }
138cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
139cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    case INVALID_TYPE: // intended fall-through
140cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    default:
141cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
142cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        result = XA_RESULT_PARAMETER_INVALID;
143cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        break;
144cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
145cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
146cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    return result;
147cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
148cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
149cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
150cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn KastenXAresult android_Player_destroy(CMediaPlayer *mp) {
151cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    SL_LOGI("android_Player_destroy(%p)", mp);
152cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
153cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
154cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    if (mp->mAVPlayer != 0) {
155cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        mp->mAVPlayer.clear();
156cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
157cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
158cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    return result;
159cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
160cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
161cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
162cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/**
163cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * pre-conditions: avp != NULL, surface != NULL
164cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten */
165cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn KastenXAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) {
166cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
167cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
168cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    avp->setVideoSurface(surface);
169cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
170cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    return result;
171cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
172cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
173cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
174cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
175cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten/**
176cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten * pre-condition: avp != NULL
177cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten */
178cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn KastenXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
179cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        AndroidObject_state* pObjState)
180cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten{
181cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
182cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    AndroidObject_state objState = *pObjState;
183cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
184cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    switch (playState) {
185cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     case SL_PLAYSTATE_STOPPED: {
186cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
187cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         avp->stop();
188cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         }
189cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         break;
190cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     case SL_PLAYSTATE_PAUSED: {
191cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
192cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         switch(objState) {
193cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_UNINITIALIZED):
194cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             *pObjState = ANDROID_PREPARING;
195cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             avp->prepare();
196cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
197cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_PREPARING):
198cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
199cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_READY):
200cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             avp->pause();
201cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
202cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         default:
203cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             SL_LOGE("Android object in invalid state");
204cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
205cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         }
206cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         }
207cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         break;
208cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     case SL_PLAYSTATE_PLAYING: {
209cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
210cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         switch(objState) {
211cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_UNINITIALIZED):
212cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             *pObjState = ANDROID_PREPARING;
213cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             avp->prepare();
214cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             // intended fall through
215cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_PREPARING):
216cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             // intended fall through
217cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         case(ANDROID_READY):
218cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             avp->play();
219cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
220cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         default:
221cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             SL_LOGE("Android object in invalid state");
222cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten             break;
223cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         }
224cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         }
225cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         break;
226cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     default:
227cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         // checked by caller, should not happen
228cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten         break;
229cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten     }
230cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
231cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    return result;
232cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
233cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
234cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
235cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten//-----------------------------------------------------------------------------
236cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
237cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastenvoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
238cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    if (mp->mAVPlayer != 0) {
239cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
240cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
241cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
242cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
243cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
244cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
245cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
246cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
247cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kastenvoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
248cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
249cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    if (mp->mAVPlayer != 0) {
250cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
251cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten        splr->appEnqueue(bufferId, length, event, pData);
252cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten    }
253cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten}
254cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
255cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
256cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten
257cafa51fdd8b3f29ebaa0682070100825a9cce2a8Glenn Kasten