android_GenericMediaPlayer.cpp revision 99b927751677abfb60a388d65dfeed1fed1db12c
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2011 The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define USE_LOG SLAndroidLogLevel_Verbose 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include "sles_allinclusive.h" 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "android_GenericMediaPlayer.h" 212606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/IMediaPlayerService.h> 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <surfaceflinger/ISurfaceComposer.h> 242606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <surfaceflinger/SurfaceComposerClient.h> 25c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 2667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 272606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangnamespace android { 28c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker 291a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian// default delay in Us used when reposting an event when the player is not ready to accept 30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing 3167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic const char* const kDistantProtocolPrefix[] = { "http:", "https:", "ftp:", "rtp:", "rtsp:"}; 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0])) 355b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 36ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber//-------------------------------------------------------------------------------------------------- 375778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) : 387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mGenericMediaPlayer(gmp), 392606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mPlayerPrepared(PREPARE_NOT_STARTED) 406f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen{ 41e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()"); 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 43744f5739019d1fd917f981e740b353c3d73fd1a8David Smith 445778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaPlayerNotificationClient::~MediaPlayerNotificationClient() { 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()"); 462606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 472606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 482606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// Map a MEDIA_* enum to a string 49e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const char *media_to_string(int msg) 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber{ 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg) { 5267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#define _(x) case MEDIA_##x: return "MEDIA_" #x; 5367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(PREPARED) 5467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(SET_VIDEO_SIZE) 5567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(SEEK_COMPLETE) 5667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(PLAYBACK_COMPLETE) 5767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(BUFFERING_UPDATE) 5867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(ERROR) 5967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(NOP) 6067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(TIMED_TEXT) 6167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu _(INFO) 6267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#undef _ 6367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu default: 6467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu return NULL; 6567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 6667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu} 6767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 6867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu//-------------------------------------------------- 6967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu// IMediaPlayerClient implementation 7067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) { 7167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)", 7267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu media_to_string(msg), msg, ext1, ext2); 7367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 7467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu switch (msg) { 7567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu case MEDIA_PREPARED: 7667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY; 7767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayerPreparedCondition.signal(); 7867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu break; 7967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 8067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu case MEDIA_SET_VIDEO_SIZE: 8167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // only send video size updates if the player was flagged as having video, to avoid 828f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu // sending video size updates of (0,0) 838f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu if (mGenericMediaPlayer->mHasVideo) { 848f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE, 858f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu (int32_t)ext1, (int32_t)ext2, true /*async*/); 868f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu } 878f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu break; 888f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 898f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu case MEDIA_SEEK_COMPLETE: 908f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu mGenericMediaPlayer->seekComplete(); 918f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu break; 928f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu 938f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu case MEDIA_PLAYBACK_COMPLETE: 948f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 958f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu break; 9667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 9767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu case MEDIA_BUFFERING_UPDATE: 9867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // values received from Android framework for buffer fill level use percent, 9967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // while SL/XA use permille, so does GenericPlayer 10067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/); 10167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu break; 10267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 10367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu case MEDIA_ERROR: 10467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY; 10567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayerPreparedCondition.signal(); 1062606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang break; 1072606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 108d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang case MEDIA_NOP: 1092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang case MEDIA_TIMED_TEXT: 1102606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang case MEDIA_INFO: 1112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang break; 1122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1132606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang default: { } 114d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang } 1152606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1162606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 117d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 118d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//-------------------------------------------------- 119d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid MediaPlayerNotificationClient::beforePrepare() 120d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang{ 121d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang Mutex::Autolock _l(mLock); 122d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang assert(mPlayerPrepared == PREPARE_NOT_STARTED); 123d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mPlayerPrepared = PREPARE_IN_PROGRESS; 124d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang} 1252606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1262606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//-------------------------------------------------- 1272606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 128d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang Mutex::Autolock _l(mLock); 129d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang assert(mPlayerPrepared != PREPARE_NOT_STARTED); 130d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang while (mPlayerPrepared == PREPARE_IN_PROGRESS) { 131d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mPlayerPreparedCondition.wait(mLock); 132d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang } 1332606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY || 1342606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY); 1352606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY; 1362606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 1372606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1382606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//-------------------------------------------------------------------------------------------------- 1392606b10d51c2dceb851a2ea63e803aba4134bf00Chong ZhangGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 140d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang GenericPlayer(params), 141d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mHasVideo(hasVideo), 142d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mSeekTimeMsec(0), 143d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mVideoSurface(0), 144d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mVideoSurfaceTexture(0), 145d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mPlayer(0), 146d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mPlayerClient(0), 1472606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mGetMediaPlayerInfoGenCount(0) 1482606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang{ 1492606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 150d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 151d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mServiceManager = defaultServiceManager(); 1522606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBinder = mServiceManager->getService(String16("media.player")); 1532606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder); 154d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 155d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang CHECK(mMediaPlayerService.get() != NULL); 156d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 15745c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang mPlayerClient = new MediaPlayerNotificationClient(this); 158d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang} 159d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 160d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong ZhangGenericMediaPlayer::~GenericMediaPlayer() { 161d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 162d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang} 163d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 164d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid GenericMediaPlayer::preDestroy() { 165d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang SL_LOGD("GenericMediaPlayer::preDestroy()"); 166d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang // we might be in the middle of blocking for a getXXX call 167d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang { 168d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 169d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mGetMediaPlayerInfoGenCount++; 170d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mGetMediaPlayerInfoCondition.broadcast(); 171d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang } 172d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang GenericPlayer::preDestroy(); 1732606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 1742606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1752606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//-------------------------------------------------- 1762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// overridden from GenericPlayer 177d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// pre-condition: 178d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// msec != NULL 179d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// post-condition 180d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// *msec == mPositionMsec == 1812606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1822606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// or the current MediaPlayer position 1832606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::getPositionMsec(int* msec) { 1842606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1852606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang uint32_t currentGen = 0; 186d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang { 1872606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 1882606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang currentGen = mGetMediaPlayerInfoGenCount; 1892606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 1902606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang // send a message to update the MediaPlayer position in the event loop where it's safe to 1912606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang // access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed 192d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang (new AMessage(kWhatMediaPlayerInfo, id()))->post(); 19345c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang { 19445c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 195d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo 196d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang // gets processed. 1972606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang while (currentGen == mGetMediaPlayerInfoGenCount) { 1982606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock); 1992606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang // if multiple GetPosition calls were issued before any got processed on the event queue 2002606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang // then they will all return the same "recent-enough" position 201d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang } 202d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang // at this point mPositionMsec has been updated 203d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang // so now updates msec from mPositionMsec, while holding the lock protecting it 204d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang GenericPlayer::getPositionMsec(msec); 2052606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 2062606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 2072606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 2082606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//-------------------------------------------------- 2092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 210d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang SL_LOGV("GenericMediaPlayer::setVideoSurface()"); 2112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mVideoSurface = surface; 2122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 2132606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 2142606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 2152606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()"); 216d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang mVideoSurfaceTexture = surfaceTexture; 21745c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang} 21845c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang 219d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//-------------------------------------------------- 220d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) { 2212606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang SL_LOGV("GenericMediaPlayer::onMessageReceived()"); 2222606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang switch (msg->what()) { 223d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang case kWhatMediaPlayerInfo: 224d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang onGetMediaPlayerInfo(); 225d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang break; 226d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 227d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang default: 228d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang GenericPlayer::onMessageReceived(msg); 229d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang break; 230d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang } 231d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang} 232d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang 233d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//-------------------------------------------------- 23467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu// Event handlers 23567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 23667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPrepare() { 23767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("GenericMediaPlayer::onPrepare()"); 23867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // Attempt to prepare at most once, and only if there is a MediaPlayer 23967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) { 24067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (mHasVideo) { 24167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (mVideoSurface != 0) { 24267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->setVideoSurface(mVideoSurface); 24367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else if (mVideoSurfaceTexture != 0) { 24467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 24567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 24667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 24767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->setAudioStreamType(mPlaybackParams.streamType); 24867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayerClient->beforePrepare(); 24967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->prepareAsync(); 25067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mStateFlags |= mPlayerClient->blockUntilPlayerPrepared() ? 251e4237177a4a3eea059cd74247b2d770d301a8230Ronghua Wu kFlagPrepared : kFlagPreparedUnsuccessfully; 25267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu onAfterMediaPlayerPrepared(); 25367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu GenericPlayer::onPrepare(); 25467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 25567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 25667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu} 25767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 25867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 25967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPlay() { 26067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("GenericMediaPlayer::onPlay()"); 26167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 26267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("starting player"); 26367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->start(); 26467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mStateFlags |= kFlagPlaying; 26567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else { 26667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 26767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu} 26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPause() { 27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("GenericMediaPlayer::onPause()"); 27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) { 27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mPlayer->pause(); 27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mStateFlags &= ~kFlagPlaying; 27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu} 27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 27967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu/** 28067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 28167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu */ 28267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGV("GenericMediaPlayer::onSeek"); 28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t timeMsec = ANDROID_UNKNOWN_TIME; 28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 28667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // invalid command, drop it 28767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu return; 28867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber // already seeking to the same time, cancel this command 291251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return; 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mStateFlags & kFlagPreparedUnsuccessfully) { 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber // discard seeks after unsuccessful prepare 294251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else if (!(mStateFlags & kFlagPrepared)) { 295251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // we are not ready to accept a seek command at this time, retry later 296251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 297251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 298251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStateFlags |= kFlagSeeking; 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSeekTimeMsec = (int32_t)timeMsec; 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (OK != mPlayer->seekTo(timeMsec)) { 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStateFlags &= ~kFlagSeeking; 303251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPositionMsec = mSeekTimeMsec; 306251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 307251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 308251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 309251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 310251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3125778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGV("GenericMediaPlayer::onLoop"); 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t loop = 0; 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 31692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) { 3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (loop) { 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStateFlags |= kFlagLooping; 319251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStateFlags &= ~kFlagLooping; 321ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar } 322ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar } 3232606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 3242606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 32567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 32667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3275778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onVolumeUpdate() { 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber // use settings lock to read the volume settings 3306507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden Mutex::Autolock _l(mSettingsLock); 3313d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang if (mPlayer != 0) { 3323d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAndroidAudioLevels.mFinalVolume[1]); 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 33767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 3385778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) { 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()"); 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t effectId = 0; 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) { 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mPlayer != 0) { 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t status; 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber status = mPlayer->attachAuxEffect(effectId); 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber // attachAuxEffect returns a status but we have no way to report it back to app 3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber (void) status; 3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3525778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) { 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()"); 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber float level = 0.0f; 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) { 356c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mPlayer != 0) { 3573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar status_t status; 358c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang status = mPlayer->setAuxEffectSendLevel(level); 359c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // setAuxEffectSendLevel returns a status but we have no way to report it back to app 360c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang (void) status; 361c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 362c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 363dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung} 36467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 36567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu 366671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnarvoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 367671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar int32_t fillLevel = 0; 368671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 369671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 370671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber Mutex::Autolock _l(mSettingsLock); 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCacheFill = fillLevel; 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber // handle cache fill update 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 375744f5739019d1fd917f981e740b353c3d73fd1a8David Smith notifyCacheFill(); 376bcc1a8299224b35aa2d16cf522d4aa5bcfa1ab60Andy Hung } 377744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // handle prefetch status update 378744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // compute how much time ahead of position is buffered 379bcc1a8299224b35aa2d16cf522d4aa5bcfa1ab60Andy Hung int durationMsec, positionMsec = -1; 380744f5739019d1fd917f981e740b353c3d73fd1a8David Smith if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 381744f5739019d1fd917f981e740b353c3d73fd1a8David Smith && (OK == mPlayer->getDuration(&durationMsec)) 382744f5739019d1fd917f981e740b353c3d73fd1a8David Smith && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 383744f5739019d1fd917f981e740b353c3d73fd1a8David Smith if ((-1 != durationMsec) && (-1 != positionMsec)) { 384744f5739019d1fd917f981e740b353c3d73fd1a8David Smith // evaluate prefetch status based on buffer time thresholds 38567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 386dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung CacheStatus_t newCacheStatus = mCacheStatus; 38767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 3886f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen newCacheStatus = kStatusHigh; 3896f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 3906f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen newCacheStatus = kStatusEnough; 39167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 3926f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen newCacheStatus = kStatusIntermediate; 3936f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else if (bufferedDurationMsec == 0) { 39460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar newCacheStatus = kStatusEmpty; 39548a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung } else { 39648a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung newCacheStatus = kStatusLow; 39748a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung } 39848a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung 3996f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (newCacheStatus != mCacheStatus) { 4006f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen mCacheStatus = newCacheStatus; 40160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar notifyStatus(); 40260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } 40360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } 40460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } 40560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } else { 40667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)"); 40760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } 4086f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen} 4096f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen 4106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen 4115778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onGetMediaPlayerInfo() { 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()"); 41367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu { 41467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) { 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPositionMsec = ANDROID_UNKNOWN_TIME; 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPlayer->getCurrentPosition(&mPositionMsec); 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the MediaPlayer info has been refreshed 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mGetMediaPlayerInfoGenCount++; 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mGetMediaPlayerInfoCondition.broadcast(); 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4281d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4301d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar//-------------------------------------------------- 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber/** 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber * called from the event handling loop after the MediaPlayer mPlayer is prepared 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber * pre-conditions: 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber * mPlayer != 0 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber * mPlayer is prepared 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 4375778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onAfterMediaPlayerPrepared() { 43867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGV("GenericMediaPlayer::onAfterMediaPlayerPrepared()"); 43967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu assert(mPlayer != 0); 44067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // retrieve channel count 441c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu assert(UNKNOWN_NUMCHANNELS == mChannelCount); 442c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu Parcel *reply = new Parcel(); 44367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply); 44467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (status == NO_ERROR) { 44567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mChannelCount = reply->readInt32(); 44667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else { 44767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo 44867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu mChannelCount = 2; 44967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 45067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (UNKNOWN_NUMCHANNELS != mChannelCount) { 45167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // now that we know the channel count, re-calculate the volumes 45267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/); 45367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } else { 45467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu LOGW("channel count is still unknown after prepare"); 45567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 45667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu delete reply; 45767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu // retrieve duration 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber Mutex::Autolock _l(mSettingsLock); 460c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int msec = 0; 4611d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar if (OK == mPlayer->getDuration(&msec)) { 462c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mDurationMsec = msec; 463c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 464c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 465c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 466c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // if the data source was local, and the buffers are considered full so we need to notify that 467c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang bool isLocalSource = true; 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (kDataLocatorUri == mDataLocatorType) { 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 4701a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian if (!strncasecmp(mDataLocator.uriRef, 4711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber isLocalSource = false; 4731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar break; 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 47567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 47667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu } 47767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu if (isLocalSource) { 47867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu SL_LOGD("media player prepared on local source"); 47967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu { 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber Mutex::Autolock _l(mSettingsLock); 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCacheStatus = kStatusHigh; 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCacheFill = 1000; 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber notifyStatus(); 4841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber notifyCacheFill(); 4851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 4861bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 4871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber SL_LOGD("media player prepared on non-local source"); 4881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 4891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber} 4901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber