mediaplayer.cpp revision 4356269be6d2b62bbb945364e8fc4beb99e1aada
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;
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mSeekPosition = -1;
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_PLAYER_IDLE;
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = false;
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareStatus = NO_ERROR;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = false;
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLeftVolume = mRightVolume = 1.0;
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mVideoWidth = mVideoHeight = 0;
651af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = 0;
66de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent    mAudioSessionId = AudioSystem::newAudioUniqueId();
67d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    AudioSystem::acquireAudioSessionId(mAudioSessionId, -1);
688c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent    mSendLevel = 0;
69c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid = false;
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayer::~MediaPlayer()
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destructor");
75640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    if (mAudioAttributesParcel != NULL) {
76640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        delete mAudioAttributesParcel;
77640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel = NULL;
78640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    }
79d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    disconnect();
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IPCThreadState::self()->flushCommands();
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayer::disconnect()
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("disconnect");
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaPlayer> p;
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mLock);
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p = mPlayer;
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer.clear();
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (p != 0) {
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p->disconnect();
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// always call with lock held
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayer::clear_l()
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentPosition = -1;
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mSeekPosition = -1;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mVideoWidth = mVideoHeight = 0;
105c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid = false;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setListener(const sp<MediaPlayerListener>& listener)
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
117d681bbb1767bed09415e050ba78975df214bcd68Dave Burkestatus_t MediaPlayer::attachNewPlayer(const sp<IMediaPlayer>& player)
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = UNKNOWN_ERROR;
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaPlayer> p;
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    { // scope for the lock
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mLock);
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12483ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen        if ( !( (mCurrentState & MEDIA_PLAYER_IDLE) ||
12583ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen                (mCurrentState == MEDIA_PLAYER_STATE_ERROR ) ) ) {
12629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("attachNewPlayer called in state %d", mCurrentState);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return INVALID_OPERATION;
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        clear_l();
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p = mPlayer;
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer = player;
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (player != 0) {
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_INITIALIZED;
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            err = NO_ERROR;
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
137f65fa170b28f97503df3c309ecdaab377a042ba6Masaki Muranaka            ALOGE("Unable to create media player");
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (p != 0) {
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        p->disconnect();
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1482db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t MediaPlayer::setDataSource(
1491b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
1502db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber        const char *url, const KeyedVector<String8, String8> *headers)
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource(%s)", url);
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = BAD_VALUE;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (url != NULL) {
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        const sp<IMediaPlayerService>& service(getMediaPlayerService());
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (service != 0) {
157f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
158c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
1591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                (NO_ERROR != player->setDataSource(httpService, url, headers))) {
1600662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke                player.clear();
161d681bbb1767bed09415e050ba78975df214bcd68Dave Burke            }
1620662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            err = attachNewPlayer(player);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17034fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn    ALOGV("setDataSource(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length);
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t err = UNKNOWN_ERROR;
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const sp<IMediaPlayerService>& service(getMediaPlayerService());
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != 0) {
174f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
175c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
176c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            (NO_ERROR != player->setDataSource(fd, offset, length))) {
1770662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            player.clear();
178d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
1790662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke        err = attachNewPlayer(player);
180d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    }
181d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    return err;
182d681bbb1767bed09415e050ba78975df214bcd68Dave Burke}
183d681bbb1767bed09415e050ba78975df214bcd68Dave Burke
184d681bbb1767bed09415e050ba78975df214bcd68Dave Burkestatus_t MediaPlayer::setDataSource(const sp<IStreamSource> &source)
185d681bbb1767bed09415e050ba78975df214bcd68Dave Burke{
1863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource");
187d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    status_t err = UNKNOWN_ERROR;
188d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    const sp<IMediaPlayerService>& service(getMediaPlayerService());
189d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    if (service != 0) {
190f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
191c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
192c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            (NO_ERROR != player->setDataSource(source))) {
1930662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke            player.clear();
194d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        }
1950662067b06658a4a56a8416c676f6cce8ccddb53Dave Burke        err = attachNewPlayer(player);
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return err;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstatus_t MediaPlayer::setDataSource(const sp<IDataSource> &source)
20199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins{
20299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    ALOGV("setDataSource(IDataSource)");
20399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t err = UNKNOWN_ERROR;
20499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    const sp<IMediaPlayerService>& service(getMediaPlayerService());
20599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    if (service != 0) {
20699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
20799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
20899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            (NO_ERROR != player->setDataSource(source))) {
20999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            player.clear();
21099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        }
21199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        err = attachNewPlayer(player);
21299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
21399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    return err;
21499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}
21599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2161d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniastatus_t MediaPlayer::invoke(const Parcel& request, Parcel *reply)
2171d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania{
2181d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    Mutex::Autolock _l(mLock);
2194023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    const bool hasBeenInitialized =
2204023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            (mCurrentState != MEDIA_PLAYER_STATE_ERROR) &&
2214023493a827bc9751d8e40795516d0d536a53348Nicolas Catania            ((mCurrentState & MEDIA_PLAYER_IDLE) != MEDIA_PLAYER_IDLE);
2224023493a827bc9751d8e40795516d0d536a53348Nicolas Catania    if ((mPlayer != NULL) && hasBeenInitialized) {
22334fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn        ALOGV("invoke %zu", request.dataSize());
224e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->invoke(request, reply);
2251d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    }
22629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("invoke failed: wrong state %X", mCurrentState);
2271d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    return INVALID_OPERATION;
2281d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania}
2291d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
230a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniastatus_t MediaPlayer::setMetadataFilter(const Parcel& filter)
231a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{
232b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("setMetadataFilter");
2338e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2348e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
235a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania        return NO_INIT;
236a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    }
237a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania    return mPlayer->setMetadataFilter(filter);
238a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania}
2391d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
2408e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Cataniastatus_t MediaPlayer::getMetadata(bool update_only, bool apply_filter, Parcel *metadata)
2418e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania{
242b8a805261bf0282e992d3608035e47d05a898710Steve Block    ALOGD("getMetadata");
2438e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    Mutex::Autolock lock(mLock);
2448e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    if (mPlayer == NULL) {
2458e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania        return NO_INIT;
2468e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    }
2478e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania    return mPlayer->getMetadata(update_only, apply_filter, metadata);
2488e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania}
2498e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania
2501173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t MediaPlayer::setVideoSurfaceTexture(
251484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer)
2521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten{
2533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSurfaceTexture");
2541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock _l(mLock);
2551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mPlayer == 0) return NO_INIT;
256484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden    return mPlayer->setVideoSurfaceTexture(bufferProducer);
2571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
2581173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// must call with lock held
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync_l()
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
262b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ( (mPlayer != 0) && ( mCurrentState & (MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {
263640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) {
264640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi            mPlayer->setParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES, *mAudioAttributesParcel);
2654356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        } else {
2664356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent            mPlayer->setAudioStreamType(mStreamType);
267640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        }
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARING;
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->prepareAsync();
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("prepareAsync called in state %d", mCurrentState);
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// TODO: In case of error, prepareAsync provides the caller with 2 error codes,
27665e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// one defined in the Android framework and one provided by the implementation
27765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// that generated the error. The sync version of prepare returns only 1 error
27865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project// code.
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepare()
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
2831af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = getThreadId();
2841af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (mPrepareSync) {
2851af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
2861af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return -EALREADY;
2871af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = true;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = prepareAsync_l();
2901af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (ret != NO_ERROR) {
2911af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLockThreadId = 0;
2921af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        return ret;
2931af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    }
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPrepareSync) {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mSignal.wait(mLock);  // wait for prepare done
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPrepareSync = false;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare complete - status=%d", mPrepareStatus);
3001af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    mLockThreadId = 0;
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mPrepareStatus;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::prepareAsync()
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepareAsync");
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return prepareAsync_l();
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::start()
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
314d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
315d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    status_t ret = NO_ERROR;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
317d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
318d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = getThreadId();
319d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
320d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    if (mCurrentState & MEDIA_PLAYER_STARTED) {
321d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = NO_ERROR;
322d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setLooping(mLoop);
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->setVolume(mLeftVolume, mRightVolume);
3262beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        mPlayer->setAuxEffectSendLevel(mSendLevel);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STARTED;
328d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = mPlayer->start();
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
3333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("playback completed immediately following start()");
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
336d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    } else {
337d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ALOGE("start called in state %d", mCurrentState);
338d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang        ret = INVALID_OPERATION;
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
340d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
341d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    mLockThreadId = 0;
342d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang
343d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    return ret;
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::stop()
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->stop();
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STOPPED;
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("stop called in state %d", mCurrentState);
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::pause()
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("pause");
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
369698f476590bc9e38d4d1d4155da9efdbedd357c4Marco Nelissen    if (mCurrentState & (MEDIA_PLAYER_PAUSED|MEDIA_PLAYER_PLAYBACK_COMPLETE))
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_ERROR;
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((mPlayer != 0) && (mCurrentState & MEDIA_PLAYER_STARTED)) {
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->pause();
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("pause called in state %d", mCurrentState);
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isPlaying()
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        bool temp = false;
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mPlayer->isPlaying(&temp);
3903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("isPlaying: %d", temp);
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ((mCurrentState & MEDIA_PLAYER_STARTED) && ! temp) {
39229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("internal/external state mismatch corrected");
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PAUSED;
3943a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } else if ((mCurrentState & MEDIA_PLAYER_PAUSED) && temp) {
3953a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            ALOGE("internal/external state mismatch corrected");
3963a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return temp;
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isPlaying: no active player");
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setPlaybackSettings(const AudioPlaybackRate& rate)
4059816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia{
4063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setPlaybackSettings: %f %f %d %d",
4073a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            rate.mSpeed, rate.mPitch, rate.mFallbackMode, rate.mStretchMode);
4083a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // Negative speed and pitch does not make sense. Further validation will
4093a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    // be done by the respective mediaplayers.
4103a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (rate.mSpeed < 0.f || rate.mPitch < 0.f) {
4119816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        return BAD_VALUE;
4129816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4139816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    Mutex::Autolock _l(mLock);
4143a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4153a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    status_t err = mPlayer->setPlaybackSettings(rate);
4163a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (err == OK) {
4173a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (rate.mSpeed == 0.f && mCurrentState == MEDIA_PLAYER_STARTED) {
4183a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_PAUSED;
4193a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        } else if (rate.mSpeed != 0.f && mCurrentState == MEDIA_PLAYER_PAUSED) {
4203a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            mCurrentState = MEDIA_PLAYER_STARTED;
4219816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia        }
4229816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia    }
4233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return err;
4243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4253a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
4273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4283a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4293a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4303a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getPlaybackSettings(rate);
4313a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4323a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4333a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
4343a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4353a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    ALOGV("setSyncSettings: %u %u %f %f",
4363a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            sync.mSource, sync.mAudioAdjustMode, sync.mTolerance, videoFpsHint);
4373a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4383a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4393a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->setSyncSettings(sync, videoFpsHint);
4403a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar}
4413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar
4423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t MediaPlayer::getSyncSettings(
4433a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
4443a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar{
4453a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    Mutex::Autolock _l(mLock);
4463a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    if (mPlayer == 0) return INVALID_OPERATION;
4473a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    return mPlayer->getSyncSettings(sync, videoFps);
4489816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia}
4499816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoWidth(int *w)
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoWidth");
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *w = mVideoWidth;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getVideoHeight(int *h)
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getVideoHeight");
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer == 0) return INVALID_OPERATION;
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    *h = mVideoHeight;
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getCurrentPosition(int *msec)
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getCurrentPosition");
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mCurrentPosition >= 0) {
4743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Using cached seek position: %d", mCurrentPosition);
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *msec = mCurrentPosition;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->getCurrentPosition(msec);
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration_l(int *msec)
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
485a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber    ALOGV("getDuration_l");
486b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    bool isValidState = (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
487b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_STOPPED | MEDIA_PLAYER_PLAYBACK_COMPLETE));
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0 && isValidState) {
489a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
490a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t ret = mPlayer->getDuration(&durationMs);
4912070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
4922070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        if (ret != OK) {
4932070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            // Do not enter error state just because no duration was available.
4942070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            durationMs = -1;
4952070254f241f52cadb69bc2323f56df72704f1caAndreas Huber            ret = OK;
4962070254f241f52cadb69bc2323f56df72704f1caAndreas Huber        }
4972070254f241f52cadb69bc2323f56df72704f1caAndreas Huber
498a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec) {
499a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            *msec = durationMs;
500a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("Attempt to call getDuration without a valid mediaplayer");
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::getDuration(int *msec)
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return getDuration_l(msec);
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::seekTo_l(int msec)
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("seekTo %d", msec);
516b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
517b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            MEDIA_PLAYER_PAUSED |  MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if ( msec < 0 ) {
5195ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("Attempt to seek to invalid position: %d", msec);
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            msec = 0;
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
522a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
523a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        int durationMs;
524a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        status_t err = mPlayer->getDuration(&durationMs);
525a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
526a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (err != OK) {
527a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Stream has no duration and is therefore not seekable.");
528a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            return err;
529a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
530a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
531a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        if (msec > durationMs) {
532a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            ALOGW("Attempt to seek to past end of file: request = %d, "
533a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  "durationMs = %d",
534a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  msec,
535a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber                  durationMs);
536a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
537a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber            msec = durationMs;
538a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber        }
539a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // cache duration
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentPosition = msec;
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSeekPosition < 0) {
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = msec;
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mPlayer->seekTo(msec);
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
5473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Seek in progress - queue up seekTo[%d]", msec);
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
551b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten    ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(),
552b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten            mCurrentState);
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::seekTo(int msec)
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5585cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = getThreadId();
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
5605cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    status_t result = seekTo_l(msec);
5615cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    mLockThreadId = 0;
5625cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber
5635cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    return result;
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56661c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset_l()
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = false;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState == MEDIA_PLAYER_IDLE) return NO_ERROR;
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPrepareSync = false;
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = mPlayer->reset();
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
57429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("reset() failed with return code (%d)", ret);
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_IDLE;
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
579a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // setDataSource has to be called again to create a
580a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        // new mediaplayer.
581a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong        mPlayer = 0;
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return ret;
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    clear_l();
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
588c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::doSetRetransmitEndpoint(const sp<IMediaPlayer>& player) {
589c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
590c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
591c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (player == NULL) {
592c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return UNKNOWN_ERROR;
593c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
594c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
595c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (mRetransmitEndpointValid) {
596c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return player->setRetransmitEndpoint(&mRetransmitEndpoint);
597c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
598c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
599c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
600c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
601c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
60261c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennisstatus_t MediaPlayer::reset()
60361c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis{
6043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
60561c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    Mutex::Autolock _l(mLock);
60661c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis    return reset_l();
60761c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis}
60861c7ef5bde2c7ed94a078396aa65da67b47e5402Jamie Gennis
609fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t MediaPlayer::setAudioStreamType(audio_stream_type_t type)
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioStreamType");
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mStreamType == type) return NO_ERROR;
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) {
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Can't change the stream type after prepare
61729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioStream called in state %d", mCurrentState);
61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // cache
62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mStreamType = type;
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
625de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlockstatus_t MediaPlayer::getAudioStreamType(audio_stream_type_t *type)
626de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock{
627de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    ALOGV("getAudioStreamType");
628de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    Mutex::Autolock _l(mLock);
629de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    *type = mStreamType;
630de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock    return OK;
631de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock}
632de9453fb5cbc9cd69fd1ea45d577851e3aa3b8c9John Spurlock
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setLooping(int loop)
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setLooping");
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLoop = (loop != 0);
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setLooping(loop);
64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayer::isLooping() {
6453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping");
64689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mLoop;
64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("isLooping: no active player");
65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return false;
65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayer::setVolume(float leftVolume, float rightVolume)
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setVolume(%f, %f)", leftVolume, rightVolume);
65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLeftVolume = leftVolume;
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mRightVolume = rightVolume;
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mPlayer != 0) {
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mPlayer->setVolume(leftVolume, rightVolume);
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return OK;
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
666a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurentstatus_t MediaPlayer::setAudioSessionId(int sessionId)
667a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
6683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAudioSessionId(%d)", sessionId);
669a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
670a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (!(mCurrentState & MEDIA_PLAYER_IDLE)) {
67129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioSessionId called in state %d", mCurrentState);
672a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return INVALID_OPERATION;
673a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
674a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    if (sessionId < 0) {
675a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        return BAD_VALUE;
676a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    }
6773a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    if (sessionId != mAudioSessionId) {
678d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::acquireAudioSessionId(sessionId, -1);
679d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
680e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        mAudioSessionId = sessionId;
6813a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
682a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return NO_ERROR;
683a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
684a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
685a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurentint MediaPlayer::getAudioSessionId()
686a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent{
687a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    Mutex::Autolock _l(mLock);
688a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent    return mAudioSessionId;
689a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent}
690a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent
6912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::setAuxEffectSendLevel(float level)
6922beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
6933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setAuxEffectSendLevel(%f)", level);
6942beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
6952beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    mSendLevel = level;
6962beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer != 0) {
6972beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return mPlayer->setAuxEffectSendLevel(level);
6982beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
6992beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return OK;
7002beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7012beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7022beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayer::attachAuxEffect(int effectId)
7032beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{
7043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::attachAuxEffect(%d)", effectId);
7052beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    Mutex::Autolock _l(mLock);
7062beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    if (mPlayer == 0 ||
7072beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState & MEDIA_PLAYER_IDLE) ||
7082beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        (mCurrentState == MEDIA_PLAYER_STATE_ERROR )) {
70929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("attachAuxEffect called in state %d", mCurrentState);
7102beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent        return INVALID_OPERATION;
7112beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    }
7122beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
7132beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent    return mPlayer->attachAuxEffect(effectId);
7142beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent}
7152beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent
716d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi// always call with lock held
717d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivistatus_t MediaPlayer::checkStateForKeySet_l(int key)
718d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi{
719d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    switch(key) {
720d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
721d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        if (mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_STARTED |
722d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi                MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE) ) {
723d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            // Can't change the audio attributes after prepare
724d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            ALOGE("trying to set audio attributes called in state %d", mCurrentState);
725d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi            return INVALID_OPERATION;
726d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        }
727d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
728d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    default:
729d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        // parameter doesn't require player state check
730d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi        break;
731d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    }
732d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    return OK;
733d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi}
734d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi
7354f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::setParameter(int key, const Parcel& request)
7364f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
7373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::setParameter(%d)", key);
7384356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    status_t status = INVALID_OPERATION;
7394f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
740d9d7fa0873796ac661c44a7fcd6ad5ff697ff01fJean-Michel Trivi    if (checkStateForKeySet_l(key) != OK) {
7414356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        return status;
7424f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
743640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    switch (key) {
744640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    case KEY_PARAMETER_AUDIO_ATTRIBUTES:
7454356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        // save the marshalled audio attributes
746640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        if (mAudioAttributesParcel != NULL) { delete mAudioAttributesParcel; };
747640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel = new Parcel();
748640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi        mAudioAttributesParcel->appendFrom(&request, 0, request.dataSize());
7494356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = OK;
7504356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
751640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    default:
7524356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        ALOGV_IF(mPlayer == NULL, "setParameter: no active player");
7534356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        break;
7544356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    }
7554356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent
7564356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    if (mPlayer != NULL) {
7574356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent        status = mPlayer->setParameter(key, request);
758640adb3cf89cc9b826372009fad8c9b3d120482eJean-Michel Trivi    }
7594356269be6d2b62bbb945364e8fc4beb99e1aadaEric Laurent    return status;
7604f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
7614f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
7624f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayer::getParameter(int key, Parcel *reply)
7634f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang{
7643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MediaPlayer::getParameter(%d)", key);
7654f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    Mutex::Autolock _l(mLock);
7664f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    if (mPlayer != NULL) {
767e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        return  mPlayer->getParameter(key, reply);
7684f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    }
7693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameter: no active player");
7704f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return INVALID_OPERATION;
7714f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
7724f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
773c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayer::setRetransmitEndpoint(const char* addrString,
774c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman                                            uint16_t port) {
775c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    ALOGV("MediaPlayer::setRetransmitEndpoint(%s:%hu)",
776c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman            addrString ? addrString : "(null)", port);
777c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
778c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    Mutex::Autolock _l(mLock);
779c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if ((mPlayer != NULL) || (mCurrentState != MEDIA_PLAYER_IDLE))
780c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return INVALID_OPERATION;
781c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
782c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if (NULL == addrString) {
783c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        mRetransmitEndpointValid = false;
784c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return OK;
785c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
786c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
787c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    struct in_addr saddr;
788c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    if(!inet_aton(addrString, &saddr)) {
789c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return BAD_VALUE;
790c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
791c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
792be08f6a6688f3b1ae6914fbe800953c9bfb13c45Glenn Kasten    memset(&mRetransmitEndpoint, 0, sizeof(mRetransmitEndpoint));
793c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_family = AF_INET;
794c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_addr   = saddr;
795c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpoint.sin_port   = htons(port);
796c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    mRetransmitEndpointValid       = true;
797c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
798c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    return OK;
799c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman}
800c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
801b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool send = true;
8051af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    bool locked = false;
80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // TODO: In the future, we might be on the same thread if the app is
80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // running in the same process as the media server. In that case,
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this will deadlock.
810660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    //
811d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // The threadId hack below works around this for the care of prepare,
812d88adb96ec867ed1b629c434f87514d2fabaf5e9Chong Zhang    // seekTo and start within the same process.
8135cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // FIXME: Remember, this is a hack, it's not even a hack that is applied
8145cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber    // consistently for all use-cases, this needs to be revisited.
815e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mLockThreadId != getThreadId()) {
8161af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        mLock.lock();
8171af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        locked = true;
818660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania    }
8191af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams
8203b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    // Allows calls from JNI in idle state to notify errors
8213b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent    if (!(msg == MEDIA_ERROR && mCurrentState == MEDIA_PLAYER_IDLE) && mPlayer == 0) {
8223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("notify(%d, %d, %d) callback on disconnected mediaplayer", msg, ext1, ext2);
8231af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams        if (locked) mLock.unlock();   // release the lock when done.
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return;
82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (msg) {
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_NOP: // interface test message
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PREPARED:
8313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("prepared");
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_PREPARED;
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync) {
8343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = NO_ERROR;
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_PLAYBACK_COMPLETE:
8413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("playback complete");
8421c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        if (mCurrentState == MEDIA_PLAYER_IDLE) {
84329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("playback complete in idle state");
8441c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen        }
84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!mLoop) {
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_ERROR:
85065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // Always log errors.
85165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
85265e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
85329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("error (%d, %d)", ext1, ext2);
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_PLAYER_STATE_ERROR;
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mPrepareSync)
85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        {
8573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("signal application thread");
85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareSync = false;
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mPrepareStatus = ext1;
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSignal.signal();
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            send = false;
86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
86465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    case MEDIA_INFO:
86565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext1: Media framework error code.
86665e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        // ext2: Implementation dependant error code.
867145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (ext1 != MEDIA_INFO_VIDEO_TRACK_LAGGING) {
8685ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("info/warning (%d, %d)", ext1, ext2);
869145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
87065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project        break;
87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SEEK_COMPLETE:
8723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received seek complete");
87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mSeekPosition != mCurrentPosition) {
8743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Executing queued seekTo(%d)", mSeekPosition);
87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mSeekPosition = -1;
87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            seekTo_l(mCurrentPosition);
87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        else {
8793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("All seeks complete - return to regularly scheduled program");
88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mCurrentPosition = mSeekPosition = -1;
88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_BUFFERING_UPDATE:
8843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("buffering %d", ext1);
88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    case MEDIA_SET_VIDEO_SIZE:
8873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("New video size %d x %d", ext1, ext2);
88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoWidth = ext1;
88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mVideoHeight = ext2;
89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
891b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    case MEDIA_TIMED_TEXT:
8923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Received timed text message");
893b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        break;
894dcb89b3b505522efde173c105a851c412f947178Chong Zhang    case MEDIA_SUBTITLE_DATA:
895dcb89b3b505522efde173c105a851c412f947178Chong Zhang        ALOGV("Received subtitle data message");
896dcb89b3b505522efde173c105a851c412f947178Chong Zhang        break;
8970852843d304006e3ab333081fddda13b07193de8Robert Shih    case MEDIA_META_DATA:
8980852843d304006e3ab333081fddda13b07193de8Robert Shih        ALOGV("Received timed metadata message");
8990852843d304006e3ab333081fddda13b07193de8Robert Shih        break;
90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    default:
9013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        break;
90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaPlayerListener> listener = mListener;
9061af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams    if (locked) mLock.unlock();
90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // this prevents re-entrant calls into client code
90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if ((listener != 0) && send) {
91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
9113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("callback application");
912b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        listener->notify(msg, ext1, ext2, obj);
9133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("back from callback");
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
917dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaPlayer::died()
918dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
9193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("died");
920dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
921dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
922dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
9236b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenstatus_t MediaPlayer::setNextMediaPlayer(const sp<MediaPlayer>& next) {
9246b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    if (mPlayer == NULL) {
9256b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        return NO_INIT;
9266b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    }
927b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
928b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    if (next != NULL && !(next->mCurrentState &
929b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen            (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
930b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        ALOGE("next player is not prepared");
931b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen        return INVALID_OPERATION;
932b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen    }
933b13820ffafcb6bcdd33b6272676535afb4dff479Marco Nelissen
9346b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen    return mPlayer->setNextPlayer(next == NULL ? NULL : next->mPlayer);
9356b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen}
9366b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen
93740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
938