android_GenericMediaPlayer.cpp revision 85edd878a30caa535b0267d8d6e61b4ccc0d5fd0
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), 3949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPrepared(PREPARE_NOT_STARTED) 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: 7649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY; 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: 90f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten 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: 10449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY; 10549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPreparedCondition.signal(); 10649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten break; 10749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten 10881e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_NOP: 10981e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_TIMED_TEXT: 11081e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten case MEDIA_INFO: 11181e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten break; 11281e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 11337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi default: { } 11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 11581e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten 11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 11949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kastenvoid MediaPlayerNotificationClient::beforePrepare() 12049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten{ 12149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten Mutex::Autolock _l(mLock); 12249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten assert(mPlayerPrepared == PREPARE_NOT_STARTED); 12349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPrepared = PREPARE_IN_PROGRESS; 12449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten} 12549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten 12649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten//-------------------------------------------------- 12749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kastenbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() { 12868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi Mutex::Autolock _l(mLock); 12949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten assert(mPlayerPrepared != PREPARE_NOT_STARTED); 13049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten while (mPlayerPrepared == PREPARE_IN_PROGRESS) { 13168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayerPreparedCondition.wait(mLock); 13268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 13349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY || 13449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY); 13549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY; 13668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 13768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 13868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 13968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) : 14068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi GenericPlayer(params), 14168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mHasVideo(hasVideo), 1427ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec(0), 14368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mVideoSurface(0), 144ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture(0), 14568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer(0), 1465933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mPlayerClient(0) 14768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{ 148e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()"); 14968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 15037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlayerClient = new MediaPlayerNotificationClient(this); 15168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 15268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 15368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() { 154e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()"); 1554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 1564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi 1574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() { 15835a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::preDestroy()"); 1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi GenericPlayer::preDestroy(); 1604b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi} 16168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 1624b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//-------------------------------------------------- 1634b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer 1644b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition: 1654b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// msec != NULL 1664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition 1675933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten// *msec == 1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// ANDROID_UNKNOWN_TIME if position is unknown at time of query, 1694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// or the current MediaPlayer position 1704b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) { 1714b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::getPositionMsec()"); 1725933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten sp<IMediaPlayer> player; 1735933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten getPlayerPrepared(player); 1745933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // To avoid deadlock, directly call the MediaPlayer object 1755933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (player == 0 || player->getCurrentPosition(msec) != NO_ERROR) { 1765933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten *msec = ANDROID_UNKNOWN_TIME; 1774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi } 17868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 17968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 18068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 181ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) { 182b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::setVideoSurface()"); 183ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurface = surface; 184ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten} 185ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten 186ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 187b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()"); 188ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mVideoSurfaceTexture = surfaceTexture; 18968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 19068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 19170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 19268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//-------------------------------------------------- 19368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers 1944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 19585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten// blocks until mPlayer is prepared 19668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() { 197e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare()"); 19849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // Attempt to prepare at most once, and only if there is a MediaPlayer 19949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) { 200ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mHasVideo) { 201ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten if (mVideoSurface != 0) { 202ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurface(mVideoSurface); 203ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } else if (mVideoSurfaceTexture != 0) { 204ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture); 205ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten } 20668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 20768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->setAudioStreamType(mPlaybackParams.streamType); 20849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mPlayerClient->beforePrepare(); 20968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->prepareAsync(); 21006059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten if (mPlayerClient->blockUntilPlayerPrepared()) { 21106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten mStateFlags |= kFlagPrepared; 21206059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten afterMediaPlayerPreparedSuccessfully(); 21306059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten } else { 21406059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten mStateFlags |= kFlagPreparedUnsuccessfully; 21506059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten } 21668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 21785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten GenericPlayer::onPrepare(); 218e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 21968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 22268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() { 223e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPlay()"); 2245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (((mStateFlags & (kFlagPrepared | kFlagPlaying)) == kFlagPrepared) && (mPlayer != 0)) { 22568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->start(); 22668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 2275933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten GenericPlayer::onPlay(); 22868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 22968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 2304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 23168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() { 232e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onPause()"); 2335933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (!(~mStateFlags & (kFlagPrepared | kFlagPlaying)) && (mPlayer != 0)) { 23468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi mPlayer->pause(); 23568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi } 2365933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten GenericPlayer::onPause(); 23737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 23837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 239f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten 240f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kastenvoid GenericMediaPlayer::onSeekComplete() { 241f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten SL_LOGV("GenericMediaPlayer::onSeekComplete()"); 242f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten // did we initiate the seek? 243f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten if (!(mStateFlags & kFlagSeeking)) { 244f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten // no, are we looping? 245f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten if (mStateFlags & kFlagLooping) { 246f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten // yes, per OpenSL ES 1.0.1 and 1.1 do NOT report it to client 247f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten // notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/); 248f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten // no, well that's surprising, but it's probably just a benign race condition 249f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten } else { 250f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten SL_LOGW("Unexpected seek complete event ignored"); 251f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten } 252f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten } 253f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten GenericPlayer::onSeekComplete(); 254f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten} 255f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten 256f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten 2577ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/** 2587ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0 2597ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */ 2604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) { 2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onSeek"); 2627ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi int64_t timeMsec = ANDROID_UNKNOWN_TIME; 2637ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) { 2647ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // invalid command, drop it 2657ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 2667ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 2677ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) { 2687ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi // already seeking to the same time, cancel this command 2697ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 27049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten } else if (mStateFlags & kFlagPreparedUnsuccessfully) { 27149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // discard seeks after unsuccessful prepare 2727ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } else if (!(mStateFlags & kFlagPrepared)) { 2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // we are not ready to accept a seek command at this time, retry later 2744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US); 2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 2764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) { 2777ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags |= kFlagSeeking; 2787ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = (int32_t)timeMsec; 2797ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (OK != mPlayer->seekTo(timeMsec)) { 2807ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mStateFlags &= ~kFlagSeeking; 2817ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi mSeekTimeMsec = ANDROID_UNKNOWN_TIME; 2824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 2854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) { 2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericMediaPlayer::onLoop"); 2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t loop = 0; 2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) { 2929f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten if (loop) { 2939f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten mStateFlags |= kFlagLooping; 2949f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten } else { 2959f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten mStateFlags &= ~kFlagLooping; 2969f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten } 2979f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten // if we have a MediaPlayer then tell it now, otherwise we'll tell it after it's created 2989f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten if (mPlayer != 0) { 2999f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten (void) mPlayer->setLooping(loop); 3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 30537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() { 3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onVolumeUpdate()"); 30737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // use settings lock to read the volume settings 30837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mPlayer != 0) { 310fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0], 311fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mAndroidAudioLevels.mFinalVolume[1]); 31237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3163610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) { 3173610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()"); 3183610785fa93586ce84a27a27530feb77b8035229Glenn Kasten int32_t effectId = 0; 3193610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) { 3203610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (mPlayer != 0) { 3213610785fa93586ce84a27a27530feb77b8035229Glenn Kasten status_t status; 3223610785fa93586ce84a27a27530feb77b8035229Glenn Kasten status = mPlayer->attachAuxEffect(effectId); 3233610785fa93586ce84a27a27530feb77b8035229Glenn Kasten // attachAuxEffect returns a status but we have no way to report it back to app 3243610785fa93586ce84a27a27530feb77b8035229Glenn Kasten (void) status; 3253610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 3263610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 3273610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 3283610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3293610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3303610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) { 3313610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()"); 3323610785fa93586ce84a27a27530feb77b8035229Glenn Kasten float level = 0.0f; 3333610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) { 3343610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (mPlayer != 0) { 3353610785fa93586ce84a27a27530feb77b8035229Glenn Kasten status_t status; 3363610785fa93586ce84a27a27530feb77b8035229Glenn Kasten status = mPlayer->setAuxEffectSendLevel(level); 3373610785fa93586ce84a27a27530feb77b8035229Glenn Kasten // setAuxEffectSendLevel returns a status but we have no way to report it back to app 3383610785fa93586ce84a27a27530feb77b8035229Glenn Kasten (void) status; 3393610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 3403610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 3413610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 3423610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3433610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 3454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t fillLevel = 0; 3464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) { 3474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel); 34868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 3494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 3504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = fillLevel; 3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle cache fill update 3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) { 3534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 3544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // handle prefetch status update 3564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // compute how much time ahead of position is buffered 3574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int durationMsec, positionMsec = -1; 3584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((mStateFlags & kFlagPrepared) && (mPlayer != 0) 3594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getDuration(&durationMsec)) 3604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi && (OK == mPlayer->getCurrentPosition(&positionMsec))) { 3614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if ((-1 != durationMsec) && (-1 != positionMsec)) { 3624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // evaluate prefetch status based on buffer time thresholds 3634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec; 3644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CacheStatus_t newCacheStatus = mCacheStatus; 3654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) { 3664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusHigh; 3674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) { 3684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEnough; 3694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) { 3704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusIntermediate; 3714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (bufferedDurationMsec == 0) { 3724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusEmpty; 3734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 3744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi newCacheStatus = kStatusLow; 3754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (newCacheStatus != mCacheStatus) { 3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = newCacheStatus; 3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 3804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 383b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } else { 384b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)"); 3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//-------------------------------------------------- 3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/** 39106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten * called from GenericMediaPlayer::onPrepare after the MediaPlayer mPlayer is prepared successfully 392fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten * pre-conditions: 393fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten * mPlayer != 0 39406059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten * mPlayer is prepared successfully 3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */ 39606059e5ee1eaf907589c7f8d1320253f92211348Glenn Kastenvoid GenericMediaPlayer::afterMediaPlayerPreparedSuccessfully() { 39706059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten SL_LOGV("GenericMediaPlayer::afterMediaPlayerPrepared()"); 398fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten assert(mPlayer != 0); 39906059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten assert(mStateFlags & kFlagPrepared); 4005933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Mark this player as prepared successfully, so safe to directly call getCurrentPosition 4015933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten { 4025933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten Mutex::Autolock _l(mPlayerPreparedLock); 4035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten assert(mPlayerPrepared == 0); 4045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mPlayerPrepared = mPlayer; 4055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 406fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten // retrieve channel count 407fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten assert(UNKNOWN_NUMCHANNELS == mChannelCount); 408fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten Parcel *reply = new Parcel(); 409fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply); 410fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten if (status == NO_ERROR) { 411fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mChannelCount = reply->readInt32(); 41299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten } else { 41399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo 41499b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten mChannelCount = 2; 41599b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten } 41699b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten if (UNKNOWN_NUMCHANNELS != mChannelCount) { 41799b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten // now that we know the channel count, re-calculate the volumes 41899b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/); 41999b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten } else { 42099b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten LOGW("channel count is still unknown after prepare"); 421fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten } 422fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten delete reply; 423fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten // retrieve duration 4244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 4254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 4264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int msec = 0; 4274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (OK == mPlayer->getDuration(&msec)) { 4284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec = msec; 4294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4319f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten // now that we have a MediaPlayer, set the looping flag 4329f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten if (mStateFlags & kFlagLooping) { 4339f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten (void) mPlayer->setLooping(1); 4349f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten } 4354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers 4364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // if the data source was local, and the buffers are considered full so we need to notify that 4374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi bool isLocalSource = true; 4384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (kDataLocatorUri == mDataLocatorType) { 4394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) { 4404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (!strncasecmp(mDataLocator.uriRef, 4414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) { 4424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi isLocalSource = false; 4434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 4444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (isLocalSource) { 4484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on local source"); 4494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi { 4504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 4514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus = kStatusHigh; 4524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill = 1000; 4534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyStatus(); 4544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyCacheFill(); 4554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else { 4574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("media player prepared on non-local source"); 4584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 45968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} 46068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi 4615933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 4625933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten//-------------------------------------------------- 4635933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten// If player is prepared successfully, set output parameter to that reference, otherwise NULL 4645933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid GenericMediaPlayer::getPlayerPrepared(sp<IMediaPlayer> &playerPrepared) 4655933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten{ 4665933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten Mutex::Autolock _l(mPlayerPreparedLock); 4675933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten playerPrepared = mPlayerPrepared; 4685933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 4695933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 47068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android 471