android_GenericMediaPlayer.cpp revision f6445d330c05ccc57d1adcc6ee05735a33f78881
14980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/* 24980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Copyright (C) 2011 The Android Open Source Project 34980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * 44980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Licensed under the Apache License, Version 2.0 (the "License"); 54980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * you may not use this file except in compliance with the License. 64980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * You may obtain a copy of the License at 74980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * 84980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * http://www.apache.org/licenses/LICENSE-2.0 94980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * 104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Unless required by applicable law or agreed to in writing, software 114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * distributed under the License is distributed on an "AS IS" BASIS, 124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * See the License for the specific language governing permissions and 144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * limitations under the License. 154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */ 164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//#define USE_LOG SLAndroidLogLevel_Verbose 184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include "sles_allinclusive.h" 204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include "android_GenericMediaPlayer.h" 214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <media/IMediaPlayerService.h> 234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <surfaceflinger/ISurfaceComposer.h> 244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <surfaceflinger/SurfaceComposerClient.h> 254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <media/stagefright/foundation/ADebug.h> 264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsennamespace android { 284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// default delay in Us used when reposting an event when the player is not ready to accept 304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing 314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms 324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenstatic const char* const kDistantProtocolPrefix[] = { "http:", "https:", "ftp:", "rtp:", "rtsp:"}; 344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0])) 354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------------------------------------------------------- 374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) : 384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGenericMediaPlayer(gmp), 394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPrepared(PREPARE_NOT_STARTED) 404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{ 414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()"); 424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenMediaPlayerNotificationClient::~MediaPlayerNotificationClient() { 454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()"); 464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// Map a MEDIA_* enum to a string 494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenstatic const char *media_to_string(int msg) 504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{ 514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen switch (msg) { 524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define _(x) case MEDIA_##x: return "MEDIA_" #x; 534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(PREPARED) 544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(SET_VIDEO_SIZE) 554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(SEEK_COMPLETE) 564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(PLAYBACK_COMPLETE) 574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(BUFFERING_UPDATE) 584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(ERROR) 594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(NOP) 604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(TIMED_TEXT) 614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen _(INFO) 624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#undef _ 634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen default: 644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen return NULL; 654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// IMediaPlayerClient implementation 704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) { 714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)", 724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen media_to_string(msg), msg, ext1, ext2); 734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen switch (msg) { 754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_PREPARED: 764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY; 774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPreparedCondition.signal(); 784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_SET_VIDEO_SIZE: 814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // only send video size updates if the player was flagged as having video, to avoid 824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // sending video size updates of (0,0) 834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mGenericMediaPlayer->mHasVideo) { 844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE, 854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (int32_t)ext1, (int32_t)ext2, true /*async*/); 864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_SEEK_COMPLETE: 904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGenericMediaPlayer->seekComplete(); 914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_PLAYBACK_COMPLETE: 944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_BUFFERING_UPDATE: 984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // values received from Android framework for buffer fill level use percent, 994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // while SL/XA use permille, so does GenericPlayer 1004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/); 1014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 1024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_ERROR: 1044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY; 1054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPreparedCondition.signal(); 1064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 1074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_NOP: 1094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_TIMED_TEXT: 1104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case MEDIA_INFO: 1114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 1124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen default: { } 1144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 1154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 1194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid MediaPlayerNotificationClient::beforePrepare() 1204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{ 1214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mLock); 1224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(mPlayerPrepared == PREPARE_NOT_STARTED); 1234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPrepared = PREPARE_IN_PROGRESS; 1244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 1274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 1284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mLock); 1294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(mPlayerPrepared != PREPARE_NOT_STARTED); 1304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen while (mPlayerPrepared == PREPARE_IN_PROGRESS) { 1314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPreparedCondition.wait(mLock); 1324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 1334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY || 1344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY); 1354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY; 1364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------------------------------------------------------- 1394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 1404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer(params), 1414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mHasVideo(hasVideo), 1424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mSeekTimeMsec(0), 1434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mVideoSurface(0), 1444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mVideoSurfaceTexture(0), 1454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer(0), 1464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerClient(0), 1474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoGenCount(0) 1484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{ 1494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 1504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mServiceManager = defaultServiceManager(); 1524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mBinder = mServiceManager->getService(String16("media.player")); 1534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 1544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen CHECK(mMediaPlayerService.get() != NULL); 1564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerClient = new MediaPlayerNotificationClient(this); 1584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenGenericMediaPlayer::~GenericMediaPlayer() { 1614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 1624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::preDestroy() { 1654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::preDestroy()"); 1664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // we might be in the middle of blocking for a getXXX call 1674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 1684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoGenCount++; 1704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoCondition.broadcast(); 1714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 1724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer::preDestroy(); 1734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 1744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 1754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 1764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// overridden from GenericPlayer 1774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// pre-condition: 1784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// msec != NULL 1794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// post-condition 1804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// *msec == mPositionMsec == 1814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// or the current MediaPlayer position 1834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::getPositionMsec(int* msec) { 1844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen uint32_t currentGen = 0; 1864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 1874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen currentGen = mGetMediaPlayerInfoGenCount; 1894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 1904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // send a message to update the MediaPlayer position in the event loop where it's safe to 1914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed 1924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (new AMessage(kWhatMediaPlayerInfo, id()))->post(); 1934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 1944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo 1964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // gets processed. 1974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen while (currentGen == mGetMediaPlayerInfoGenCount) { 1984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock); 1994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // if multiple GetPosition calls were issued before any got processed on the event queue 2004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // then they will all return the same "recent-enough" position 2014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // at this point mPositionMsec has been updated 2034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // so now updates msec from mPositionMsec, while holding the lock protecting it 2044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer::getPositionMsec(msec); 2054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 2094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 2104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::setVideoSurface()"); 2114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mVideoSurface = surface; 2124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 2154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()"); 2164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mVideoSurfaceTexture = surfaceTexture; 2174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 2204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) { 2214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::onMessageReceived()"); 2224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen switch (msg->what()) { 2234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen case kWhatMediaPlayerInfo: 2244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen onGetMediaPlayerInfo(); 2254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 2264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen default: 2284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer::onMessageReceived(msg); 2294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 2304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 2344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// Event handlers 2354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPrepare() { 2374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onPrepare()"); 2384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // Attempt to prepare at most once, and only if there is a MediaPlayer 2394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) { 2404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mHasVideo) { 2414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mVideoSurface != 0) { 2424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->setVideoSurface(mVideoSurface); 2434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (mVideoSurfaceTexture != 0) { 2444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 2454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->setAudioStreamType(mPlaybackParams.streamType); 2484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayerClient->beforePrepare(); 2494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->prepareAsync(); 2504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mPlayerClient->blockUntilPlayerPrepared()) { 2514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags |= kFlagPrepared; 2524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen afterMediaPlayerPreparedSuccessfully(); 2534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 2544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags |= kFlagPreparedUnsuccessfully; 2554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer::onPrepare(); 2574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 2594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPlay() { 2634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onPlay()"); 2644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 2654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("starting player"); 2664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->start(); 2674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags |= kFlagPlaying; 2684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 2694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 2704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPause() { 2754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onPause()"); 2764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 2774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->pause(); 2784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags &= ~kFlagPlaying; 2794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSeekComplete() { 2844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::onSeekComplete()"); 2854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // did we initiate the seek? 2864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (!(mStateFlags & kFlagSeeking)) { 2874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // no, are we looping? 2884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mStateFlags & kFlagLooping) { 2894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // yes, per OpenSL ES 1.0.1 and 1.1 do NOT report it to client 2904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 2914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // no, well that's surprising, but it's probably just a benign race condition 2924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 2934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGW("Unexpected seek complete event ignored"); 2944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 2964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen GenericPlayer::onSeekComplete(); 2974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 2984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 2994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/** 3014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 3024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */ 3034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 3044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::onSeek"); 3054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int64_t timeMsec = ANDROID_UNKNOWN_TIME; 3064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 3074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // invalid command, drop it 3084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen return; 3094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 3114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // already seeking to the same time, cancel this command 3124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen return; 3134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (mStateFlags & kFlagPreparedUnsuccessfully) { 3144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // discard seeks after unsuccessful prepare 3154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (!(mStateFlags & kFlagPrepared)) { 3164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // we are not ready to accept a seek command at this time, retry later 3174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 3184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 3194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 3204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags |= kFlagSeeking; 3214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mSeekTimeMsec = (int32_t)timeMsec; 3224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (OK != mPlayer->seekTo(timeMsec)) { 3234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags &= ~kFlagSeeking; 3244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 3254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 3264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPositionMsec = mSeekTimeMsec; 3274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 3314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 3344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::onLoop"); 3354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int32_t loop = 0; 3364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 3374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (loop) { 3384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags |= kFlagLooping; 3394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 3404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mStateFlags &= ~kFlagLooping; 3414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // if we have a MediaPlayer then tell it now, otherwise we'll tell it after it's created 3434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mPlayer != 0) { 3444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (void) mPlayer->setLooping(loop); 3454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 3484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onVolumeUpdate() { 3514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 3524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // use settings lock to read the volume settings 3534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mSettingsLock); 3544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mPlayer != 0) { 3554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 3564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mAndroidAudioLevels.mFinalVolume[1]); 3574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 3594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) { 3624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()"); 3634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int32_t effectId = 0; 3644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) { 3654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mPlayer != 0) { 3664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen status_t status; 3674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen status = mPlayer->attachAuxEffect(effectId); 3684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // attachAuxEffect returns a status but we have no way to report it back to app 3694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (void) status; 3704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 3734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) { 3764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()"); 3774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen float level = 0.0f; 3784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) { 3794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mPlayer != 0) { 3804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen status_t status; 3814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen status = mPlayer->setAuxEffectSendLevel(level); 3824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // setAuxEffectSendLevel returns a status but we have no way to report it back to app 3834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (void) status; 3844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 3864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 3874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 3904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int32_t fillLevel = 0; 3914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 3924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 3934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 3944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mSettingsLock); 3954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mCacheFill = fillLevel; 3964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // handle cache fill update 3974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 3984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen notifyCacheFill(); 3994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // handle prefetch status update 4014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // compute how much time ahead of position is buffered 4024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int durationMsec, positionMsec = -1; 4034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 4044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen && (OK == mPlayer->getDuration(&durationMsec)) 4054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 4064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((-1 != durationMsec) && (-1 != positionMsec)) { 4074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // evaluate prefetch status based on buffer time thresholds 4084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 4094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen CacheStatus_t newCacheStatus = mCacheStatus; 4104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 4114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen newCacheStatus = kStatusHigh; 4124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 4134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen newCacheStatus = kStatusEnough; 4144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 4154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen newCacheStatus = kStatusIntermediate; 4164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else if (bufferedDurationMsec == 0) { 4174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen newCacheStatus = kStatusEmpty; 4184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 4194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen newCacheStatus = kStatusLow; 4204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (newCacheStatus != mCacheStatus) { 4234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mCacheStatus = newCacheStatus; 4244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen notifyStatus(); 4254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 4294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)"); 4304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 4324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onGetMediaPlayerInfo() { 4354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()"); 4364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 4374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 4384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) { 4404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPositionMsec = ANDROID_UNKNOWN_TIME; 4414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 4424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mPlayer->getCurrentPosition(&mPositionMsec); 4434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // the MediaPlayer info has been refreshed 4464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoGenCount++; 4474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal 4484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mGetMediaPlayerInfoCondition.broadcast(); 4494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 4514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 4534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//-------------------------------------------------- 4544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/** 4554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * called from GenericMediaPlayer::onPrepare after the MediaPlayer mPlayer is prepared successfully 4564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * pre-conditions: 4574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * mPlayer != 0 4584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * mPlayer is prepared successfully 4594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */ 4604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::afterMediaPlayerPreparedSuccessfully() { 4614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGV("GenericMediaPlayer::afterMediaPlayerPrepared()"); 4624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(mPlayer != 0); 4634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(mStateFlags & kFlagPrepared); 4644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // retrieve channel count 4654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen assert(UNKNOWN_NUMCHANNELS == mChannelCount); 4664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Parcel *reply = new Parcel(); 4674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply); 4684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (status == NO_ERROR) { 4694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mChannelCount = reply->readInt32(); 4704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 4714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo 4724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mChannelCount = 2; 4734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (UNKNOWN_NUMCHANNELS != mChannelCount) { 4754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // now that we know the channel count, re-calculate the volumes 4764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/); 4774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 4784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen LOGW("channel count is still unknown after prepare"); 4794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen delete reply; 4814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // retrieve duration 4824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 4834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mSettingsLock); 4844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen int msec = 0; 4854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (OK == mPlayer->getDuration(&msec)) { 4864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mDurationMsec = msec; 4874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // now that we have a MediaPlayer, set the looping flag 4904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (mStateFlags & kFlagLooping) { 4914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen (void) mPlayer->setLooping(1); 4924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 4934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 4944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen // if the data source was local, and the buffers are considered full so we need to notify that 4954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen bool isLocalSource = true; 4964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (kDataLocatorUri == mDataLocatorType) { 4974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 4984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (!strncasecmp(mDataLocator.uriRef, 4994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 5004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen isLocalSource = false; 5014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen break; 5024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 5034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 5044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 5054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen if (isLocalSource) { 5064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("media player prepared on local source"); 5074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen { 5084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen Mutex::Autolock _l(mSettingsLock); 5094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mCacheStatus = kStatusHigh; 5104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen mCacheFill = 1000; 5114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen notifyStatus(); 5124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen notifyCacheFill(); 5134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 5144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } else { 5154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen SL_LOGD("media player prepared on non-local source"); 5164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen } 5174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} 5184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen 5194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} // namespace android 5204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen