android_GenericMediaPlayer.cpp revision 81e917a2605e14901b8f5e6cac7eafb5667aad0d
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 17de015407a89018f9422254624e1b75703f38defdGlenn Kasten//#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 8281e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_ERROR: 8381e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_NOP: 8481e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_TIMED_TEXT: 8581e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_INFO: 8681e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten break; 8781e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 8837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi default: { } 8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 9081e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 9168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 9268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 9368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 9468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 9568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi Mutex::Autolock _l(mLock); 9668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi while (!mPlayerPrepared) { 9768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.wait(mLock); 9868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 9968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 10068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 10168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 10268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer(params), 10468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mHasVideo(hasVideo), 1057ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec(0), 10668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mVideoSurface(0), 107ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture(0), 10868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer(0), 1094b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayerClient(0), 1104b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount(0) 11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 112e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mServiceManager = defaultServiceManager(); 11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mBinder = mServiceManager->getService(String16("media.player")); 11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi CHECK(mMediaPlayerService.get() != NULL); 11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 12037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlayerClient = new MediaPlayerNotificationClient(this); 12168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 12268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 12368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() { 124e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 1254b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 1264b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1274b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() { 12835a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::preDestroy()"); 1294b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // we might be in the middle of blocking for a getXXX call 1304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1324b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 1334b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 1344b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1354b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::preDestroy(); 1364b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 13768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1384b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1394b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer 1404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition: 1414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// msec != NULL 1424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition 1434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// *msec == mPositionMsec == 1444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// or the current MediaPlayer position 1464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) { 1474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi uint32_t currentGen = 0; 1494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi currentGen = mGetMediaPlayerInfoGenCount; 1524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // send a message to update the MediaPlayer position in the event loop where it's safe to 1544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed 1554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi (new AMessage(kWhatMediaPlayerInfo, id()))->post(); 1564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1584b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo 1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // gets processed. 1604b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi while (currentGen == mGetMediaPlayerInfoGenCount) { 1614b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock); 1624b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // if multiple GetPosition calls were issued before any got processed on the event queue 1634b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // then they will all return the same "recent-enough" position 1644b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1654b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // at this point mPositionMsec has been updated 1664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // so now updates msec from mPositionMsec, while holding the lock protecting it 1674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::getPositionMsec(msec); 1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 16968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 17068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 17168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 172ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 173ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurface = surface; 174ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten} 175ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten 176ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 177ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture = surfaceTexture; 17868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 17968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) { 1824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi switch (msg->what()) { 1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi case kWhatMediaPlayerInfo: 1844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi onGetMediaPlayerInfo(); 1854b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 1864b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1874b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi default: 1884b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::onMessageReceived(msg); 1894b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 1904b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1914b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 19270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 19368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 19468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers 1954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 19668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() { 197e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare()"); 19868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 199ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mHasVideo) { 200ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mVideoSurface != 0) { 201ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurface(mVideoSurface); 202ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } else if (mVideoSurfaceTexture != 0) { 203ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 204ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } 20568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 20668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->setAudioStreamType(mPlaybackParams.streamType); 20768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->prepareAsync(); 20868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerClient->blockUntilPlayerPrepared(); 2094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onAfterMediaPlayerPrepared(); 21068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer::onPrepare(); 21168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 212e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 21368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 21468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 21668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() { 217e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPlay()"); 21868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 219e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("starting player"); 22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->start(); 22168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags |= kFlagPlaying; 22268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } else { 22368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 22468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 22568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 22668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 22868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() { 229e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPause()"); 23068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 23168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->pause(); 23268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 23368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 23437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 23537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 2367ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/** 2377ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 2387ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */ 2394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 2404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onSeek"); 2417ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi int64_t timeMsec = ANDROID_UNKNOWN_TIME; 2427ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 2437ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // invalid command, drop it 2447ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2457ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 2467ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 2477ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // already seeking to the same time, cancel this command 2487ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2497ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else if (!(mStateFlags & kFlagPrepared)) { 2504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // we are not ready to accept a seek command at this time, retry later 2514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 2524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 2547ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags |= kFlagSeeking; 2557ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = (int32_t)timeMsec; 2567ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (OK != mPlayer->seekTo(timeMsec)) { 2577ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags &= ~kFlagSeeking; 2587ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 2597ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else { 2607ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mPositionMsec = mSeekTimeMsec; 2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 2684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onLoop"); 2694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t loop = 0; 2704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 271e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) { 2724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (loop) { 2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags |= kFlagLooping; 2744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags &= ~kFlagLooping; 2764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 28237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() { 2834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 28437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // use settings lock to read the volume settings 28537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mPlayer != 0) { 2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mAndroidAudioLevels.mMute) { 2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(0.0f, 0.0f); 2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1]); 2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 29337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 2944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t fillLevel = 0; 2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 30168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = fillLevel; 3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle cache fill update 3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle prefetch status update 3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // compute how much time ahead of position is buffered 3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int durationMsec, positionMsec = -1; 3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getDuration(&durationMsec)) 3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((-1 != durationMsec) && (-1 != positionMsec)) { 3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // evaluate prefetch status based on buffer time thresholds 3164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 3174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t newCacheStatus = mCacheStatus; 3184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 3194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusHigh; 3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEnough; 3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusIntermediate; 3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec == 0) { 3254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEmpty; 3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusLow; 3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (newCacheStatus != mCacheStatus) { 3314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = newCacheStatus; 3324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onGetMediaPlayerInfo() { 3414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()"); 3424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 3434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 3444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) { 3464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPositionMsec = ANDROID_UNKNOWN_TIME; 3474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } else { 3484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayer->getCurrentPosition(&mPositionMsec); 3494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // the MediaPlayer info has been refreshed 3524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 3534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal 3544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 3554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 3574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3584b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//-------------------------------------------------- 3604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/** 3614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * called from the event handling loop 3624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * pre-condition: mPlayer is prepared 3634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */ 3644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onAfterMediaPlayerPrepared() { 3654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // the MediaPlayer mPlayer is prepared, retrieve its duration 36636b700a829b7a02b873b4cd0cdb0a95342b20a31Jean-Michel Trivi // FIXME retrieve channel count 3674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int msec = 0; 3704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (OK == mPlayer->getDuration(&msec)) { 3714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec = msec; 3724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 3754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // if the data source was local, and the buffers are considered full so we need to notify that 3764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi bool isLocalSource = true; 3774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (!strncasecmp(mDataLocator.uriRef, 3804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi isLocalSource = false; 3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (isLocalSource) { 3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on local source"); 3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = kStatusHigh; 3914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = 1000; 3924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on non-local source"); 3974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 39868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 39968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 40068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android 401