android_GenericMediaPlayer.cpp revision 68d56b8ebaf60184a3aef988e3d2b09ed8b88c05
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//--------------------------------------------------------------------------------------------------
2768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::MediaPlayerNotificationClient() :
2868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerPrepared(false)
2968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
3068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
3268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
3468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
3668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
3868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation
3968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) {
4068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
4168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if (msg == MEDIA_PREPARED) {
4368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPrepared = true;
4468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.signal();
4568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
4668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
4768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
4968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
5068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    Mutex::Autolock _l(mLock);
5168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    while (!mPlayerPrepared) {
5268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.wait(mLock);
5368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
5468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
5568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
5668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
5768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
5868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericPlayer(params),
5968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mHasVideo(hasVideo),
6068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mVideoSurface(0),
6168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayer(0),
6268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerClient(0)
6368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
6468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::GenericMediaPlayer()");
6568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
6668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mServiceManager = defaultServiceManager();
6768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mBinder = mServiceManager->getService(String16("media.player"));
6868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
6968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
7068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    CHECK(mMediaPlayerService.get() != NULL);
7168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
7268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerClient = new MediaPlayerNotificationClient();
7368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
7468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
7568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() {
7668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::~GenericMediaPlayer()");
7768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
7868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
7968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
8168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::setVideoSurface(void* surface) {
8268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mVideoSurface = static_cast<Surface *>((ANativeWindow*)surface);
8368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
8468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
8668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers
8768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() {
8868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::onPrepare()");
8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
9068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        if (mHasVideo && (mVideoSurface != 0)) {
9168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi            mPlayer->setVideoSurface(mVideoSurface);
9268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        }
9368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
9468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->prepareAsync();
9568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerClient->blockUntilPlayerPrepared();
9668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericPlayer::onPrepare();
9768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
9868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
9968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
10068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
10168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() {
10268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::onPlay()");
10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
10468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        SL_LOGI("starting player");
10568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->start();
10668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
10768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    } else {
10868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
10968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
11068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
11268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() {
11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    SL_LOGI("GenericMediaPlayer::onPause()");
11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->pause();
11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
12068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
12168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android
122