android_GenericMediaPlayer.cpp revision b2549c73290f1955f3a7731bf98446a45f295dfa
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{ 41b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()"); 4268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 4368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() { 45b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()"); 46b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten} 4768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 48b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten// Map a MEDIA_* enum to a string 49b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kastenstatic const char *media_to_string(int msg) 50b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten{ 51b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten switch (msg) { 52b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten#define _(x) case MEDIA_##x: return "MEDIA_" #x; 53b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(PREPARED) 54b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(SET_VIDEO_SIZE) 55b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(SEEK_COMPLETE) 56b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(PLAYBACK_COMPLETE) 57b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(BUFFERING_UPDATE) 58b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(ERROR) 59b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(NOP) 60b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(TIMED_TEXT) 61b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten _(INFO) 62b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten#undef _ 63b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten default: 64b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten return NULL; 65b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 6668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 6768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 6868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 6968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation 702f6d462d89356cdaa77299ca27b60c5cca198d98Gloria Wangvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) { 71b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)", 72b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten media_to_string(msg), msg, ext1, ext2); 7368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 7437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi switch (msg) { 7537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case MEDIA_PREPARED: 7668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPrepared = true; 7768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.signal(); 7837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 7937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 8037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case MEDIA_SET_VIDEO_SIZE: 814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // only send video size updates if the player was flagged as having video, to avoid 824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // sending video size updates of (0,0) 834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mGenericMediaPlayer->mHasVideo) { 844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE, 854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi (int32_t)ext1, (int32_t)ext2, true /*async*/); 864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_SEEK_COMPLETE: 904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->seekComplete(); 914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_PLAYBACK_COMPLETE: 944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case MEDIA_BUFFERING_UPDATE: 984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // values received from Android framework for buffer fill level use percent, 994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // while SL/XA use permille, so does GenericPlayer 1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/); 10137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 10237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 10381e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_ERROR: 10481e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_NOP: 10581e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_TIMED_TEXT: 10681e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_INFO: 10781e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten break; 10881e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 10937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi default: { } 11068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 11181e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 11268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi Mutex::Autolock _l(mLock); 11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi while (!mPlayerPrepared) { 11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.wait(mLock); 11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 12068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 12168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 12268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 12368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 12468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer(params), 12568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mHasVideo(hasVideo), 1267ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec(0), 12768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mVideoSurface(0), 128ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture(0), 12968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer(0), 1304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayerClient(0), 1314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount(0) 13268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 133e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 13468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 13568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mServiceManager = defaultServiceManager(); 13668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mBinder = mServiceManager->getService(String16("media.player")); 13768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 13868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 13968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi CHECK(mMediaPlayerService.get() != NULL); 14068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 14137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlayerClient = new MediaPlayerNotificationClient(this); 14268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 14368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 14468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() { 145e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 1464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 1474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() { 14935a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::preDestroy()"); 1504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // we might be in the middle of blocking for a getXXX call 1514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 1544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 1554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::preDestroy(); 1574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 15868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1604b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer 1614b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition: 1624b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// msec != NULL 1634b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition 1644b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// *msec == mPositionMsec == 1654b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// or the current MediaPlayer position 1674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) { 1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi uint32_t currentGen = 0; 1704b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1714b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1724b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi currentGen = mGetMediaPlayerInfoGenCount; 1734b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1744b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // send a message to update the MediaPlayer position in the event loop where it's safe to 1754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed 1764b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi (new AMessage(kWhatMediaPlayerInfo, id()))->post(); 1774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 1784b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1794b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo 1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // gets processed. 1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi while (currentGen == mGetMediaPlayerInfoGenCount) { 1824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock); 1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // if multiple GetPosition calls were issued before any got processed on the event queue 1844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // then they will all return the same "recent-enough" position 1854b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 1864b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // at this point mPositionMsec has been updated 1874b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // so now updates msec from mPositionMsec, while holding the lock protecting it 1884b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::getPositionMsec(msec); 1894b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 19068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 19168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 19268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 193ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 194b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::setVideoSurface()"); 195ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurface = surface; 196ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten} 197ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten 198ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 199b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()"); 200ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture = surfaceTexture; 20168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 20268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2034b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 2044b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) { 205b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::onMessageReceived()"); 2064b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi switch (msg->what()) { 2074b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi case kWhatMediaPlayerInfo: 2084b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi onGetMediaPlayerInfo(); 2094b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 2104b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 2114b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi default: 2124b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::onMessageReceived(msg); 2134b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi break; 2144b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 2154b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 21670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 21768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 21868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers 2194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() { 221e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare()"); 22268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 223ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mHasVideo) { 224ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mVideoSurface != 0) { 225ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurface(mVideoSurface); 226ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } else if (mVideoSurfaceTexture != 0) { 227ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 228ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } 22968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 23068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->setAudioStreamType(mPlaybackParams.streamType); 23168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->prepareAsync(); 23268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerClient->blockUntilPlayerPrepared(); 2334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onAfterMediaPlayerPrepared(); 23468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer::onPrepare(); 23568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 236e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 23768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 23868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 24068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() { 241e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPlay()"); 24268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 243e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("starting player"); 24468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->start(); 24568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags |= kFlagPlaying; 24668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } else { 24768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 24868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 24968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 25068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 25268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() { 253e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPause()"); 25468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 25568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->pause(); 25668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 25768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 25837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 25937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 2607ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/** 2617ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 2627ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */ 2634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 2644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onSeek"); 2657ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi int64_t timeMsec = ANDROID_UNKNOWN_TIME; 2667ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 2677ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // invalid command, drop it 2687ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2697ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 2707ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 2717ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // already seeking to the same time, cancel this command 2727ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2737ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else if (!(mStateFlags & kFlagPrepared)) { 2744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // we are not ready to accept a seek command at this time, retry later 2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 2764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 2787ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags |= kFlagSeeking; 2797ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = (int32_t)timeMsec; 2807ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (OK != mPlayer->seekTo(timeMsec)) { 2817ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags &= ~kFlagSeeking; 2827ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 2837ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else { 2847ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mPositionMsec = mSeekTimeMsec; 2854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onLoop"); 2934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t loop = 0; 2944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 295e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) { 2964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (loop) { 2974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags |= kFlagLooping; 2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags &= ~kFlagLooping; 3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 30637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() { 3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 30837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // use settings lock to read the volume settings 30937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mPlayer != 0) { 3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mAndroidAudioLevels.mMute) { 3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(0.0f, 0.0f); 3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1]); 3164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 31737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 3184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t fillLevel = 0; 3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 32568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = fillLevel; 3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle cache fill update 3294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 3304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle prefetch status update 3334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // compute how much time ahead of position is buffered 3344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int durationMsec, positionMsec = -1; 3354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 3364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getDuration(&durationMsec)) 3374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 3384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((-1 != durationMsec) && (-1 != positionMsec)) { 3394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // evaluate prefetch status based on buffer time thresholds 3404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 3414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t newCacheStatus = mCacheStatus; 3424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 3434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusHigh; 3444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 3454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEnough; 3464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 3474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusIntermediate; 3484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec == 0) { 3494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEmpty; 3504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusLow; 3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (newCacheStatus != mCacheStatus) { 3554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = newCacheStatus; 3564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 360b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } else { 361b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)"); 3624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onGetMediaPlayerInfo() { 3674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()"); 3684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi { 3694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 3704b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3714b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) { 3724b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPositionMsec = ANDROID_UNKNOWN_TIME; 3734b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } else { 3744b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mPlayer->getCurrentPosition(&mPositionMsec); 3754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3764b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // the MediaPlayer info has been refreshed 3784b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoGenCount++; 3794b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal 3804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi mGetMediaPlayerInfoCondition.broadcast(); 3814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 3824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 3834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//-------------------------------------------------- 3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/** 3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * called from the event handling loop 3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * pre-condition: mPlayer is prepared 3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */ 3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onAfterMediaPlayerPrepared() { 391b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::onAfterMediaPlayerPrepared()"); 3924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // the MediaPlayer mPlayer is prepared, retrieve its duration 39336b700a829b7a02b873b4cd0cdb0a95342b20a31Jean-Michel Trivi // FIXME retrieve channel count 3944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int msec = 0; 3974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (OK == mPlayer->getDuration(&msec)) { 3984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec = msec; 3994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 4024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // if the data source was local, and the buffers are considered full so we need to notify that 4034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi bool isLocalSource = true; 4044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 4054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 4064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (!strncasecmp(mDataLocator.uriRef, 4074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 4084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi isLocalSource = false; 4094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 4104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (isLocalSource) { 4144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on local source"); 4154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 4164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 4174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = kStatusHigh; 4184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = 1000; 4194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 4204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 4214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 4234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on non-local source"); 4244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 42568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 42668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 42768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android 428