MediaPlayer_to_android.cpp revision d158d31a6bbb06426b71c3d097b7768bc3fb79a3
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"
18d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi#include "android/AndroidBufferQueueSource.h"
19eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "utils/RefBase.h"
20eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "android_prompts.h"
21eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
22581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi//-----------------------------------------------------------------------------
23581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivistatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
24581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi{
25581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    if (NULL == user) {
26581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        return;
27581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    }
28581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
29581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    CMediaPlayer* mp = (CMediaPlayer*) user;
30581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
31581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
32581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    switch(event) {
33581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
3468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    case android::GenericPlayer::kEventPrepared: {
35581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        if (PLAYER_SUCCESS == data1) {
36581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            object_lock_exclusive(&mp->mObject);
37581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
38581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            mp->mAndroidObjState = ANDROID_READY;
39581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            object_unlock_exclusive(&mp->mObject);
40581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        }
41581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        }
42581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        break;
43581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
44581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    default:
45581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
46581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        break;
47581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    }
48581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi}
49581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
50eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
51eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
52d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel TriviXAresult android_Player_checkSourceSink(CMediaPlayer *mp) {
53d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
54d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
55d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
56d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const SLDataSource *pSrc    = &mp->mDataSource.u.mSource;
57d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
58d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
59d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    // format check:
60d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const SLuint32 sourceLocatorType = *(SLuint32 *)pSrc->pLocator;
61d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const SLuint32 sourceFormatType  = *(SLuint32 *)pSrc->pFormat;
62d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const SLuint32 audioSinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator;
63d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    //const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat;
64d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
65d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    // Source check
66d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    switch(sourceLocatorType) {
67d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
68d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: {
69d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        switch (sourceFormatType) {
70d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        case XA_DATAFORMAT_MIME: {
71d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi            SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pSrc->pFormat;
72d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi            if (SL_CONTAINERTYPE_MPEG_TS != df_mime->containerType) {
73d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
74d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                        "that is not fed MPEG-2 TS data");
75d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
76d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi            }
77d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        } break;
78d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        default:
79d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi            SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
80d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                    "without SL_DATAFORMAT_MIME format");
81d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi            return XA_RESULT_CONTENT_UNSUPPORTED;
82d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        }
83d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    } break;
84d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
85d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    case XA_DATALOCATOR_URI: // intended fall-through
86d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    case XA_DATALOCATOR_ANDROIDFD:
87d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        break;
88d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
89d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    default:
90d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        SL_LOGE("Cannot create media player with data locator type 0x%x",
91d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                (unsigned) sourceLocatorType);
92d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
93d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    }// switch (locatorType)
94d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
95d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    // Audio sink check: only playback is supported here
96d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    switch(audioSinkLocatorType) {
97d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
98d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    case XA_DATALOCATOR_OUTPUTMIX:
99d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        break;
100d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
101d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    default:
102d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        SL_LOGE("Cannot create media player with audio sink data locator of type 0x%x",
103d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                (unsigned) audioSinkLocatorType);
104d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        return XA_RESULT_PARAMETER_INVALID;
105d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    }// switch (locaaudioSinkLocatorTypeorType)
106d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
107d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    return result;
108d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi}
109d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
110d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
111d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi//-----------------------------------------------------------------------------
112eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel TriviXAresult android_Player_create(CMediaPlayer *mp) {
113eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
114eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
115eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
116eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify data source
117eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
118eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify audio data sink
119eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
120eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    // FIXME verify image data sink
121eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
122eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
12397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
124eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch(sourceLocator) {
12597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    // FIXME support Android simple buffer queue as well
126f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
127f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        mp->mAndroidObjType = AV_PLR_TS_ABQ;
128eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
129f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_URI: // intended fall-through
13097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
131b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi        mp->mAndroidObjType = AV_PLR_URIFD;
13297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        break;
133f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case XA_DATALOCATOR_ADDRESS: // intended fall-through
134eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
135eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
136eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
137eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
138eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
139eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
140f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
141f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
142f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mSessionId = android::AudioSystem::newAudioSessionId();
143eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
144f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
145f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
146f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
147f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
148f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
149f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    mp->mDirectLevel = 0; // no attenuation
150eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
151eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
152eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
153eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
154eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
155eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
156eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
157eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel TriviXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
158eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    SL_LOGI("android_Player_realize_l(%p)", mp);
159eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
160eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
161eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
162eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
163eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
164eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    AudioPlayback_Parameters ap_params;
165f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.sessionId = mp->mSessionId;
166f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    ap_params.streamType = mp->mStreamType;
167eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcb = NULL;
168eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    ap_params.trackcbUser = NULL;
169eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
170f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    switch(mp->mAndroidObjType) {
171f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi    case AV_PLR_TS_ABQ: {
17268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mp->mAVPlayer = new android::StreamPlayer(&ap_params, true /*hasVideo*/);
173581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
174eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        }
175eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
176b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi    case AV_PLR_URIFD: {
17768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mp->mAVPlayer = new android::LocAVPlayer(&ap_params, true /*hasVideo*/);
17897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
17997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        switch (mp->mDataSource.mLocator.mLocatorType) {
18097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        case XA_DATALOCATOR_URI:
18197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
18297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (const char*)mp->mDataSource.mLocator.mURI.URI);
18397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            break;
18497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        case XA_DATALOCATOR_ANDROIDFD: {
18597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
18697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
18797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (int)mp->mDataSource.mLocator.mFD.fd,
18897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
18997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
19097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    (int64_t)mp->mDataSource.mLocator.mFD.length);
19197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            }
19297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            break;
19397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        default:
19497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
19597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi                    mp->mDataSource.mLocator.mLocatorType);
19697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi            result = XA_RESULT_PARAMETER_INVALID;
19797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        }
19897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        }
19997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        break;
200321f2cffd7dd560bf2e5c898be6953e19bed8496Jean-Michel Trivi    case INVALID_TYPE: // intended fall-through
201eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    default:
202f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
203eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        result = XA_RESULT_PARAMETER_INVALID;
204eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        break;
205eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
206eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
207eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
208eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
209eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
21097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//-----------------------------------------------------------------------------
21197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviXAresult android_Player_destroy(CMediaPlayer *mp) {
21297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    SL_LOGI("android_Player_destroy(%p)", mp);
21397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
21497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
21597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
21697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi        mp->mAVPlayer.clear();
21797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    }
21897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
21997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    return result;
22097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
221eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
222eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
223f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi/**
2240e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi * pre-conditions: avp != NULL, surface != NULL
2250e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi */
22668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviXAresult android_Player_setVideoSurface(android::GenericMediaPlayer *avp, void* surface) {
2270e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
2280e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2290e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    avp->setVideoSurface(surface);
2300e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2310e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    return result;
2320e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi}
2330e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2340e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2350e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi//-----------------------------------------------------------------------------
2360e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi/**
237f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi * pre-condition: avp != NULL
238f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi */
23968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviXAresult android_Player_setPlayState(android::GenericPlayer *avp, SLuint32 playState,
240581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        AndroidObject_state* pObjState)
241eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi{
242eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
243581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    AndroidObject_state objState = *pObjState;
244eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
245eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch (playState) {
246eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_STOPPED: {
247f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
248f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         avp->stop();
24997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
25097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
251eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PAUSED: {
252f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
253eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
254eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
255581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
256f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->prepare();
257581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
258eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
259eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
260eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
261f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->pause();
262581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
263eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
264f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
265eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
266eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
26797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
26897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
269eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PLAYING: {
270f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
271eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
272eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
273581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
274581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             avp->prepare();
275581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
276eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
277581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
278eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
279f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->play();
280581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
281eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
282f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
283eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
284eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
28597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
28697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
287eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     default:
288eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         // checked by caller, should not happen
289eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         break;
290eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     }
291eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
292eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
293eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
294eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
295eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
296eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
297d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
298d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
299eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
300eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
301eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
302eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
303d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get());
304d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        splr->registerQueueCallback(
305d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                mp->mAndroidBufferQueue.mCallback,
306d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                abqSrc_callBack_pullFromBuffQueue,
307d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                (const void*)mp, false /*userIsAudioPlayer*/,
308eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
309d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
310eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
311eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
312eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
313eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
314eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
315d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        SLuint32 bufferId, SLuint32 length, SLuint32 event, void *pData) {
316eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
317eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
318eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->appEnqueue(bufferId, length, event, pData);
319eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
320eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
321eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
322eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
323eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
324