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