android_GenericMediaPlayer.cpp revision 2f6d462d89356cdaa77299ca27b60c5cca198d98
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" 204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include "android_GenericMediaPlayer.h" 214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <media/IMediaPlayerService.h> 2368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <surfaceflinger/ISurfaceComposer.h> 2468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi#include <surfaceflinger/SurfaceComposerClient.h> 254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h> 2668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivinamespace android { 2868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi// default delay in Us used when reposting an event when the player is not ready to accept 304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing 314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms 324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivistatic const char* const kDistantProtocolPrefix[] = { "http:", "https:", "ftp:", "rtp:", "rtsp:"}; 344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0])) 354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 3737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel TriviMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) : 3837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mGenericMediaPlayer(gmp), 3968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPrepared(false) 4068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 4168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 4368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() { 4568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 4768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 4968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation 502f6d462d89356cdaa77299ca27b60c5cca198d98Gloria Wangvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) { 51e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten SL_LOGV("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2); 5268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 5337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi switch (msg) { 5437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case MEDIA_PREPARED: 5568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPrepared = true; 5668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.signal(); 5737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 5837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 5937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case MEDIA_SET_VIDEO_SIZE: 604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // only send video size updates if the player was flagged as having video, to avoid 614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // sending video size updates of (0,0) 624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mGenericMediaPlayer->mHasVideo) { 634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE, 644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi (int32_t)ext1, (int32_t)ext2, true /*async*/); 654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_SEEK_COMPLETE: 694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->seekComplete(); 704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_PLAYBACK_COMPLETE: 734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_BUFFERING_UPDATE: 774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // values received from Android framework for buffer fill level use percent, 784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // while SL/XA use permille, so does GenericPlayer 794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/); 8037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 8137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 8237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi default: { } 8368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 8468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 8568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 8668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 8768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 8868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi Mutex::Autolock _l(mLock); 8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi while (!mPlayerPrepared) { 9068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.wait(mLock); 9168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 9268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 9368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 9468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 9568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 9668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer(params), 9768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mHasVideo(hasVideo), 987ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec(0), 9968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mVideoSurface(0), 100ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture(0), 10168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer(0), 10268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerClient(0) 10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 104e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 10568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 10668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mServiceManager = defaultServiceManager(); 10768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mBinder = mServiceManager->getService(String16("media.player")); 10868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 10968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi CHECK(mMediaPlayerService.get() != NULL); 11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlayerClient = new MediaPlayerNotificationClient(this); 11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() { 116e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 12068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 121ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 122ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurface = surface; 123ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten} 124ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten 125ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 126ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture = surfaceTexture; 12768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 12868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 12970c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 13068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 13168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers 1324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 13368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() { 134e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare()"); 13568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 136ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mHasVideo) { 137ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mVideoSurface != 0) { 138ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurface(mVideoSurface); 139ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } else if (mVideoSurfaceTexture != 0) { 140ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 141ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } 14268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 14368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->setAudioStreamType(mPlaybackParams.streamType); 14468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->prepareAsync(); 14568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerClient->blockUntilPlayerPrepared(); 1464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onAfterMediaPlayerPrepared(); 14768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer::onPrepare(); 14868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 149e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 15068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 15168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 15368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() { 154e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPlay()"); 15568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 156e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("starting player"); 15768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->start(); 15868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags |= kFlagPlaying; 15968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } else { 16068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 16168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 16268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 16368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 16568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() { 166e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPause()"); 16768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 16868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->pause(); 16968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 17068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 17137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 17237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 1737ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/** 1747ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 1757ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */ 1764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 1774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onSeek"); 1787ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi int64_t timeMsec = ANDROID_UNKNOWN_TIME; 1797ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 1807ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // invalid command, drop it 1817ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 1827ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 1837ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 1847ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // already seeking to the same time, cancel this command 1857ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 1867ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else if (!(mStateFlags & kFlagPrepared)) { 1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // we are not ready to accept a seek command at this time, retry later 1884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 1917ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags |= kFlagSeeking; 1927ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = (int32_t)timeMsec; 1937ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (OK != mPlayer->seekTo(timeMsec)) { 1947ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags &= ~kFlagSeeking; 1957ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 1967ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else { 1977ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mPositionMsec = mSeekTimeMsec; 1984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 1994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 2054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onLoop"); 2064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t loop = 0; 2074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 208e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) { 2094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (loop) { 2104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags |= kFlagLooping; 2114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags &= ~kFlagLooping; 2134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 21937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() { 2204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 22137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // use settings lock to read the volume settings 22237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mPlayer != 0) { 2244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mAndroidAudioLevels.mMute) { 2254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(0.0f, 0.0f); 2264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 2284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1]); 2294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 23037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 2314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 2354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t fillLevel = 0; 2364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 2374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 23868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = fillLevel; 2414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle cache fill update 2424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 2434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 2444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle prefetch status update 2464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // compute how much time ahead of position is buffered 2474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int durationMsec, positionMsec = -1; 2484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 2494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getDuration(&durationMsec)) 2504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 2514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((-1 != durationMsec) && (-1 != positionMsec)) { 2524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // evaluate prefetch status based on buffer time thresholds 2534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 2544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t newCacheStatus = mCacheStatus; 2554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 2564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusHigh; 2574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 2584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEnough; 2594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 2604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusIntermediate; 2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec == 0) { 2624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEmpty; 2634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusLow; 2654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (newCacheStatus != mCacheStatus) { 2684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = newCacheStatus; 2694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 2704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//-------------------------------------------------- 2784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/** 2794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * called from the event handling loop 2804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * pre-condition: mPlayer is prepared 2814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */ 2824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onAfterMediaPlayerPrepared() { 2834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // the MediaPlayer mPlayer is prepared, retrieve its duration 28436b700a829b7a02b873b4cd0cdb0a95342b20a31Jean-Michel Trivi // FIXME retrieve channel count 2854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int msec = 0; 2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (OK == mPlayer->getDuration(&msec)) { 2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec = msec; 2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 2934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // if the data source was local, and the buffers are considered full so we need to notify that 2944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi bool isLocalSource = true; 2954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 2964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 2974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (!strncasecmp(mDataLocator.uriRef, 2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi isLocalSource = false; 3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (isLocalSource) { 3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on local source"); 3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = kStatusHigh; 3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = 1000; 3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on non-local source"); 3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 31668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 31768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 31868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android 319