MediaPlayer_to_android.cpp revision e7bfcdc183454ec959ff51342f0973cabba219b2
115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek/*
215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Copyright (C) 2010 The Android Open Source Project
315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek *
415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Licensed under the Apache License, Version 2.0 (the "License");
515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * you may not use this file except in compliance with the License.
615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * You may obtain a copy of the License at
715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek *
815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek *      http://www.apache.org/licenses/LICENSE-2.0
915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek *
1015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * Unless required by applicable law or agreed to in writing, software
1115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * distributed under the License is distributed on an "AS IS" BASIS,
1215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * See the License for the specific language governing permissions and
1415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * limitations under the License.
1515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek */
1615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
1715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "sles_allinclusive.h"
1815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "utils/RefBase.h"
1915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek#include "android_prompts.h"
2015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
2115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
2215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
2315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekstatic void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
2415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek{
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (NULL == user) {
2615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return;
2715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }
2815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
2915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    CMediaPlayer* mp = (CMediaPlayer*) user;
3015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
3115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
3215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    switch(event) {
3315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
3415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case android::GenericPlayer::kEventPrepared: {
3515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if (PLAYER_SUCCESS == data1) {
3615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            object_lock_exclusive(&mp->mObject);
3715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
3815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            mp->mAndroidObjState = ANDROID_READY;
3915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            object_unlock_exclusive(&mp->mObject);
4015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        }
419a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        }
429a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        break;
4315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
4415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    default:
459a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
469a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        break;
4715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }
4815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek}
4915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
5015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
5115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
5215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_checkSourceSink(CMediaPlayer *mp) {
5315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
5415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    XAresult result = XA_RESULT_SUCCESS;
5515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
5615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLDataSource *pSrc    = &mp->mDataSource.u.mSource;
5715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
5815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
5915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // format check:
6015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLuint32 sourceLocatorType = *(SLuint32 *)pSrc->pLocator;
6115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLuint32 sourceFormatType  = *(SLuint32 *)pSrc->pFormat;
6215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLuint32 audioSinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator;
6315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    //const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat;
6415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
6515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // Source check
6615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    switch(sourceLocatorType) {
6715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
6815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE: {
6915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        switch (sourceFormatType) {
7015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        case XA_DATAFORMAT_MIME: {
7115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pSrc->pFormat;
7215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            if (SL_CONTAINERTYPE_MPEG_TS != df_mime->containerType) {
7315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
7415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        "that is not fed MPEG-2 TS data");
7515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                return SL_RESULT_CONTENT_UNSUPPORTED;
7615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            }
7715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        } break;
7815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        default:
7915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            SL_LOGE("Cannot create player with XA_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
8015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    "without SL_DATAFORMAT_MIME format");
8115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            return XA_RESULT_CONTENT_UNSUPPORTED;
8215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        }
8315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    } break;
8415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
8515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_URI: // intended fall-through
8615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_ANDROIDFD:
8715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
8815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
8915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    default:
9015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        SL_LOGE("Cannot create media player with data locator type 0x%x",
9115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                (unsigned) sourceLocatorType);
9215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return SL_RESULT_PARAMETER_INVALID;
9315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }// switch (locatorType)
9415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
9515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // Audio sink check: only playback is supported here
9615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    switch(audioSinkLocatorType) {
9715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
9815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_OUTPUTMIX:
9915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
10015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
10115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    default:
10215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        SL_LOGE("Cannot create media player with audio sink data locator of type 0x%x",
10315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                (unsigned) audioSinkLocatorType);
10415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return XA_RESULT_PARAMETER_INVALID;
10515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }// switch (locaaudioSinkLocatorTypeorType)
10615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
10715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    return result;
10815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek}
10915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
11015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
11115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
11215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_create(CMediaPlayer *mp) {
11315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
11415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    XAresult result = XA_RESULT_SUCCESS;
11515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
11615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // FIXME verify data source
11715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
11815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // FIXME verify audio data sink
11915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
12015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // FIXME verify image data sink
12115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
12215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
12315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
12415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    switch(sourceLocator) {
12515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    // FIXME support Android simple buffer queue as well
12615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
12715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAndroidObjType = AV_PLR_TS_ABQ;
12815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
12915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case XA_DATALOCATOR_URI: // intended fall-through
13015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case SL_DATALOCATOR_ANDROIDFD:
13115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAndroidObjType = AV_PLR_URIFD;
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case XA_DATALOCATOR_ADDRESS: // intended fall-through
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    default:
13515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
13615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        result = XA_RESULT_PARAMETER_INVALID;
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
13815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }
13915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
14015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
14115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
14215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mSessionId = android::AudioSystem::newAudioSessionId();
14315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
14415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
14515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
14615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
14715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
14815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
14915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    mp->mDirectLevel = 0; // no attenuation
15015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
15115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    return result;
15215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek}
15315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
15415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
15515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
15622d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
15722d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel KlimekXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
15822d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    SL_LOGI("android_Player_realize_l(%p)", mp);
15922d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    XAresult result = XA_RESULT_SUCCESS;
16022d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek
16122d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
16222d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
16322d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek
16422d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    AudioPlayback_Parameters ap_params;
16522d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    ap_params.sessionId = mp->mSessionId;
16615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    ap_params.streamType = mp->mStreamType;
16715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    ap_params.trackcb = NULL;
16815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    ap_params.trackcbUser = NULL;
16915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
17015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    switch(mp->mAndroidObjType) {
17115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case AV_PLR_TS_ABQ: {
17215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAVPlayer = new android::StreamPlayer(&ap_params, true /*hasVideo*/);
17315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
17415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        }
17515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
17615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case AV_PLR_URIFD: {
17715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAVPlayer = new android::LocAVPlayer(&ap_params, true /*hasVideo*/);
17815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
17915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        switch (mp->mDataSource.mLocator.mLocatorType) {
18015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        case XA_DATALOCATOR_URI:
18115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
18215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    (const char*)mp->mDataSource.mLocator.mURI.URI);
18315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            break;
18415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        case XA_DATALOCATOR_ANDROIDFD: {
18515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
18615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
18715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    (int)mp->mDataSource.mLocator.mFD.fd,
18815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
18915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
19015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    (int64_t)mp->mDataSource.mLocator.mFD.length);
19115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            }
19215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            break;
19315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        default:
19415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
19515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    mp->mDataSource.mLocator.mLocatorType);
19615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            result = XA_RESULT_PARAMETER_INVALID;
19715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        }
19815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        }
19915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
20015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    case INVALID_TYPE: // intended fall-through
20115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    default:
20215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
20315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        result = XA_RESULT_PARAMETER_INVALID;
20415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        break;
20515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }
20615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
20715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    return result;
20815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek}
20915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
21015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
21115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekXAresult android_Player_destroy(CMediaPlayer *mp) {
21215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    SL_LOGI("android_Player_destroy(%p)", mp);
21315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    XAresult result = XA_RESULT_SUCCESS;
21415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
21515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    if (mp->mAVPlayer != 0) {
21615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        mp->mAVPlayer.clear();
21715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    }
21815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
21915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    return result;
22015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek}
22115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
22215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek//-----------------------------------------------------------------------------
22315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek/**
22415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek * pre-conditions: avp != NULL, surface != NULL
225 */
226XAresult android_Player_setVideoSurface(android::GenericMediaPlayer *avp,
227        const android::sp<android::Surface> &surface) {
228    XAresult result = XA_RESULT_SUCCESS;
229
230    avp->setVideoSurface(surface);
231
232    return result;
233}
234
235
236/**
237 * pre-conditions: avp != NULL, surfaceTexture != NULL
238 */
239XAresult android_Player_setVideoSurfaceTexture(android::GenericMediaPlayer *avp,
240        const android::sp<android::ISurfaceTexture> &surfaceTexture) {
241    XAresult result = XA_RESULT_SUCCESS;
242
243    avp->setVideoSurfaceTexture(surfaceTexture);
244
245    return result;
246}
247
248
249XAresult android_Player_getDuration(IPlay *pPlayItf, XAmillisecond *pDurMsec) {
250    XAresult result = XA_RESULT_SUCCESS;
251    CMediaPlayer *avp = (CMediaPlayer *)pPlayItf->mThis;
252
253    switch (avp->mAndroidObjType) {
254
255    case AV_PLR_TS_ABQ: // intended fall-through
256    case AV_PLR_URIFD: {
257        // FIXME implement for a MediaPlayer playing on URI or FD (on LocAVPlayer, returns -1)
258        int dur = -1;
259        if (avp->mAVPlayer != 0) {
260            avp->mAVPlayer->getDurationMsec(&dur);
261        }
262        if (dur < 0) {
263            *pDurMsec = SL_TIME_UNKNOWN;
264        } else {
265            *pDurMsec = (XAmillisecond)dur;
266        }
267    } break;
268
269    default:
270        *pDurMsec = XA_TIME_UNKNOWN;
271        break;
272    }
273
274    return result;
275}
276
277//-----------------------------------------------------------------------------
278/**
279 * pre-condition: avp != NULL
280 */
281XAresult android_Player_setPlayState(android::GenericPlayer *avp, SLuint32 playState,
282        AndroidObject_state* pObjState)
283{
284    XAresult result = XA_RESULT_SUCCESS;
285    AndroidObject_state objState = *pObjState;
286
287    switch (playState) {
288     case SL_PLAYSTATE_STOPPED: {
289         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
290         avp->stop();
291         }
292         break;
293     case SL_PLAYSTATE_PAUSED: {
294         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
295         switch(objState) {
296         case ANDROID_UNINITIALIZED:
297             *pObjState = ANDROID_PREPARING;
298             avp->prepare();
299             break;
300         case ANDROID_PREPARING:
301             break;
302         case ANDROID_READY:
303             avp->pause();
304             break;
305         default:
306             SL_LOGE("Android object in invalid state");
307             break;
308         }
309         }
310         break;
311     case SL_PLAYSTATE_PLAYING: {
312         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
313         switch(objState) {
314         case ANDROID_UNINITIALIZED:
315             *pObjState = ANDROID_PREPARING;
316             avp->prepare();
317             // intended fall through
318         case ANDROID_PREPARING:
319             // intended fall through
320         case ANDROID_READY:
321             avp->play();
322             break;
323         default:
324             SL_LOGE("Android object in invalid state");
325             break;
326         }
327         }
328         break;
329     default:
330         // checked by caller, should not happen
331         break;
332     }
333
334    return result;
335}
336
337
338//-----------------------------------------------------------------------------
339void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
340    if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) {
341        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
342        android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get());
343        splr->registerQueueCallback(
344                (const void*)mp, false /*userIsAudioPlayer*/,
345                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
346
347    }
348}
349
350
351void android_Player_androidBufferQueue_clear_l(CMediaPlayer *mp) {
352    if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) {
353        android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get());
354        splr->appClear_l();
355    }
356}
357
358
359void android_Player_androidBufferQueue_onRefilled_l(CMediaPlayer *mp) {
360    if ((mp->mAndroidObjType == AV_PLR_TS_ABQ) && (mp->mAVPlayer != 0)) {
361        android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(mp->mAVPlayer.get());
362        splr->queueRefilled_l();
363    }
364}
365
366
367
368