MediaPlayer_to_android.cpp revision 97876858aa17c7f24c6a1d60be09a57bc1824ba3
1a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey/*
2a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * Copyright (C) 2010 The Android Open Source Project
3a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey *
4a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * you may not use this file except in compliance with the License.
6a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * You may obtain a copy of the License at
7a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey *
8a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey *
10a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * See the License for the specific language governing permissions and
14a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey * limitations under the License.
15a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey */
16a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
17a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey#include "sles_allinclusive.h"
18a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey#include "utils/RefBase.h"
19a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey#include "android_prompts.h"
2063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
21a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey//-----------------------------------------------------------------------------
22a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkeystatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
23a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey{
24a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    if (NULL == user) {
25a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        return;
26a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    }
27a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
28a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    CMediaPlayer* mp = (CMediaPlayer*) user;
29a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
306de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
316de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    switch(event) {
32a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
33a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case android::AVPlayer::kEventPrepared: {
346de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey        if (PLAYER_SUCCESS == data1) {
35a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            object_lock_exclusive(&mp->mObject);
36a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
37a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            mp->mAndroidObjState = ANDROID_READY;
38a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            object_unlock_exclusive(&mp->mObject);
39a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        }
40a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        }
41a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        break;
42a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
43a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    default:
44a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
4563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        break;
46a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    }
47a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey}
48a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
49a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
50a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey//-----------------------------------------------------------------------------
5163abc37356728c0575d6a62a203102ae6d97953bJeff SharkeyXAresult android_Player_create(CMediaPlayer *mp) {
52e7bb71d26943fbb053139e1e34203df4c2afaa9bJeff Sharkey
5363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    XAresult result = XA_RESULT_SUCCESS;
54a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
55a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    // FIXME verify data source
56a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
57a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    // FIXME verify audio data sink
58a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
59a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    // FIXME verify image data sink
60a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
61a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
62a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
63a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    switch(sourceLocator) {
64a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    // FIXME support Android simple buffer queue as well
65a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
66a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        mp->mAndroidObjType = AV_PLR_TS_ABQ;
67a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        break;
68a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case XA_DATALOCATOR_URI: // intended fall-through
69a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case SL_DATALOCATOR_ANDROIDFD:
70a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        mp->mAndroidObjType = AV_PLR_URI_FD;
71a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        break;
72a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case XA_DATALOCATOR_ADDRESS: // intended fall-through
73a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    default:
74a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
75a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        result = XA_RESULT_PARAMETER_INVALID;
76a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        break;
77a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    }
78a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
79a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
8063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
8163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mSessionId = android::AudioSystem::newAudioSessionId();
8263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
8463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
8563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
8663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
8763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
8863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    mp->mDirectLevel = 0; // no attenuation
89a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
90a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    return result;
91a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey}
92a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
93a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
94a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey//-----------------------------------------------------------------------------
95a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
96a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff SharkeyXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
97a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    SL_LOGI("android_Player_realize_l(%p)", mp);
98a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    XAresult result = XA_RESULT_SUCCESS;
99a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
100a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
101a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
102a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
103a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    AudioPlayback_Parameters ap_params;
104a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    ap_params.sessionId = mp->mSessionId;
105a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    ap_params.streamType = mp->mStreamType;
106a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    ap_params.trackcb = NULL;
107a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    ap_params.trackcbUser = NULL;
108a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
109a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    switch(mp->mAndroidObjType) {
110a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case AV_PLR_TS_ABQ: {
111a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        mp->mAVPlayer = new android::StreamPlayer(&ap_params);
11263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
11363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
114a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        break;
115a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    case AV_PLR_URI_FD: {
116a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        mp->mAVPlayer = new android::LocAVPlayer(&ap_params);
117a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
118a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        switch (mp->mDataSource.mLocator.mLocatorType) {
119a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        case XA_DATALOCATOR_URI:
120a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
121a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                    (const char*)mp->mDataSource.mLocator.mURI.URI);
12263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            break;
12363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        case XA_DATALOCATOR_ANDROIDFD: {
124a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
125a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
126a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                    (int)mp->mDataSource.mLocator.mFD.fd,
127a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
128a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
129a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                    (int64_t)mp->mDataSource.mLocator.mFD.length);
130a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            }
131a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            break;
132a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        default:
133a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
134a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey                    mp->mDataSource.mLocator.mLocatorType);
135a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey            result = XA_RESULT_PARAMETER_INVALID;
13663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
13763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
13863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        break;
13963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case INVALID_TYPE: // intended fall-through
14063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    default:
1416de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
1426de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey        result = XA_RESULT_PARAMETER_INVALID;
1436de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey        break;
1446de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    }
1456de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1466de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    return result;
1476de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey}
1486de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1496de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey//-----------------------------------------------------------------------------
1506de357e4d10fa5977ab9a6c665dc858765e95d34Jeff SharkeyXAresult android_Player_destroy(CMediaPlayer *mp) {
1516de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    SL_LOGI("android_Player_destroy(%p)", mp);
1526de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    XAresult result = XA_RESULT_SUCCESS;
1536de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1546de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    if (mp->mAVPlayer != 0) {
1556de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey        mp->mAVPlayer.clear();
1566de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    }
1576de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1586de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    return result;
15963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
1606de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1616de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey//-----------------------------------------------------------------------------
1626de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey/**
1636de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey * pre-conditions: avp != NULL, surface != NULL
1646de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey */
1656de357e4d10fa5977ab9a6c665dc858765e95d34Jeff SharkeyXAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) {
1666de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    XAresult result = XA_RESULT_SUCCESS;
1676de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1686de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    avp->setVideoSurface(surface);
1696de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
1706de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey    return result;
1716de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey}
1726de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
17363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
17463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey//-----------------------------------------------------------------------------
17563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/**
17663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * pre-condition: avp != NULL
17763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */
17863abc37356728c0575d6a62a203102ae6d97953bJeff SharkeyXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
17963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        AndroidObject_state* pObjState)
180a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey{
18163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    XAresult result = XA_RESULT_SUCCESS;
182a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    AndroidObject_state objState = *pObjState;
183a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
18463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    switch (playState) {
18563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     case SL_PLAYSTATE_STOPPED: {
18663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
18763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         avp->stop();
18863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         }
18963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         break;
19063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     case SL_PLAYSTATE_PAUSED: {
1916de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
19263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         switch(objState) {
19363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_UNINITIALIZED):
19463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             *pObjState = ANDROID_PREPARING;
19563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             avp->prepare();
1966de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey             break;
19763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_PREPARING):
19863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             break;
19963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_READY):
200a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey             avp->pause();
2016de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey             break;
20263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         default:
20363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             SL_LOGE("Android object in invalid state");
20463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             break;
20563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         }
2066de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey         }
20763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         break;
20863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     case SL_PLAYSTATE_PLAYING: {
20963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
21063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         switch(objState) {
21163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_UNINITIALIZED):
21263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             *pObjState = ANDROID_PREPARING;
21363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             avp->prepare();
21463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             // intended fall through
21563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_PREPARING):
21663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             // intended fall through
21763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         case(ANDROID_READY):
21863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             avp->play();
21963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             break;
22063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         default:
22163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             SL_LOGE("Android object in invalid state");
22263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey             break;
22363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         }
22463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         }
22563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         break;
22663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     default:
22763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         // checked by caller, should not happen
22863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey         break;
22963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey     }
23063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
23163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    return result;
23263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
23363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
23463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
23563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey//-----------------------------------------------------------------------------
236a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
237a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkeyvoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
23863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    if (mp->mAVPlayer != 0) {
23963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
240a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
241a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
24263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
24363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
24463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
24563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
246a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
247a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkeyvoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
24863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
249a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey    if (mp->mAVPlayer != 0) {
250a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
251a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey        splr->appEnqueue(bufferId, length, event, pData);
25263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
253a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey}
254a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
255a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey
2566de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey
257a27a3e8ad7d20dea63ef2d5cb8b6ec7e56c20a89Jeff Sharkey