mediaplayer.cpp revision 071437a2005e39969983ec619a4c7bc54c2dc5a9
199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2006, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "MediaPlayer"
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn#include <fcntl.h>
2234fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn#include <inttypes.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/stat.h>
2434fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn#include <sys/types.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <unistd.h>
2634fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn
2734fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn#include <utils/Log.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
297562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h>
307562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IPCThreadState.h>
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32b1e7cd156ca3e1747374e0d20cdd1ce467210453Mathias Agopian#include <gui/Surface.h>
3361c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediaplayer.h>
353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AudioResamplerPublic.h>
36a3f1fa308728976fc9ca1b4f37d26e633b32b9acGlenn Kasten#include <media/AudioSystem.h>
373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AVSyncSettings.h>
3899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/IDataSource.h>
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
407562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/MemoryBase.h>
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
422db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber#include <utils/KeyedVector.h>
432db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber#include <utils/String8.h>
442db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
4564760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
4661c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis#include <system/window.h>
47fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayer::MediaPlayer()
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("constructor");
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = NULL;
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCookie = NULL;
55fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    mStreamType = AUDIO_STREAM_MUSIC;
56640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    mAudioAttributesParcel = NULL;
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentPosition = -1;
58c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    mCurrentSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mSeekPosition = -1;
60c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_PLAYER_IDLE;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = false;
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareStatus = NO_ERROR;
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = false;
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLeftVolume = mRightVolume = 1.0;
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mVideoWidth = mVideoHeight = 0;
671af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = 0;
68d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    mAudioSessionId = (audio_session_t) AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
69d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    AudioSystem::acquireAudioSessionId(mAudioSessionId, -1);
708c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent    mSendLevel = 0;
71c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid = false;
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayer::~MediaPlayer()
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destructor");
77640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    if (mAudioAttributesParcel != NULL) {
78640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        delete mAudioAttributesParcel;
79640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel = NULL;
80640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    }
81d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    disconnect();
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IPCThreadState::self()->flushCommands();
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayer::disconnect()
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("disconnect");
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaPlayer> p;
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mLock);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p = mPlayer;
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer.clear();
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (p != 0) {
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p->disconnect();
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// always call with lock held
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayer::clear_l()
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentPosition = -1;
105c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    mCurrentSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mSeekPosition = -1;
107c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mVideoWidth = mVideoHeight = 0;
109c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid = false;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setListener(const sp<MediaPlayerListener>& listener)
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
121d681bbb1767bed09415e050ba78975df214bcd68Dave Burkestatus_t MediaPlayer::attachNewPlayer(const sp<IMediaPlayer>& player)
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = UNKNOWN_ERROR;
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaPlayer> p;
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    { // scope for the lock
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mLock);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12883ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen        if ( !( (mCurrentState & MEDIA_PLAYER_IDLE) ||
12983ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen                (mCurrentState == MEDIA_PLAYER_STATE_ERROR ) ) ) {
13029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("attachNewPlayer called in state %d", mCurrentState);
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return INVALID_OPERATION;
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        clear_l();
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p = mPlayer;
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer = player;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (player != 0) {
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_INITIALIZED;
139ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia            player->getDefaultBufferingSettings(&mCurrentBufferingSettings);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            err = NO_ERROR;
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
142ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia            mCurrentBufferingSettings = BufferingSettings();
143f65fa170b28f97503df3c309ecdaab377a042ba6Masaki Muranaka            ALOGE("Unable to create media player");
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (p != 0) {
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p->disconnect();
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1542db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t MediaPlayer::setDataSource(
1551b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
1562db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        const char *url, const KeyedVector<String8, String8> *headers)
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource(%s)", url);
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = BAD_VALUE;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (url != NULL) {
161fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen        const sp<IMediaPlayerService> service(getMediaPlayerService());
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (service != 0) {
163f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
164c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
1651b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                (NO_ERROR != player->setDataSource(httpService, url, headers))) {
1660662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke                player.clear();
167d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
1680662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            err = attachNewPlayer(player);
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17634fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn    ALOGV("setDataSource(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length);
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = UNKNOWN_ERROR;
178fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen    const sp<IMediaPlayerService> service(getMediaPlayerService());
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != 0) {
180f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
181c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
182c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            (NO_ERROR != player->setDataSource(fd, offset, length))) {
1830662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            player.clear();
184d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
1850662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke        err = attachNewPlayer(player);
186d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
187d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    return err;
188d681bbb1767bed09415e050ba78975df214bcd68Dave Burke}
189d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
19099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstatus_t MediaPlayer::setDataSource(const sp<IDataSource> &source)
19199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins{
19299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    ALOGV("setDataSource(IDataSource)");
19399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t err = UNKNOWN_ERROR;
194fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen    const sp<IMediaPlayerService> service(getMediaPlayerService());
19599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    if (service != 0) {
19699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
19799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
19899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            (NO_ERROR != player->setDataSource(source))) {
19999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            player.clear();
20099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
20199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        err = attachNewPlayer(player);
20299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
20399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    return err;
20499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}
20599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2061d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniastatus_t MediaPlayer::invoke(const Parcel& request, Parcel *reply)
2071d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania{
2081d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    Mutex::Autolock _l(mLock);
2094023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    const bool hasBeenInitialized =
2104023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            (mCurrentState != MEDIA_PLAYER_STATE_ERROR) &&
2114023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            ((mCurrentState & MEDIA_PLAYER_IDLE) != MEDIA_PLAYER_IDLE);
2124023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    if ((mPlayer != NULL) && hasBeenInitialized) {
21334fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn        ALOGV("invoke %zu", request.dataSize());
214e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->invoke(request, reply);
2151d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
216848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("invoke failed: wrong state %X, mPlayer(%p)", mCurrentState, mPlayer.get());
2171d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    return INVALID_OPERATION;
2181d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania}
2191d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
220a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniastatus_t MediaPlayer::setMetadataFilter(const Parcel& filter)
221a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{
222b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("setMetadataFilter");
2238e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2248e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
225a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return NO_INIT;
226a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
227a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    return mPlayer->setMetadataFilter(filter);
228a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania}
2291d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
2308e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Cataniastatus_t MediaPlayer::getMetadata(bool update_only, bool apply_filter, Parcel *metadata)
2318e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania{
232b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("getMetadata");
2338e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2348e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
2358e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return NO_INIT;
2368e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
2378e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    return mPlayer->getMetadata(update_only, apply_filter, metadata);
2388e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania}
2398e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
2401173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t MediaPlayer::setVideoSurfaceTexture(
241484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer)
2421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten{
2433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSurfaceTexture");
2441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock _l(mLock);
2451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mPlayer == 0) return NO_INIT;
246484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden    return mPlayer->setVideoSurfaceTexture(bufferProducer);
2471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
2481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
249dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jiastatus_t MediaPlayer::getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
250dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia{
251dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    ALOGV("getDefaultBufferingSettings");
252dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
253dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    Mutex::Autolock _l(mLock);
254dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    if (mPlayer == 0) {
255dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia        return NO_INIT;
256dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    }
257dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    return mPlayer->getDefaultBufferingSettings(buffering);
258dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia}
259dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
260ed32086f6a93a9a22f3877c54030af5c2567939aWei Jiastatus_t MediaPlayer::getBufferingSettings(BufferingSettings* buffering /* nonnull */)
261ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia{
262ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    ALOGV("getBufferingSettings");
263ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia
264ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    Mutex::Autolock _l(mLock);
265ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    if (mPlayer == 0) {
266ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia        return NO_INIT;
267ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    }
268ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    *buffering = mCurrentBufferingSettings;
269ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    return NO_ERROR;
270ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia}
271ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia
272dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jiastatus_t MediaPlayer::setBufferingSettings(const BufferingSettings& buffering)
273dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia{
274dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    ALOGV("setBufferingSettings");
275dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
276dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    Mutex::Autolock _l(mLock);
277dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    if (mPlayer == 0) {
278dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia        return NO_INIT;
279dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    }
280ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    status_t err =  mPlayer->setBufferingSettings(buffering);
281ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    if (err == NO_ERROR) {
282ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia        mCurrentBufferingSettings = buffering;
283ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    }
284ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia    return err;
285dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia}
286dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// must call with lock held
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync_l()
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
290b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ( (mPlayer != 0) && ( mCurrentState & (MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {
291640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) {
292640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi            mPlayer->setParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES, *mAudioAttributesParcel);
2934356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        } else {
2944356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent            mPlayer->setAudioStreamType(mStreamType);
295640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARING;
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->prepareAsync();
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
299848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("prepareAsync called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// TODO: In case of error, prepareAsync provides the caller with 2 error codes,
30465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// one defined in the Android framework and one provided by the implementation
30565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// that generated the error. The sync version of prepare returns only 1 error
30665e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// code.
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepare()
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
3111af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = getThreadId();
3121af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (mPrepareSync) {
3131af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
3141af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return -EALREADY;
3151af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = true;
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = prepareAsync_l();
3181af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (ret != NO_ERROR) {
3191af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
3201af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return ret;
3211af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPrepareSync) {
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSignal.wait(mLock);  // wait for prepare done
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPrepareSync = false;
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare complete - status=%d", mPrepareStatus);
3281af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = 0;
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mPrepareStatus;
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync()
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepareAsync");
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return prepareAsync_l();
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::start()
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
342d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
343d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    status_t ret = NO_ERROR;
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
345d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
346d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = getThreadId();
347d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
348d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    if (mCurrentState & MEDIA_PLAYER_STARTED) {
349d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = NO_ERROR;
350d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setLooping(mLoop);
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setVolume(mLeftVolume, mRightVolume);
3542beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        mPlayer->setAuxEffectSendLevel(mSendLevel);
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STARTED;
356d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = mPlayer->start();
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
3613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("playback completed immediately following start()");
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
364d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else {
365848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia        ALOGE("start called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
366d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = INVALID_OPERATION;
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
368d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
369d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = 0;
370d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
371d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    return ret;
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::stop()
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->stop();
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STOPPED;
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
389848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("stop called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::pause()
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("pause");
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
397698f476590bc9e38d4d1d4155da9efdbedd357c4Marco Nelissen    if (mCurrentState & (MEDIA_PLAYER_PAUSED|MEDIA_PLAYER_PLAYBACK_COMPLETE))
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_ERROR;
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((mPlayer != 0) && (mCurrentState & MEDIA_PLAYER_STARTED)) {
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->pause();
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
408848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("pause called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isPlaying()
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        bool temp = false;
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->isPlaying(&temp);
4183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("isPlaying: %d", temp);
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ((mCurrentState & MEDIA_PLAYER_STARTED) && ! temp) {
42029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("internal/external state mismatch corrected");
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
4223a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } else if ((mCurrentState & MEDIA_PLAYER_PAUSED) && temp) {
4233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            ALOGE("internal/external state mismatch corrected");
4243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return temp;
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isPlaying: no active player");
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4323a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setPlaybackSettings(const AudioPlaybackRate& rate)
4339816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia{
4343a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setPlaybackSettings: %f %f %d %d",
4353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed, rate.mPitch, rate.mFallbackMode, rate.mStretchMode);
4363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // Negative speed and pitch does not make sense. Further validation will
4373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // be done by the respective mediaplayers.
4383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (rate.mSpeed < 0.f || rate.mPitch < 0.f) {
4399816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return BAD_VALUE;
4409816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4419816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    Mutex::Autolock _l(mLock);
4425af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia    if (mPlayer == 0 || (mCurrentState & MEDIA_PLAYER_STOPPED)) {
4435af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia        return INVALID_OPERATION;
4445af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia    }
4455be109faadfc08b561221bd801082873b614b93dWei Jia
4465be109faadfc08b561221bd801082873b614b93dWei Jia    if (rate.mSpeed != 0.f && !(mCurrentState & MEDIA_PLAYER_STARTED)
4475be109faadfc08b561221bd801082873b614b93dWei Jia            && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
4485be109faadfc08b561221bd801082873b614b93dWei Jia                    | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
4495be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setLooping(mLoop);
4505be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setVolume(mLeftVolume, mRightVolume);
4515be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setAuxEffectSendLevel(mSendLevel);
4525be109faadfc08b561221bd801082873b614b93dWei Jia    }
4535be109faadfc08b561221bd801082873b614b93dWei Jia
4543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t err = mPlayer->setPlaybackSettings(rate);
4553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (err == OK) {
4563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (rate.mSpeed == 0.f && mCurrentState == MEDIA_PLAYER_STARTED) {
4573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_PAUSED;
4585be109faadfc08b561221bd801082873b614b93dWei Jia        } else if (rate.mSpeed != 0.f
4595be109faadfc08b561221bd801082873b614b93dWei Jia                && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
4605be109faadfc08b561221bd801082873b614b93dWei Jia                    | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
4613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
4629816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        }
4639816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4643a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return err;
4653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
4683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getPlaybackSettings(rate);
4723a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
4753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setSyncSettings: %u %u %f %f",
4773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource, sync.mAudioAdjustMode, sync.mTolerance, videoFpsHint);
4783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->setSyncSettings(sync, videoFpsHint);
4813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4823a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getSyncSettings(
4843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
4853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getSyncSettings(sync, videoFps);
4899816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia}
4909816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoWidth(int *w)
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoWidth");
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *w = mVideoWidth;
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoHeight(int *h)
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoHeight");
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *h = mVideoHeight;
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getCurrentPosition(int *msec)
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getCurrentPosition");
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mCurrentPosition >= 0) {
5153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Using cached seek position: %d", mCurrentPosition);
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *msec = mCurrentPosition;
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->getCurrentPosition(msec);
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration_l(int *msec)
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
526a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber    ALOGV("getDuration_l");
527b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    bool isValidState = (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
528b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_STOPPED | MEDIA_PLAYER_PLAYBACK_COMPLETE));
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0 && isValidState) {
530a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
531a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t ret = mPlayer->getDuration(&durationMs);
5322070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
5332070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        if (ret != OK) {
5342070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            // Do not enter error state just because no duration was available.
5352070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            durationMs = -1;
5362070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            ret = OK;
5372070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        }
5382070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
539a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec) {
540a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            *msec = durationMs;
541a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
544848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("Attempt to call getDuration in wrong state: mPlayer=%p, mCurrentState=%u",
545848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia            mPlayer.get(), mCurrentState);
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration(int *msec)
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return getDuration_l(msec);
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
555c5de09127e9e0d5df7aa587be317e1487d793245Wei Jiastatus_t MediaPlayer::seekTo_l(int msec, MediaPlayerSeekMode mode)
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
557c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    ALOGV("seekTo (%d, %d)", msec, mode);
558b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
559b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED |  MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ( msec < 0 ) {
5615ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Attempt to seek to invalid position: %d", msec);
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            msec = 0;
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
564a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
565a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
566a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t err = mPlayer->getDuration(&durationMs);
567a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
568a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (err != OK) {
569a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Stream has no duration and is therefore not seekable.");
570a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            return err;
571a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
572a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
573a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec > durationMs) {
574a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Attempt to seek to past end of file: request = %d, "
575a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  "durationMs = %d",
576a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  msec,
577a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  durationMs);
578a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
579a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            msec = durationMs;
580a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
581a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // cache duration
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentPosition = msec;
584c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        mCurrentSeekMode = mode;
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSeekPosition < 0) {
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = msec;
587c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mSeekMode = mode;
588c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            return mPlayer->seekTo(msec, mode);
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
591c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            ALOGV("Seek in progress - queue up seekTo[%d, %d]", msec, mode);
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
595b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(),
596b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            mCurrentState);
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
600c5de09127e9e0d5df7aa587be317e1487d793245Wei Jiastatus_t MediaPlayer::seekTo(int msec, MediaPlayerSeekMode mode)
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6025cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = getThreadId();
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
604c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t result = seekTo_l(msec, mode);
6055cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = 0;
6065cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber
6075cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    return result;
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
61061c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset_l()
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = false;
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState == MEDIA_PLAYER_IDLE) return NO_ERROR;
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = false;
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->reset();
61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
61829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("reset() failed with return code (%d)", ret);
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
6212b95bda111444f2834e64221e3a3eb1a87d43c38Robert Shih            mPlayer->disconnect();
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_IDLE;
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
624a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // setDataSource has to be called again to create a
625a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // new mediaplayer.
626a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        mPlayer = 0;
627ed32086f6a93a9a22f3877c54030af5c2567939aWei Jia        mCurrentBufferingSettings = BufferingSettings();
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    clear_l();
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
634c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::doSetRetransmitEndpoint(const sp<IMediaPlayer>& player) {
635c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
636c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
637c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (player == NULL) {
638c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return UNKNOWN_ERROR;
639c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
640c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
641c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (mRetransmitEndpointValid) {
642c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return player->setRetransmitEndpoint(&mRetransmitEndpoint);
643c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
644c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
645c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
646c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
647c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
64861c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset()
64961c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis{
6503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
65161c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    Mutex::Autolock _l(mLock);
65261c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    return reset_l();
65361c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis}
65461c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis
655fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t MediaPlayer::setAudioStreamType(audio_stream_type_t type)
65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioStreamType");
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mStreamType == type) return NO_ERROR;
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) {
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Can't change the stream type after prepare
66329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioStream called in state %d", mCurrentState);
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // cache
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mStreamType = type;
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
671de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlockstatus_t MediaPlayer::getAudioStreamType(audio_stream_type_t *type)
672de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock{
673de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    ALOGV("getAudioStreamType");
674de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    Mutex::Autolock _l(mLock);
675de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    *type = mStreamType;
676de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    return OK;
677de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock}
678de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock
67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setLooping(int loop)
68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setLooping");
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = (loop != 0);
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setLooping(loop);
68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isLooping() {
6913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping");
69289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mLoop;
69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping: no active player");
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setVolume(float leftVolume, float rightVolume)
70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setVolume(%f, %f)", leftVolume, rightVolume);
70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
70489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLeftVolume = leftVolume;
70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mRightVolume = rightVolume;
70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setVolume(leftVolume, rightVolume);
70889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
70989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
712d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenstatus_t MediaPlayer::setAudioSessionId(audio_session_t sessionId)
713a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
7143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioSessionId(%d)", sessionId);
715a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
716a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (!(mCurrentState & MEDIA_PLAYER_IDLE)) {
71729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioSessionId called in state %d", mCurrentState);
718a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return INVALID_OPERATION;
719a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
720a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (sessionId < 0) {
721a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return BAD_VALUE;
722a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
7233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    if (sessionId != mAudioSessionId) {
724d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::acquireAudioSessionId(sessionId, -1);
725d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
726e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        mAudioSessionId = sessionId;
7273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
728a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return NO_ERROR;
729a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
730a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
731d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenaudio_session_t MediaPlayer::getAudioSessionId()
732a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
733a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
734a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return mAudioSessionId;
735a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
736a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
7372beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::setAuxEffectSendLevel(float level)
7382beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
7393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAuxEffectSendLevel(%f)", level);
7402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
7412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    mSendLevel = level;
7422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer != 0) {
7432beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return mPlayer->setAuxEffectSendLevel(level);
7442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
7452beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return OK;
7462beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7472beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7482beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::attachAuxEffect(int effectId)
7492beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
7503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::attachAuxEffect(%d)", effectId);
7512beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
7522beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer == 0 ||
7532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState & MEDIA_PLAYER_IDLE) ||
7542beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState == MEDIA_PLAYER_STATE_ERROR )) {
755848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia        ALOGE("attachAuxEffect called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
7562beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return INVALID_OPERATION;
7572beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
7582beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7592beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return mPlayer->attachAuxEffect(effectId);
7602beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7612beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
762d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi// always call with lock held
763d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivistatus_t MediaPlayer::checkStateForKeySet_l(int key)
764d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi{
765d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    switch(key) {
766d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
767d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
768d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE) ) {
769d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            // Can't change the audio attributes after prepare
770d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            ALOGE("trying to set audio attributes called in state %d", mCurrentState);
771d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            return INVALID_OPERATION;
772d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        }
773d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
774d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    default:
775d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        // parameter doesn't require player state check
776d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
777d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    }
778d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    return OK;
779d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi}
780d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi
7814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::setParameter(int key, const Parcel& request)
7824f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
7833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setParameter(%d)", key);
7844356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    status_t status = INVALID_OPERATION;
7854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
786d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    if (checkStateForKeySet_l(key) != OK) {
7874356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        return status;
7884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
789640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    switch (key) {
790640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
7914356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        // save the marshalled audio attributes
792640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) { delete mAudioAttributesParcel; };
793640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel = new Parcel();
794640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel->appendFrom(&request, 0, request.dataSize());
7954356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = OK;
7964356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
797640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    default:
7984356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        ALOGV_IF(mPlayer == NULL, "setParameter: no active player");
7994356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
8004356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    }
8014356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent
8024356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    if (mPlayer != NULL) {
8034356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = mPlayer->setParameter(key, request);
804640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    }
8054356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    return status;
8064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
8074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
8084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::getParameter(int key, Parcel *reply)
8094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
8103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::getParameter(%d)", key);
8114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
8124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    if (mPlayer != NULL) {
813e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->getParameter(key, reply);
8144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
8153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameter: no active player");
8164f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return INVALID_OPERATION;
8174f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
8184f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
819c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::setRetransmitEndpoint(const char* addrString,
820c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                                            uint16_t port) {
821c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    ALOGV("MediaPlayer::setRetransmitEndpoint(%s:%hu)",
822c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            addrString ? addrString : "(null)", port);
823c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
824c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
825c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if ((mPlayer != NULL) || (mCurrentState != MEDIA_PLAYER_IDLE))
826c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return INVALID_OPERATION;
827c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
828c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (NULL == addrString) {
829c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        mRetransmitEndpointValid = false;
830c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return OK;
831c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
832c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
833c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    struct in_addr saddr;
834c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if(!inet_aton(addrString, &saddr)) {
835c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return BAD_VALUE;
836c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
837c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
838be08f6a6688f3b1ae6914fbe800953c9bfb13c45Glenn Kasten    memset(&mRetransmitEndpoint, 0, sizeof(mRetransmitEndpoint));
839c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_family = AF_INET;
840c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_addr   = saddr;
841c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_port   = htons(port);
842c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid       = true;
843c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
844c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
845c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
846c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
847b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool send = true;
8511af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    bool locked = false;
85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // TODO: In the future, we might be on the same thread if the app is
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // running in the same process as the media server. In that case,
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this will deadlock.
856660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    //
857d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // The threadId hack below works around this for the care of prepare,
858d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // seekTo and start within the same process.
8595cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // FIXME: Remember, this is a hack, it's not even a hack that is applied
8605cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // consistently for all use-cases, this needs to be revisited.
861e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mLockThreadId != getThreadId()) {
8621af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLock.lock();
8631af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        locked = true;
864660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    }
8651af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams
8663b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    // Allows calls from JNI in idle state to notify errors
8673b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    if (!(msg == MEDIA_ERROR && mCurrentState == MEDIA_PLAYER_IDLE) && mPlayer == 0) {
8683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2);
8691af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        if (locked) mLock.unlock();   // release the lock when done.
87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return;
87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (msg) {
87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_NOP: // interface test message
87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PREPARED:
877071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        ALOGV("MediaPlayer::notify() prepared");
87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARED;
87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync) {
8803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = NO_ERROR;
88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
886071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    case MEDIA_DRM_INFO:
887071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        ALOGV("MediaPlayer::notify() MEDIA_DRM_INFO(%d, %d, %d, %p)", msg, ext1, ext2, obj);
888071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        break;
88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PLAYBACK_COMPLETE:
8903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("playback complete");
8911c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        if (mCurrentState == MEDIA_PLAYER_IDLE) {
89229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("playback complete in idle state");
8931c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        }
89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!mLoop) {
89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_ERROR:
89965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // Always log errors.
90065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
90165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
90229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("error (%d, %d)", ext1, ext2);
90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STATE_ERROR;
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync)
90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        {
9063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = ext1;
90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            send = false;
91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
91365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    case MEDIA_INFO:
91465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
91565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
916145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (ext1 != MEDIA_INFO_VIDEO_TRACK_LAGGING) {
9175ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("info/warning (%d, %d)", ext1, ext2);
918145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
91965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        break;
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SEEK_COMPLETE:
9213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received seek complete");
922c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        if (mSeekPosition != mCurrentPosition || (mSeekMode != mCurrentSeekMode)) {
923c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            ALOGV("Executing queued seekTo(%d, %d)", mCurrentPosition, mCurrentSeekMode);
92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = -1;
925c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
926c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            seekTo_l(mCurrentPosition, mCurrentSeekMode);
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
9293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("All seeks complete - return to regularly scheduled program");
93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentPosition = mSeekPosition = -1;
931c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mCurrentSeekMode = mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_BUFFERING_UPDATE:
9353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("buffering %d", ext1);
93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SET_VIDEO_SIZE:
9383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("New video size %d x %d", ext1, ext2);
93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoWidth = ext1;
94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoHeight = ext2;
94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
942b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    case MEDIA_TIMED_TEXT:
9433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received timed text message");
944b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        break;
945dcb89b3b505522efde173c105a851c412f947178Chong Zhang    case MEDIA_SUBTITLE_DATA:
946dcb89b3b505522efde173c105a851c412f947178Chong Zhang        ALOGV("Received subtitle data message");
947dcb89b3b505522efde173c105a851c412f947178Chong Zhang        break;
9480852843d304006e3ab333081fddda13b07193de8Robert Shih    case MEDIA_META_DATA:
9490852843d304006e3ab333081fddda13b07193de8Robert Shih        ALOGV("Received timed metadata message");
9500852843d304006e3ab333081fddda13b07193de8Robert Shih        break;
95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    default:
9523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaPlayerListener> listener = mListener;
9571af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (locked) mLock.unlock();
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this prevents re-entrant calls into client code
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((listener != 0) && send) {
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
9623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("callback application");
963b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        listener->notify(msg, ext1, ext2, obj);
9643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("back from callback");
96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
968dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaPlayer::died()
969dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
9703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("died");
971dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
972dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
973dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
9746b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenstatus_t MediaPlayer::setNextMediaPlayer(const sp<MediaPlayer>& next) {
9751243869fb29ee580fa5c179443420c06a779dbfdWei Jia    Mutex::Autolock _l(mLock);
9766b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    if (mPlayer == NULL) {
9776b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return NO_INIT;
9786b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
979b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
980b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    if (next != NULL && !(next->mCurrentState &
981b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen            (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
982b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        ALOGE("next player is not prepared");
983b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        return INVALID_OPERATION;
984b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    }
985b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
9866b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    return mPlayer->setNextPlayer(next == NULL ? NULL : next->mPlayer);
9876b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen}
9886b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen
989071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania// ModDrm
990071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::prepareDrm(const uint8_t uuid[16], const int mode)
991071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
992071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
993071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
994071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
995071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
996071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
997071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Only allowing it in player's prepared state
998071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (!(mCurrentState & MEDIA_PLAYER_PREPARED)) {
999071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        ALOGE("prepareDrm must only be called in the prepared state.");
1000071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return INVALID_OPERATION;
1001071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1002071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1003071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->prepareDrm(uuid, mode);
1004071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("prepareDrm: ret=%d", ret);
1005071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1006071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1007071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1008071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1009071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::releaseDrm()
1010071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1011071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1012071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1013071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1014071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1015071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1016071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not allowing releaseDrm in an active state
1017071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mCurrentState & (MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PAUSED)) {
1018071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        ALOGE("releaseDrm can not be called in the started/paused state.");
1019071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return INVALID_OPERATION;
1020071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1021071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1022071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->releaseDrm();
1023071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("releaseDrm: ret=%d", ret);
1024071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1025071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1026071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1027071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1028071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::getKeyRequest(Vector<uint8_t> const& scope, String8 const& mimeType,
1029071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                              DrmPlugin::KeyType keyType,
1030071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                              KeyedVector<String8, String8>& optionalParameters,
1031071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                              Vector<uint8_t>& request, String8& defaultUrl,
1032071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                              DrmPlugin::KeyRequestType& keyRequestType)
1033071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1034071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1035071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1036071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1037071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1038071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1039071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not enforcing a particular state beyond the checks enforced by the Java layer
1040071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Key exchange can happen after the start.
1041071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->getKeyRequest(scope, mimeType, keyType, optionalParameters,
1042071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                                     request, defaultUrl, keyRequestType);
1043071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("getKeyRequest ret=%d  %d %s %d ", ret,
1044071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania          (int)request.size(), defaultUrl.string(), (int)keyRequestType);
1045071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1046071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1047071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1048071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1049071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::provideKeyResponse(Vector<uint8_t>& releaseKeySetId,
1050071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania                              Vector<uint8_t>& response, Vector<uint8_t>& keySetId)
1051071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1052071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1053071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1054071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1055071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1056071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1057071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not enforcing a particular state beyond the checks enforced by the Java layer
1058071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Key exchange can happen after the start.
1059071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->provideKeyResponse(releaseKeySetId, response, keySetId);
1060071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("provideKeyResponse: ret=%d", ret);
1061071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1062071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1063071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1064071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1065071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::restoreKeys(Vector<uint8_t> const& keySetId)
1066071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1067071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1068071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1069071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1070071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1071071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1072071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not enforcing a particular state beyond the checks enforced by the Java layer
1073071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Key exchange can happen after the start.
1074071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->restoreKeys(keySetId);
1075071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("restoreKeys: ret=%d", ret);
1076071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1077071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1078071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1079071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1080071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::getDrmPropertyString(String8 const& name, String8& value)
1081071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1082071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1083071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1084071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1085071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1086071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1087071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not enforcing a particular state beyond the checks enforced by the Java layer
1088071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->getDrmPropertyString(name, value);
1089071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("getDrmPropertyString: ret=%d", ret);
1090071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1091071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1092071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1093071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1094071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojaniastatus_t MediaPlayer::setDrmPropertyString(String8 const& name, String8 const& value)
1095071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania{
1096071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    Mutex::Autolock _l(mLock);
1097071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    if (mPlayer == NULL) {
1098071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania        return NO_INIT;
1099071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    }
1100071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1101071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    // Not enforcing a particular state beyond the checks enforced by the Java layer
1102071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    status_t ret = mPlayer->setDrmPropertyString(name, value);
1103071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    ALOGV("setDrmPropertyString: ret=%d", ret);
1104071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
1105071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania    return ret;
1106071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania}
1107071437a2005e39969983ec619a4c7bc54c2dc5a9Hassan Shojania
110840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1109