android_GenericMediaPlayer.cpp revision 2b06e20ae32388f6e1dfd088d9773c34e6b1cb45
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17//#define USE_LOG SLAndroidLogLevel_Verbose 18 19#include "sles_allinclusive.h" 20#include <media/IMediaPlayerService.h> 21#include <surfaceflinger/ISurfaceComposer.h> 22#include <surfaceflinger/SurfaceComposerClient.h> 23#include "android_GenericMediaPlayer.h" 24 25namespace android { 26 27//-------------------------------------------------------------------------------------------------- 28MediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) : 29 mGenericMediaPlayer(gmp), 30 mPlayerPrepared(false) 31{ 32 33} 34 35MediaPlayerNotificationClient::~MediaPlayerNotificationClient() { 36 37} 38 39//-------------------------------------------------- 40// IMediaPlayerClient implementation 41void MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) { 42 SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2); 43 44 switch (msg) { 45 case MEDIA_PREPARED: 46 mPlayerPrepared = true; 47 mPlayerPreparedCondition.signal(); 48 break; 49 50 case MEDIA_SET_VIDEO_SIZE: 51 mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE, 52 (int32_t)ext1, (int32_t)ext2, true /*async*/); 53 break; 54 55 default: { } 56 } 57} 58 59//-------------------------------------------------- 60void MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 61 Mutex::Autolock _l(mLock); 62 while (!mPlayerPrepared) { 63 mPlayerPreparedCondition.wait(mLock); 64 } 65} 66 67//-------------------------------------------------------------------------------------------------- 68GenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 69 GenericPlayer(params), 70 mHasVideo(hasVideo), 71 mVideoSurface(0), 72 mVideoSurfaceTexture(0), 73 mPlayer(0), 74 mPlayerClient(0) 75{ 76 SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 77 78 mServiceManager = defaultServiceManager(); 79 mBinder = mServiceManager->getService(String16("media.player")); 80 mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 81 82 CHECK(mMediaPlayerService.get() != NULL); 83 84 mPlayerClient = new MediaPlayerNotificationClient(this); 85} 86 87GenericMediaPlayer::~GenericMediaPlayer() { 88 SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 89 90} 91 92//-------------------------------------------------- 93void GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 94 mVideoSurface = surface; 95} 96 97void GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 98 mVideoSurfaceTexture = surfaceTexture; 99} 100 101 102//-------------------------------------------------- 103// Event handlers 104void GenericMediaPlayer::onPrepare() { 105 SL_LOGD("GenericMediaPlayer::onPrepare()"); 106 if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 107 if (mHasVideo) { 108 if (mVideoSurface != 0) { 109 mPlayer->setVideoSurface(mVideoSurface); 110 } else if (mVideoSurfaceTexture != 0) { 111 mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 112 } 113 } 114 mPlayer->setAudioStreamType(mPlaybackParams.streamType); 115 mPlayer->prepareAsync(); 116 mPlayerClient->blockUntilPlayerPrepared(); 117 GenericPlayer::onPrepare(); 118 } 119 SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 120} 121 122void GenericMediaPlayer::onPlay() { 123 SL_LOGD("GenericMediaPlayer::onPlay()"); 124 if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 125 SL_LOGD("starting player"); 126 mPlayer->start(); 127 mStateFlags |= kFlagPlaying; 128 } else { 129 SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 130 } 131} 132 133void GenericMediaPlayer::onPause() { 134 SL_LOGD("GenericMediaPlayer::onPause()"); 135 if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 136 mPlayer->pause(); 137 mStateFlags &= ~kFlagPlaying; 138 } 139} 140 141 142void GenericMediaPlayer::onVolumeUpdate() { 143 // use settings lock to read the volume settings 144 Mutex::Autolock _l(mSettingsLock); 145 if (this->mAndroidAudioLevels.mMute) { 146 mPlayer->setVolume(0.0f, 0.0f); 147 } else { 148 mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 149 mAndroidAudioLevels.mFinalVolume[1]); 150 } 151 152} 153 154} // namespace android 155