android_GenericMediaPlayer.cpp revision 4b0e0b2860ffd5e246b42c8a434833cca2f068b3
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), 1024b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayerClient(0), 1034b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount(0) 10468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 105e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 10668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 10768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mServiceManager = defaultServiceManager(); 10868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mBinder = mServiceManager->getService(String16("media.player")); 10968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 11068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi CHECK(mMediaPlayerService.get() != NULL); 11268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlayerClient = new MediaPlayerNotificationClient(this); 11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() { 117e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 1184b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 1194b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1204b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() { 1214b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // we might be in the middle of blocking for a getXXX call 1224b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1234b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1244b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 1254b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 1264b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1274b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::preDestroy(); 1284b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 12968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer 1324b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition: 1334b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// msec != NULL 1344b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition 1354b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// *msec == mPositionMsec == 1364b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1374b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// or the current MediaPlayer position 1384b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) { 1394b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi uint32_t currentGen = 0; 1414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi currentGen = mGetMediaPlayerInfoGenCount; 1444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // send a message to update the MediaPlayer position in the event loop where it's safe to 1464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed 1474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi (new AMessage(kWhatMediaPlayerInfo, id()))->post(); 1484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo 1514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // gets processed. 1524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi while (currentGen == mGetMediaPlayerInfoGenCount) { 1534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock); 1544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // if multiple GetPosition calls were issued before any got processed on the event queue 1554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // then they will all return the same "recent-enough" position 1564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // at this point mPositionMsec has been updated 1584b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // so now updates msec from mPositionMsec, while holding the lock protecting it 1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::getPositionMsec(msec); 1604b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 16168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 16268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 16368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 164ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 165ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurface = surface; 166ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten} 167ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten 168ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 169ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture = surfaceTexture; 17068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 17168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1724b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1734b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) { 1744b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi switch (msg->what()) { 1754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi case kWhatMediaPlayerInfo: 1764b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi onGetMediaPlayerInfo(); 1774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 1784b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1794b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi default: 1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::onMessageReceived(msg); 1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 1824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 18470c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 18568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 18668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers 1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 18868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() { 189e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare()"); 19068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 191ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mHasVideo) { 192ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mVideoSurface != 0) { 193ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurface(mVideoSurface); 194ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } else if (mVideoSurfaceTexture != 0) { 195ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 196ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } 19768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 19868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->setAudioStreamType(mPlaybackParams.streamType); 19968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->prepareAsync(); 20068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerClient->blockUntilPlayerPrepared(); 2014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onAfterMediaPlayerPrepared(); 20268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer::onPrepare(); 20368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 204e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 20568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 20668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 20868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() { 209e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPlay()"); 21068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 211e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("starting player"); 21268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->start(); 21368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags |= kFlagPlaying; 21468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } else { 21568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 21668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 21768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 21868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() { 221e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPause()"); 22268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 22368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->pause(); 22468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 22568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 22637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 22737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 2287ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/** 2297ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 2307ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */ 2314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 2324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onSeek"); 2337ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi int64_t timeMsec = ANDROID_UNKNOWN_TIME; 2347ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 2357ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // invalid command, drop it 2367ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2377ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 2387ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 2397ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // already seeking to the same time, cancel this command 2407ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2417ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else if (!(mStateFlags & kFlagPrepared)) { 2424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // we are not ready to accept a seek command at this time, retry later 2434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 2444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 2467ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags |= kFlagSeeking; 2477ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = (int32_t)timeMsec; 2487ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (OK != mPlayer->seekTo(timeMsec)) { 2497ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags &= ~kFlagSeeking; 2507ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 2517ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else { 2527ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mPositionMsec = mSeekTimeMsec; 2534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 2604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onLoop"); 2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t loop = 0; 2624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 263e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) { 2644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (loop) { 2654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags |= kFlagLooping; 2664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags &= ~kFlagLooping; 2684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 27437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() { 2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 27637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // use settings lock to read the volume settings 27737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mPlayer != 0) { 2794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mAndroidAudioLevels.mMute) { 2804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(0.0f, 0.0f); 2814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 2834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1]); 2844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 28537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t fillLevel = 0; 2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 29368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 2954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = fillLevel; 2964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle cache fill update 2974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle prefetch status update 3014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // compute how much time ahead of position is buffered 3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int durationMsec, positionMsec = -1; 3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getDuration(&durationMsec)) 3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((-1 != durationMsec) && (-1 != positionMsec)) { 3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // evaluate prefetch status based on buffer time thresholds 3084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t newCacheStatus = mCacheStatus; 3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusHigh; 3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEnough; 3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusIntermediate; 3164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec == 0) { 3174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEmpty; 3184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusLow; 3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (newCacheStatus != mCacheStatus) { 3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = newCacheStatus; 3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3324b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onGetMediaPlayerInfo() { 3334b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()"); 3344b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 3354b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 3364b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3374b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) { 3384b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPositionMsec = ANDROID_UNKNOWN_TIME; 3394b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } else { 3404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayer->getCurrentPosition(&mPositionMsec); 3414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // the MediaPlayer info has been refreshed 3444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 3454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal 3464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 3474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 3494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//-------------------------------------------------- 3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/** 3534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * called from the event handling loop 3544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * pre-condition: mPlayer is prepared 3554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */ 3564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onAfterMediaPlayerPrepared() { 3574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // the MediaPlayer mPlayer is prepared, retrieve its duration 35836b700a829b7a02b873b4cd0cdb0a95342b20a31Jean-Michel Trivi // FIXME retrieve channel count 3594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int msec = 0; 3624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (OK == mPlayer->getDuration(&msec)) { 3634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec = msec; 3644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 3674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // if the data source was local, and the buffers are considered full so we need to notify that 3684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi bool isLocalSource = true; 3694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 3704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 3714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (!strncasecmp(mDataLocator.uriRef, 3724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 3734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi isLocalSource = false; 3744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (isLocalSource) { 3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on local source"); 3804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = kStatusHigh; 3834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = 1000; 3844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on non-local source"); 3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 39068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 39168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 39268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android 393