blob: b2565e9a6fe46b332eddf7440b228bd51e494321 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//#define USE_LOG SLAndroidLogLevel_Verbose
#include "sles_allinclusive.h"
#include <media/IMediaPlayerService.h>
#include <surfaceflinger/ISurfaceComposer.h>
#include <surfaceflinger/SurfaceComposerClient.h>
namespace android {
//--------------------------------------------------------------------------------------------------
MediaPlayerNotificationClient::MediaPlayerNotificationClient() :
mPlayerPrepared(false)
{
}
MediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
}
//--------------------------------------------------
// IMediaPlayerClient implementation
void MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) {
SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
if (msg == MEDIA_PREPARED) {
mPlayerPrepared = true;
mPlayerPreparedCondition.signal();
}
}
//--------------------------------------------------
void MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
Mutex::Autolock _l(mLock);
while (!mPlayerPrepared) {
mPlayerPreparedCondition.wait(mLock);
}
}
//--------------------------------------------------------------------------------------------------
GenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
GenericPlayer(params),
mHasVideo(hasVideo),
mVideoSurface(0),
mPlayer(0),
mPlayerClient(0)
{
SL_LOGI("GenericMediaPlayer::GenericMediaPlayer()");
mServiceManager = defaultServiceManager();
mBinder = mServiceManager->getService(String16("media.player"));
mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
CHECK(mMediaPlayerService.get() != NULL);
mPlayerClient = new MediaPlayerNotificationClient();
}
GenericMediaPlayer::~GenericMediaPlayer() {
SL_LOGI("GenericMediaPlayer::~GenericMediaPlayer()");
}
//--------------------------------------------------
void GenericMediaPlayer::setVideoSurface(void* surface) {
mVideoSurface = static_cast<Surface *>((ANativeWindow*)surface);
}
//--------------------------------------------------
// Event handlers
void GenericMediaPlayer::onPrepare() {
SL_LOGI("GenericMediaPlayer::onPrepare()");
if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
if (mHasVideo && (mVideoSurface != 0)) {
mPlayer->setVideoSurface(mVideoSurface);
}
mPlayer->setAudioStreamType(mPlaybackParams.streamType);
mPlayer->prepareAsync();
mPlayerClient->blockUntilPlayerPrepared();
GenericPlayer::onPrepare();
}
SL_LOGI("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
}
void GenericMediaPlayer::onPlay() {
SL_LOGI("GenericMediaPlayer::onPlay()");
if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
SL_LOGI("starting player");
mPlayer->start();
mStateFlags |= kFlagPlaying;
} else {
SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
}
}
void GenericMediaPlayer::onPause() {
SL_LOGI("GenericMediaPlayer::onPause()");
if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
mPlayer->pause();
mStateFlags &= ~kFlagPlaying;
}
}
} // namespace android