mediaplayer.cpp revision dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6
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;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            err = NO_ERROR;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
141f65fa170b28f97503df3c309ecdaab377a042ba6Masaki Muranaka            ALOGE("Unable to create media player");
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (p != 0) {
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p->disconnect();
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1522db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t MediaPlayer::setDataSource(
1531b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
1542db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        const char *url, const KeyedVector<String8, String8> *headers)
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource(%s)", url);
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = BAD_VALUE;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (url != NULL) {
159fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen        const sp<IMediaPlayerService> service(getMediaPlayerService());
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (service != 0) {
161f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
162c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
1631b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                (NO_ERROR != player->setDataSource(httpService, url, headers))) {
1640662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke                player.clear();
165d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
1660662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            err = attachNewPlayer(player);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17434fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn    ALOGV("setDataSource(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length);
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = UNKNOWN_ERROR;
176fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen    const sp<IMediaPlayerService> service(getMediaPlayerService());
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != 0) {
178f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
179c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
180c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            (NO_ERROR != player->setDataSource(fd, offset, length))) {
1810662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            player.clear();
182d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
1830662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke        err = attachNewPlayer(player);
184d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
185d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    return err;
186d681bbb1767bed09415e050ba78975df214bcd68Dave Burke}
187d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
18899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstatus_t MediaPlayer::setDataSource(const sp<IDataSource> &source)
18999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins{
19099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    ALOGV("setDataSource(IDataSource)");
19199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t err = UNKNOWN_ERROR;
192fc908d010b32bbb850a6306893ce7db166a932f6Marco Nelissen    const sp<IMediaPlayerService> service(getMediaPlayerService());
19399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    if (service != 0) {
19499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
19599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
19699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            (NO_ERROR != player->setDataSource(source))) {
19799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            player.clear();
19899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
19999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        err = attachNewPlayer(player);
20099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
20199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    return err;
20299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}
20399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2041d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniastatus_t MediaPlayer::invoke(const Parcel& request, Parcel *reply)
2051d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania{
2061d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    Mutex::Autolock _l(mLock);
2074023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    const bool hasBeenInitialized =
2084023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            (mCurrentState != MEDIA_PLAYER_STATE_ERROR) &&
2094023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            ((mCurrentState & MEDIA_PLAYER_IDLE) != MEDIA_PLAYER_IDLE);
2104023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    if ((mPlayer != NULL) && hasBeenInitialized) {
21134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn        ALOGV("invoke %zu", request.dataSize());
212e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->invoke(request, reply);
2131d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
214848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("invoke failed: wrong state %X, mPlayer(%p)", mCurrentState, mPlayer.get());
2151d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    return INVALID_OPERATION;
2161d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania}
2171d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
218a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniastatus_t MediaPlayer::setMetadataFilter(const Parcel& filter)
219a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{
220b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("setMetadataFilter");
2218e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2228e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
223a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return NO_INIT;
224a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
225a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    return mPlayer->setMetadataFilter(filter);
226a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania}
2271d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
2288e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Cataniastatus_t MediaPlayer::getMetadata(bool update_only, bool apply_filter, Parcel *metadata)
2298e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania{
230b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("getMetadata");
2318e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2328e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
2338e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return NO_INIT;
2348e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
2358e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    return mPlayer->getMetadata(update_only, apply_filter, metadata);
2368e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania}
2378e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
2381173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t MediaPlayer::setVideoSurfaceTexture(
239484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer)
2401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten{
2413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSurfaceTexture");
2421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock _l(mLock);
2431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mPlayer == 0) return NO_INIT;
244484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden    return mPlayer->setVideoSurfaceTexture(bufferProducer);
2451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
2461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
247dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jiastatus_t MediaPlayer::getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
248dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia{
249dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    ALOGV("getDefaultBufferingSettings");
250dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
251dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    Mutex::Autolock _l(mLock);
252dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    if (mPlayer == 0) {
253dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia        return NO_INIT;
254dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    }
255dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    return mPlayer->getDefaultBufferingSettings(buffering);
256dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia}
257dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
258dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jiastatus_t MediaPlayer::setBufferingSettings(const BufferingSettings& buffering)
259dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia{
260dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    ALOGV("setBufferingSettings");
261dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
262dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    Mutex::Autolock _l(mLock);
263dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    if (mPlayer == 0) {
264dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia        return NO_INIT;
265dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    }
266dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia    return mPlayer->setBufferingSettings(buffering);
267dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia}
268dc6f340e537ce511ea1d2f8ce7dc1c4ed231f6a6Wei Jia
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// must call with lock held
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync_l()
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
272b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ( (mPlayer != 0) && ( mCurrentState & (MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {
273640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) {
274640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi            mPlayer->setParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES, *mAudioAttributesParcel);
2754356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        } else {
2764356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent            mPlayer->setAudioStreamType(mStreamType);
277640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        }
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARING;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->prepareAsync();
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
281848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("prepareAsync called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// TODO: In case of error, prepareAsync provides the caller with 2 error codes,
28665e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// one defined in the Android framework and one provided by the implementation
28765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// that generated the error. The sync version of prepare returns only 1 error
28865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// code.
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepare()
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
2931af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = getThreadId();
2941af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (mPrepareSync) {
2951af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
2961af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return -EALREADY;
2971af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = true;
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = prepareAsync_l();
3001af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (ret != NO_ERROR) {
3011af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
3021af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return ret;
3031af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPrepareSync) {
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSignal.wait(mLock);  // wait for prepare done
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPrepareSync = false;
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare complete - status=%d", mPrepareStatus);
3101af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = 0;
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mPrepareStatus;
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync()
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepareAsync");
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return prepareAsync_l();
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::start()
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
324d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
325d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    status_t ret = NO_ERROR;
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
327d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
328d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = getThreadId();
329d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
330d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    if (mCurrentState & MEDIA_PLAYER_STARTED) {
331d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = NO_ERROR;
332d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setLooping(mLoop);
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setVolume(mLeftVolume, mRightVolume);
3362beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        mPlayer->setAuxEffectSendLevel(mSendLevel);
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STARTED;
338d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = mPlayer->start();
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
3433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("playback completed immediately following start()");
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
346d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else {
347848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia        ALOGE("start called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
348d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = INVALID_OPERATION;
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
350d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
351d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = 0;
352d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
353d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    return ret;
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::stop()
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->stop();
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STOPPED;
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
371848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("stop called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::pause()
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("pause");
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
379698f476590bc9e38d4d1d4155da9efdbedd357c4Marco Nelissen    if (mCurrentState & (MEDIA_PLAYER_PAUSED|MEDIA_PLAYER_PLAYBACK_COMPLETE))
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_ERROR;
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((mPlayer != 0) && (mCurrentState & MEDIA_PLAYER_STARTED)) {
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->pause();
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
390848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("pause called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isPlaying()
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        bool temp = false;
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->isPlaying(&temp);
4003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("isPlaying: %d", temp);
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ((mCurrentState & MEDIA_PLAYER_STARTED) && ! temp) {
40229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("internal/external state mismatch corrected");
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
4043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } else if ((mCurrentState & MEDIA_PLAYER_PAUSED) && temp) {
4053a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            ALOGE("internal/external state mismatch corrected");
4063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return temp;
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isPlaying: no active player");
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4143a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setPlaybackSettings(const AudioPlaybackRate& rate)
4159816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia{
4163a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setPlaybackSettings: %f %f %d %d",
4173a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed, rate.mPitch, rate.mFallbackMode, rate.mStretchMode);
4183a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // Negative speed and pitch does not make sense. Further validation will
4193a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // be done by the respective mediaplayers.
4203a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (rate.mSpeed < 0.f || rate.mPitch < 0.f) {
4219816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return BAD_VALUE;
4229816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4239816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    Mutex::Autolock _l(mLock);
4245af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia    if (mPlayer == 0 || (mCurrentState & MEDIA_PLAYER_STOPPED)) {
4255af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia        return INVALID_OPERATION;
4265af6a9b4a6924377d80de7c3f460f99b89cff91eWei Jia    }
4275be109faadfc08b561221bd801082873b614b93dWei Jia
4285be109faadfc08b561221bd801082873b614b93dWei Jia    if (rate.mSpeed != 0.f && !(mCurrentState & MEDIA_PLAYER_STARTED)
4295be109faadfc08b561221bd801082873b614b93dWei Jia            && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
4305be109faadfc08b561221bd801082873b614b93dWei Jia                    | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
4315be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setLooping(mLoop);
4325be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setVolume(mLeftVolume, mRightVolume);
4335be109faadfc08b561221bd801082873b614b93dWei Jia        mPlayer->setAuxEffectSendLevel(mSendLevel);
4345be109faadfc08b561221bd801082873b614b93dWei Jia    }
4355be109faadfc08b561221bd801082873b614b93dWei Jia
4363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t err = mPlayer->setPlaybackSettings(rate);
4373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (err == OK) {
4383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (rate.mSpeed == 0.f && mCurrentState == MEDIA_PLAYER_STARTED) {
4393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_PAUSED;
4405be109faadfc08b561221bd801082873b614b93dWei Jia        } else if (rate.mSpeed != 0.f
4415be109faadfc08b561221bd801082873b614b93dWei Jia                && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
4425be109faadfc08b561221bd801082873b614b93dWei Jia                    | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
4433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
4449816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        }
4459816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return err;
4473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4483a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4493a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
4503a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4513a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4523a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4533a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getPlaybackSettings(rate);
4543a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4553a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4563a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
4573a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4583a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setSyncSettings: %u %u %f %f",
4593a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource, sync.mAudioAdjustMode, sync.mTolerance, videoFpsHint);
4603a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4613a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4623a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->setSyncSettings(sync, videoFpsHint);
4633a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4643a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getSyncSettings(
4663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
4673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getSyncSettings(sync, videoFps);
4719816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia}
4729816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoWidth(int *w)
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoWidth");
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *w = mVideoWidth;
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoHeight(int *h)
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoHeight");
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *h = mVideoHeight;
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getCurrentPosition(int *msec)
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getCurrentPosition");
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mCurrentPosition >= 0) {
4973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Using cached seek position: %d", mCurrentPosition);
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *msec = mCurrentPosition;
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->getCurrentPosition(msec);
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration_l(int *msec)
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
508a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber    ALOGV("getDuration_l");
509b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    bool isValidState = (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
510b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_STOPPED | MEDIA_PLAYER_PLAYBACK_COMPLETE));
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0 && isValidState) {
512a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
513a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t ret = mPlayer->getDuration(&durationMs);
5142070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
5152070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        if (ret != OK) {
5162070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            // Do not enter error state just because no duration was available.
5172070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            durationMs = -1;
5182070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            ret = OK;
5192070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        }
5202070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
521a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec) {
522a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            *msec = durationMs;
523a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
526848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia    ALOGE("Attempt to call getDuration in wrong state: mPlayer=%p, mCurrentState=%u",
527848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia            mPlayer.get(), mCurrentState);
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration(int *msec)
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return getDuration_l(msec);
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
537c5de09127e9e0d5df7aa587be317e1487d793245Wei Jiastatus_t MediaPlayer::seekTo_l(int msec, MediaPlayerSeekMode mode)
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
539c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    ALOGV("seekTo (%d, %d)", msec, mode);
540b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
541b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED |  MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ( msec < 0 ) {
5435ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Attempt to seek to invalid position: %d", msec);
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            msec = 0;
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
546a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
547a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
548a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t err = mPlayer->getDuration(&durationMs);
549a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
550a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (err != OK) {
551a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Stream has no duration and is therefore not seekable.");
552a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            return err;
553a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
554a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
555a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec > durationMs) {
556a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Attempt to seek to past end of file: request = %d, "
557a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  "durationMs = %d",
558a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  msec,
559a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  durationMs);
560a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
561a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            msec = durationMs;
562a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
563a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // cache duration
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentPosition = msec;
566c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        mCurrentSeekMode = mode;
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSeekPosition < 0) {
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = msec;
569c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mSeekMode = mode;
570c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            return mPlayer->seekTo(msec, mode);
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
573c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            ALOGV("Seek in progress - queue up seekTo[%d, %d]", msec, mode);
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
577b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(),
578b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            mCurrentState);
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
582c5de09127e9e0d5df7aa587be317e1487d793245Wei Jiastatus_t MediaPlayer::seekTo(int msec, MediaPlayerSeekMode mode)
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5845cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = getThreadId();
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
586c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t result = seekTo_l(msec, mode);
5875cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = 0;
5885cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber
5895cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    return result;
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
59261c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset_l()
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = false;
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState == MEDIA_PLAYER_IDLE) return NO_ERROR;
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = false;
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->reset();
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
60029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("reset() failed with return code (%d)", ret);
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
6032b95bda111444f2834e64221e3a3eb1a87d43c38Robert Shih            mPlayer->disconnect();
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_IDLE;
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
606a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // setDataSource has to be called again to create a
607a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // new mediaplayer.
608a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        mPlayer = 0;
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    clear_l();
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
615c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::doSetRetransmitEndpoint(const sp<IMediaPlayer>& player) {
616c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
617c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
618c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (player == NULL) {
619c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return UNKNOWN_ERROR;
620c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
621c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
622c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (mRetransmitEndpointValid) {
623c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return player->setRetransmitEndpoint(&mRetransmitEndpoint);
624c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
625c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
626c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
627c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
628c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
62961c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset()
63061c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis{
6313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
63261c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    Mutex::Autolock _l(mLock);
63361c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    return reset_l();
63461c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis}
63561c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis
636fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t MediaPlayer::setAudioStreamType(audio_stream_type_t type)
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioStreamType");
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mStreamType == type) return NO_ERROR;
64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) {
64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Can't change the stream type after prepare
64429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioStream called in state %d", mCurrentState);
64589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
64689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // cache
64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mStreamType = type;
64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
652de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlockstatus_t MediaPlayer::getAudioStreamType(audio_stream_type_t *type)
653de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock{
654de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    ALOGV("getAudioStreamType");
655de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    Mutex::Autolock _l(mLock);
656de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    *type = mStreamType;
657de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    return OK;
658de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock}
659de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setLooping(int loop)
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setLooping");
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = (loop != 0);
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setLooping(loop);
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isLooping() {
6723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping");
67389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mLoop;
67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping: no active player");
67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setVolume(float leftVolume, float rightVolume)
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setVolume(%f, %f)", leftVolume, rightVolume);
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLeftVolume = leftVolume;
68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mRightVolume = rightVolume;
68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setVolume(leftVolume, rightVolume);
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
69289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
693d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenstatus_t MediaPlayer::setAudioSessionId(audio_session_t sessionId)
694a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
6953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioSessionId(%d)", sessionId);
696a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
697a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (!(mCurrentState & MEDIA_PLAYER_IDLE)) {
69829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioSessionId called in state %d", mCurrentState);
699a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return INVALID_OPERATION;
700a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
701a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (sessionId < 0) {
702a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return BAD_VALUE;
703a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
7043a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    if (sessionId != mAudioSessionId) {
705d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::acquireAudioSessionId(sessionId, -1);
706d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
707e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        mAudioSessionId = sessionId;
7083a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
709a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return NO_ERROR;
710a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
711a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
712d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenaudio_session_t MediaPlayer::getAudioSessionId()
713a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
714a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
715a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return mAudioSessionId;
716a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
717a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
7182beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::setAuxEffectSendLevel(float level)
7192beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
7203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAuxEffectSendLevel(%f)", level);
7212beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
7222beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    mSendLevel = level;
7232beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer != 0) {
7242beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return mPlayer->setAuxEffectSendLevel(level);
7252beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
7262beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return OK;
7272beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7282beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7292beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::attachAuxEffect(int effectId)
7302beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
7313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::attachAuxEffect(%d)", effectId);
7322beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
7332beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer == 0 ||
7342beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState & MEDIA_PLAYER_IDLE) ||
7352beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState == MEDIA_PLAYER_STATE_ERROR )) {
736848ebc644a1a7ef93a051186fb5f0aef826ad67eWei Jia        ALOGE("attachAuxEffect called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
7372beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return INVALID_OPERATION;
7382beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
7392beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return mPlayer->attachAuxEffect(effectId);
7412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
743d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi// always call with lock held
744d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivistatus_t MediaPlayer::checkStateForKeySet_l(int key)
745d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi{
746d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    switch(key) {
747d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
748d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
749d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE) ) {
750d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            // Can't change the audio attributes after prepare
751d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            ALOGE("trying to set audio attributes called in state %d", mCurrentState);
752d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            return INVALID_OPERATION;
753d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        }
754d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
755d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    default:
756d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        // parameter doesn't require player state check
757d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
758d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    }
759d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    return OK;
760d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi}
761d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi
7624f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::setParameter(int key, const Parcel& request)
7634f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
7643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setParameter(%d)", key);
7654356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    status_t status = INVALID_OPERATION;
7664f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
767d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    if (checkStateForKeySet_l(key) != OK) {
7684356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        return status;
7694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
770640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    switch (key) {
771640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
7724356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        // save the marshalled audio attributes
773640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) { delete mAudioAttributesParcel; };
774640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel = new Parcel();
775640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel->appendFrom(&request, 0, request.dataSize());
7764356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = OK;
7774356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
778640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    default:
7794356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        ALOGV_IF(mPlayer == NULL, "setParameter: no active player");
7804356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
7814356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    }
7824356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent
7834356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    if (mPlayer != NULL) {
7844356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = mPlayer->setParameter(key, request);
785640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    }
7864356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    return status;
7874f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
7884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
7894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::getParameter(int key, Parcel *reply)
7904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
7913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::getParameter(%d)", key);
7924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
7934f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    if (mPlayer != NULL) {
794e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->getParameter(key, reply);
7954f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
7963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameter: no active player");
7974f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return INVALID_OPERATION;
7984f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
7994f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
800c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::setRetransmitEndpoint(const char* addrString,
801c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                                            uint16_t port) {
802c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    ALOGV("MediaPlayer::setRetransmitEndpoint(%s:%hu)",
803c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            addrString ? addrString : "(null)", port);
804c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
805c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
806c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if ((mPlayer != NULL) || (mCurrentState != MEDIA_PLAYER_IDLE))
807c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return INVALID_OPERATION;
808c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
809c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (NULL == addrString) {
810c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        mRetransmitEndpointValid = false;
811c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return OK;
812c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
813c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
814c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    struct in_addr saddr;
815c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if(!inet_aton(addrString, &saddr)) {
816c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return BAD_VALUE;
817c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
818c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
819be08f6a6688f3b1ae6914fbe800953c9bfb13c45Glenn Kasten    memset(&mRetransmitEndpoint, 0, sizeof(mRetransmitEndpoint));
820c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_family = AF_INET;
821c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_addr   = saddr;
822c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_port   = htons(port);
823c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid       = true;
824c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
825c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
826c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
827c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
828b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool send = true;
8321af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    bool locked = false;
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // TODO: In the future, we might be on the same thread if the app is
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // running in the same process as the media server. In that case,
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this will deadlock.
837660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    //
838d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // The threadId hack below works around this for the care of prepare,
839d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // seekTo and start within the same process.
8405cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // FIXME: Remember, this is a hack, it's not even a hack that is applied
8415cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // consistently for all use-cases, this needs to be revisited.
842e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mLockThreadId != getThreadId()) {
8431af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLock.lock();
8441af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        locked = true;
845660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    }
8461af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams
8473b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    // Allows calls from JNI in idle state to notify errors
8483b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    if (!(msg == MEDIA_ERROR && mCurrentState == MEDIA_PLAYER_IDLE) && mPlayer == 0) {
8493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2);
8501af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        if (locked) mLock.unlock();   // release the lock when done.
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return;
85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (msg) {
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_NOP: // interface test message
85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PREPARED:
8583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("prepared");
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARED;
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync) {
8613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = NO_ERROR;
86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PLAYBACK_COMPLETE:
8683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("playback complete");
8691c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        if (mCurrentState == MEDIA_PLAYER_IDLE) {
87029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("playback complete in idle state");
8711c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        }
87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!mLoop) {
87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_ERROR:
87765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // Always log errors.
87865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
87965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
88029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("error (%d, %d)", ext1, ext2);
88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STATE_ERROR;
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync)
88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        {
8843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = ext1;
88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            send = false;
88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
89165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    case MEDIA_INFO:
89265e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
89365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
894145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (ext1 != MEDIA_INFO_VIDEO_TRACK_LAGGING) {
8955ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("info/warning (%d, %d)", ext1, ext2);
896145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
89765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        break;
89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SEEK_COMPLETE:
8993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received seek complete");
900c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        if (mSeekPosition != mCurrentPosition || (mSeekMode != mCurrentSeekMode)) {
901c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            ALOGV("Executing queued seekTo(%d, %d)", mCurrentPosition, mCurrentSeekMode);
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = -1;
903c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
904c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            seekTo_l(mCurrentPosition, mCurrentSeekMode);
90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
9073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("All seeks complete - return to regularly scheduled program");
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentPosition = mSeekPosition = -1;
909c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            mCurrentSeekMode = mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_BUFFERING_UPDATE:
9133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("buffering %d", ext1);
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SET_VIDEO_SIZE:
9163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("New video size %d x %d", ext1, ext2);
91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoWidth = ext1;
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoHeight = ext2;
91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
920b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    case MEDIA_TIMED_TEXT:
9213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received timed text message");
922b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        break;
923dcb89b3b505522efde173c105a851c412f947178Chong Zhang    case MEDIA_SUBTITLE_DATA:
924dcb89b3b505522efde173c105a851c412f947178Chong Zhang        ALOGV("Received subtitle data message");
925dcb89b3b505522efde173c105a851c412f947178Chong Zhang        break;
9260852843d304006e3ab333081fddda13b07193de8Robert Shih    case MEDIA_META_DATA:
9270852843d304006e3ab333081fddda13b07193de8Robert Shih        ALOGV("Received timed metadata message");
9280852843d304006e3ab333081fddda13b07193de8Robert Shih        break;
92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    default:
9303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaPlayerListener> listener = mListener;
9351af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (locked) mLock.unlock();
93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this prevents re-entrant calls into client code
93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((listener != 0) && send) {
93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
9403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("callback application");
941b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        listener->notify(msg, ext1, ext2, obj);
9423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("back from callback");
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
946dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaPlayer::died()
947dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
9483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("died");
949dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
950dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
951dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
9526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenstatus_t MediaPlayer::setNextMediaPlayer(const sp<MediaPlayer>& next) {
9531243869fb29ee580fa5c179443420c06a779dbfdWei Jia    Mutex::Autolock _l(mLock);
9546b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    if (mPlayer == NULL) {
9556b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return NO_INIT;
9566b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
957b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
958b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    if (next != NULL && !(next->mCurrentState &
959b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen            (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
960b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        ALOGE("next player is not prepared");
961b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        return INVALID_OPERATION;
962b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    }
963b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
9646b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    return mPlayer->setNextPlayer(next == NULL ? NULL : next->mPlayer);
9656b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen}
9666b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen
96740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
968