MediaPlayer_to_android.cpp revision ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8
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 */
226ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn KastenXAresult android_Player_setVideoSurface(android::GenericMediaPlayer *avp,
227ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        const android::sp<android::Surface> &surface) {
2280e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
2290e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2300e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    avp->setVideoSurface(surface);
2310e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2320e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi    return result;
2330e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi}
2340e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
2350e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi
236ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten/**
237ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten * pre-conditions: avp != NULL, surfaceTexture != NULL
238ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten */
239ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn KastenXAresult android_Player_setVideoSurfaceTexture(android::GenericMediaPlayer *avp,
240ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        const android::sp<android::ISurfaceTexture> &surfaceTexture) {
241ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    XAresult result = XA_RESULT_SUCCESS;
242ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
243ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    avp->setVideoSurfaceTexture(surfaceTexture);
244ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
245ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    return result;
246ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten}
247ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
248ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
2490e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi//-----------------------------------------------------------------------------
2500e47a0657162bbff48886ea2f5c68d9edb607768Jean-Michel Trivi/**
251f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi * pre-condition: avp != NULL
252f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi */
25368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviXAresult android_Player_setPlayState(android::GenericPlayer *avp, SLuint32 playState,
254581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi        AndroidObject_state* pObjState)
255eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi{
256eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    XAresult result = XA_RESULT_SUCCESS;
257581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    AndroidObject_state objState = *pObjState;
258eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
259eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    switch (playState) {
260eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_STOPPED: {
261f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
262f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         avp->stop();
26397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
26497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
265eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PAUSED: {
266f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
267eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
268eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
269581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
270f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->prepare();
271581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
272eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
273eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
274eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
275f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->pause();
276581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
277eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
278f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
279eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
280eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
28197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
28297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
283eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     case SL_PLAYSTATE_PLAYING: {
284f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
285eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         switch(objState) {
286eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_UNINITIALIZED):
287581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             *pObjState = ANDROID_PREPARING;
288581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             avp->prepare();
289581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
290eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_PREPARING):
291581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             // intended fall through
292eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         case(ANDROID_READY):
293f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             avp->play();
294581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi             break;
295eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         default:
296f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi             SL_LOGE("Android object in invalid state");
297eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi             break;
298eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         }
29997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         }
30097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi         break;
301eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     default:
302eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         // checked by caller, should not happen
303eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi         break;
304eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi     }
305eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
306eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    return result;
307eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
308eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
309eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
310eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi//-----------------------------------------------------------------------------
311d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
312d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
313eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
314eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
315eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
316eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
317d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get());
318d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        splr->registerQueueCallback(
319d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                mp->mAndroidBufferQueue.mCallback,
320d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                abqSrc_callBack_pullFromBuffQueue,
321d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                (const void*)mp, false /*userIsAudioPlayer*/,
322eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
323d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
324eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
325eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
326eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
327eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
328eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivivoid android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
329d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        SLuint32 bufferId, SLuint32 length, SLuint32 event, void *pData) {
330eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    if (mp->mAVPlayer != 0) {
331eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
332eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi        splr->appEnqueue(bufferId, length, event, pData);
333eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi    }
334eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
335eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
336eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
337eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
338