android_GenericMediaPlayer.cpp revision e9236d046fdb5cac0696c42e03443a2439188146
168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi/*
268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi *
468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * you may not use this file except in compliance with the License.
668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * You may obtain a copy of the License at
768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi *
868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi *
1068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * See the License for the specific language governing permissions and
1468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi * limitations under the License.
1568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi */
1668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose
1868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include "sles_allinclusive.h"
2068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <media/IMediaPlayerService.h>
2168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <surfaceflinger/ISurfaceComposer.h>
2268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <surfaceflinger/SurfaceComposerClient.h>
2368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivinamespace android {
2568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
2737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel TriviMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
2837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mGenericMediaPlayer(gmp),
2968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerPrepared(false)
3068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
3168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
3368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
3568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
3768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
3968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation
4068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) {
4168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
4268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    switch (msg) {
4437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_PREPARED:
4568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPrepared = true;
4668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.signal();
4737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
4837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
4937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_SET_VIDEO_SIZE:
5037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
5137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi                (int32_t)ext1, (int32_t)ext2, true /*async*/);
5237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
5337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
5437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      default: { }
5568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
5668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
5768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
5868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
5968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
6068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    Mutex::Autolock _l(mLock);
6168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    while (!mPlayerPrepared) {
6268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.wait(mLock);
6368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
6468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
6568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
6668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
6768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
6868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericPlayer(params),
6968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mHasVideo(hasVideo),
7068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mVideoSurface(0),
71ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture(0),
7268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayer(0),
7368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerClient(0)
7468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
75e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
7668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
7768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mServiceManager = defaultServiceManager();
7868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mBinder = mServiceManager->getService(String16("media.player"));
7968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
8068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    CHECK(mMediaPlayerService.get() != NULL);
8268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mPlayerClient = new MediaPlayerNotificationClient(this);
8468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
8568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() {
87e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
8868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
9068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
9168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
92ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
93ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurface = surface;
94ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten}
95ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
96ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
97ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture = surfaceTexture;
9868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
9968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
10070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
10168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
10268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers
10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() {
104e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare()");
10568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
106ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        if (mHasVideo) {
107ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            if (mVideoSurface != 0) {
108ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurface(mVideoSurface);
109ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            } else if (mVideoSurfaceTexture != 0) {
110ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
111ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            }
11268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        }
11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->prepareAsync();
11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerClient->blockUntilPlayerPrepared();
11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericPlayer::onPrepare();
11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
118e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
12068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
12168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() {
122e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPlay()");
12368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
124e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi        SL_LOGD("starting player");
12568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->start();
12668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
12768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    } else {
12868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
12968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
13068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
13168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
13268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() {
133e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPause()");
13468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
13568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->pause();
13668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
13768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
13837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi}
13937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
14037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
14137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() {
14237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    // use settings lock to read the volume settings
14337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex::Autolock _l(mSettingsLock);
14437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    if (this->mAndroidAudioLevels.mMute) {
14537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        mPlayer->setVolume(0.0f, 0.0f);
14637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    } else {
14737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
14837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi                mAndroidAudioLevels.mFinalVolume[1]);
14937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    }
15068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
15268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android
154