android_GenericMediaPlayer.cpp revision a9f22e6f5f53e90daa779e38b22f88e4faa35c95
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
274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi// default delay in Us used when reposting an event when the player is not ready to accept
284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing
294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms
304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
31833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten// table of prefixes for known distant protocols; these are immediately dispatched to mediaserver
32833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kastenstatic const char* const kDistantProtocolPrefix[] = { "http://", "https://", "rtsp://"};
334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0]))
344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
35833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten// is the specified URI a known distant protocol?
36833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kastenbool isDistantProtocol(const char *uri)
37833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten{
38833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    for (unsigned int i = 0; i < NB_DISTANT_PROTOCOLS; i++) {
39833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten        if (!strncasecmp(uri, kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) {
40833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            return true;
41833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten        }
42833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    }
43833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    return false;
44833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten}
45833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten
46833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kastennamespace android {
47833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten
4868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
4937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel TriviMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
5037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mGenericMediaPlayer(gmp),
5149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    mPlayerPrepared(PREPARE_NOT_STARTED)
5268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
53b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()");
5468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
5568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
5668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
57b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()");
58b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten}
5968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
60b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten// Map a MEDIA_* enum to a string
61b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kastenstatic const char *media_to_string(int msg)
62b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten{
63b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    switch (msg) {
64b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten#define _(x) case MEDIA_##x: return "MEDIA_" #x;
65b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(PREPARED)
66b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(SET_VIDEO_SIZE)
67b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(SEEK_COMPLETE)
68b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(PLAYBACK_COMPLETE)
69b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(BUFFERING_UPDATE)
70b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(ERROR)
71b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(NOP)
72b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(TIMED_TEXT)
73b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten      _(INFO)
74b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten#undef _
75b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    default:
76b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten        return NULL;
77b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    }
7868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
7968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
8168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation
822f6d462d89356cdaa77299ca27b60c5cca198d98Gloria Wangvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) {
83b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)",
84b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten            media_to_string(msg), msg, ext1, ext2);
8568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
8637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    switch (msg) {
8737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_PREPARED:
8849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY;
8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.signal();
9037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
9137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
9237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_SET_VIDEO_SIZE:
934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // only send video size updates if the player was flagged as having video, to avoid
944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // sending video size updates of (0,0)
954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mGenericMediaPlayer->mHasVideo) {
964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    (int32_t)ext1, (int32_t)ext2, true /*async*/);
984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_SEEK_COMPLETE:
102f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        mGenericMediaPlayer->seekComplete();
1034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
1044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_PLAYBACK_COMPLETE:
1064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
1074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
1084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_BUFFERING_UPDATE:
1104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // values received from Android framework for buffer fill level use percent,
1114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   while SL/XA use permille, so does GenericPlayer
1124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/);
11337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
11437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
11581e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_ERROR:
11649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY;
11749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        mPlayerPreparedCondition.signal();
11849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        break;
11949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten
12081e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_NOP:
12181e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_TIMED_TEXT:
12281e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_INFO:
12381e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten        break;
12481e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten
12537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      default: { }
12668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
12781e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten
12868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
12968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
13068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
13149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kastenvoid MediaPlayerNotificationClient::beforePrepare()
13249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten{
13349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    Mutex::Autolock _l(mLock);
13449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    assert(mPlayerPrepared == PREPARE_NOT_STARTED);
13549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    mPlayerPrepared = PREPARE_IN_PROGRESS;
13649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten}
13749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten
13849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten//--------------------------------------------------
13949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kastenbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
14068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    Mutex::Autolock _l(mLock);
14149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    assert(mPlayerPrepared != PREPARE_NOT_STARTED);
14249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    while (mPlayerPrepared == PREPARE_IN_PROGRESS) {
14368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.wait(mLock);
14468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
14549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY ||
14649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten            mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY);
14749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY;
14868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
14968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
15168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
15268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericPlayer(params),
15368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mHasVideo(hasVideo),
1547ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    mSeekTimeMsec(0),
15568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mVideoSurface(0),
156ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture(0),
15768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayer(0),
1585933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    mPlayerClient(0)
15968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
160e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
16168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
16237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mPlayerClient = new MediaPlayerNotificationClient(this);
16368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
16468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
16568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() {
166e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
1674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
1694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() {
17035a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::preDestroy()");
171485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten    if (mPlayer != 0) {
172485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten        mPlayer->stop();
173485a038f9f0f898227b8ab4218e94c5d56b6ed0bGlenn Kasten    }
1744b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    GenericPlayer::preDestroy();
1754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
17668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//--------------------------------------------------
1784b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer
1794b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition:
1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//   msec != NULL
1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition
1825933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten//   *msec ==
1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//                  ANDROID_UNKNOWN_TIME if position is unknown at time of query,
1844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//               or the current MediaPlayer position
1854b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) {
1864b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::getPositionMsec()");
1875933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    sp<IMediaPlayer> player;
1885933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    getPlayerPrepared(player);
1895933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // To avoid deadlock, directly call the MediaPlayer object
1905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    if (player == 0 || player->getCurrentPosition(msec) != NO_ERROR) {
1915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        *msec = ANDROID_UNKNOWN_TIME;
1924b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
19368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
19468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
19568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
196ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
197b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("GenericMediaPlayer::setVideoSurface()");
19835ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    // FIXME bug - race condition, should do in looper
19935ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    if (mVideoSurface.get() == surface.get()) {
20035ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten        return;
20135ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    }
20235ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
20335ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten        mPlayer->setVideoSurface(surface);
20435ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    }
205ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurface = surface;
20635ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    mVideoSurfaceTexture = NULL;
207ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten}
208ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
209ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
210b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()");
21135ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    // FIXME bug - race condition, should do in looper
21235ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    if (mVideoSurfaceTexture.get() == surfaceTexture.get()) {
21335ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten        return;
21435ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    }
21535ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
21635ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten        mPlayer->setVideoSurfaceTexture(surfaceTexture);
21735ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    }
218ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture = surfaceTexture;
21935ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten    mVideoSurface = NULL;
22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
22168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
22270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
22368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
22468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers
2254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
22685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten// blocks until mPlayer is prepared
22768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() {
228e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare()");
22949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Attempt to prepare at most once, and only if there is a MediaPlayer
23049935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) {
231ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        if (mHasVideo) {
232ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            if (mVideoSurface != 0) {
233ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurface(mVideoSurface);
234ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            } else if (mVideoSurfaceTexture != 0) {
235ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
236ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            }
23768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        }
23868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
23949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        mPlayerClient->beforePrepare();
24068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->prepareAsync();
24106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        if (mPlayerClient->blockUntilPlayerPrepared()) {
24206059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            mStateFlags |= kFlagPrepared;
24306059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            afterMediaPlayerPreparedSuccessfully();
24406059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        } else {
24506059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            mStateFlags |= kFlagPreparedUnsuccessfully;
24606059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        }
24768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
24885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    GenericPlayer::onPrepare();
249e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
25068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
25168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
25368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() {
254e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPlay()");
2555933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    if (((mStateFlags & (kFlagPrepared | kFlagPlaying)) == kFlagPrepared) && (mPlayer != 0)) {
25668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->start();
25768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
2585933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    GenericPlayer::onPlay();
25968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
26068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
26268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() {
263e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPause()");
2645933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    if (!(~mStateFlags & (kFlagPrepared | kFlagPlaying)) && (mPlayer != 0)) {
26568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->pause();
26668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
2675933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    GenericPlayer::onPause();
26837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi}
26937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
270f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten
271f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kastenvoid GenericMediaPlayer::onSeekComplete() {
272f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    SL_LOGV("GenericMediaPlayer::onSeekComplete()");
273f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    // did we initiate the seek?
274f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    if (!(mStateFlags & kFlagSeeking)) {
275f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        // no, are we looping?
276f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        if (mStateFlags & kFlagLooping) {
277f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten            // yes, per OpenSL ES 1.0.1 and 1.1 do NOT report it to client
278f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten            // notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
279f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        // no, well that's surprising, but it's probably just a benign race condition
280f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        } else {
281f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten            SL_LOGW("Unexpected seek complete event ignored");
282f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten        }
283f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    }
284f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    GenericPlayer::onSeekComplete();
285f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten}
286f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten
287f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten
2887ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/**
2897ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0
2907ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */
2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) {
2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onSeek");
2937ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    int64_t timeMsec = ANDROID_UNKNOWN_TIME;
2947ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) {
2957ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        // invalid command, drop it
2967ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
2977ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    }
298a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten    if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec) &&
299a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten            (timeMsec != ANDROID_UNKNOWN_TIME)) {
300a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten        // already seeking to the same non-unknown time, cancel this command
3017ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
30249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    } else if (mStateFlags & kFlagPreparedUnsuccessfully) {
30349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        // discard seeks after unsuccessful prepare
3047ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    } else if (!(mStateFlags & kFlagPrepared)) {
3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // we are not ready to accept a seek command at this time, retry later
3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US);
3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    } else {
3084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) {
3097ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mStateFlags |= kFlagSeeking;
3107ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mSeekTimeMsec = (int32_t)timeMsec;
311a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten            // seek to unknown time is used by StreamPlayer after discontinuity
312a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten            if (timeMsec == ANDROID_UNKNOWN_TIME) {
313a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten                // FIXME simulate a MEDIA_SEEK_COMPLETE event in 250 ms;
314a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten                // this is a terrible hack to make up for mediaserver not sending one
315a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten                (new AMessage(kWhatSeekComplete, id()))->post(250000);
316a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten            } else if (OK != mPlayer->seekTo(timeMsec)) {
3177ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mStateFlags &= ~kFlagSeeking;
3187ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
3194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) {
3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onLoop");
3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t loop = 0;
3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) {
3299f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        if (loop) {
3309f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten            mStateFlags |= kFlagLooping;
3319f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        } else {
3329f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten            mStateFlags &= ~kFlagLooping;
3339f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        }
3349f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        // if we have a MediaPlayer then tell it now, otherwise we'll tell it after it's created
3359f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        if (mPlayer != 0) {
3369f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten            (void) mPlayer->setLooping(loop);
3374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
34237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() {
3434ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onVolumeUpdate()");
34437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    // use settings lock to read the volume settings
34537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex::Autolock _l(mSettingsLock);
3464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (mPlayer != 0) {
347fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
348fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten                mAndroidAudioLevels.mFinalVolume[1]);
34937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    }
3504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3533610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
3543610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()");
3553610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    int32_t effectId = 0;
3563610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) {
3573610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        if (mPlayer != 0) {
3583610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status_t status;
3593610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status = mPlayer->attachAuxEffect(effectId);
3603610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            // attachAuxEffect returns a status but we have no way to report it back to app
3613610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            (void) status;
3623610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        }
3633610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    }
3643610785fa93586ce84a27a27530feb77b8035229Glenn Kasten}
3653610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3663610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3673610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
3683610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()");
3693610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    float level = 0.0f;
3703610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) {
3713610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        if (mPlayer != 0) {
3723610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status_t status;
3733610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status = mPlayer->setAuxEffectSendLevel(level);
3743610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            // setAuxEffectSendLevel returns a status but we have no way to report it back to app
3753610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            (void) status;
3763610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        }
3773610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    }
3783610785fa93586ce84a27a27530feb77b8035229Glenn Kasten}
3793610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3803610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t fillLevel = 0;
3834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) {
3844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel);
38568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mCacheFill = fillLevel;
3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle cache fill update
3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) {
3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyCacheFill();
3914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle prefetch status update
3934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   compute how much time ahead of position is buffered
3944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int durationMsec, positionMsec = -1;
3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)
3964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                && (OK == mPlayer->getDuration(&durationMsec))
3974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                        && (OK == mPlayer->getCurrentPosition(&positionMsec))) {
3984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if ((-1 != durationMsec) && (-1 != positionMsec)) {
3994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                // evaluate prefetch status based on buffer time thresholds
4004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec;
4014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                CacheStatus_t newCacheStatus = mCacheStatus;
4024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) {
4034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusHigh;
4044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) {
4054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEnough;
4064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) {
4074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusIntermediate;
4084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec == 0) {
4094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEmpty;
4104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else {
4114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusLow;
4124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
4134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (newCacheStatus != mCacheStatus) {
4154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    mCacheStatus = newCacheStatus;
4164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    notifyStatus();
4174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
4184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
4194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
420b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    } else {
421b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten        SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)");
4224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
4234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
4244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//--------------------------------------------------
4274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/**
42806059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten * called from GenericMediaPlayer::onPrepare after the MediaPlayer mPlayer is prepared successfully
429fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten * pre-conditions:
430fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten *  mPlayer != 0
43106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten *  mPlayer is prepared successfully
4324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */
43306059e5ee1eaf907589c7f8d1320253f92211348Glenn Kastenvoid GenericMediaPlayer::afterMediaPlayerPreparedSuccessfully() {
43406059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten    SL_LOGV("GenericMediaPlayer::afterMediaPlayerPrepared()");
435fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    assert(mPlayer != 0);
43606059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten    assert(mStateFlags & kFlagPrepared);
4375933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    // Mark this player as prepared successfully, so safe to directly call getCurrentPosition
4385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    {
4395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        Mutex::Autolock _l(mPlayerPreparedLock);
4405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        assert(mPlayerPrepared == 0);
4415933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        mPlayerPrepared = mPlayer;
4425933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    }
443fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    // retrieve channel count
444fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    assert(UNKNOWN_NUMCHANNELS == mChannelCount);
445fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    Parcel *reply = new Parcel();
446fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply);
447fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    if (status == NO_ERROR) {
448fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        mChannelCount = reply->readInt32();
44999b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    } else {
45099b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo
45199b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        mChannelCount = 2;
45299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    }
45399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    if (UNKNOWN_NUMCHANNELS != mChannelCount) {
45499b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        // now that we know the channel count, re-calculate the volumes
45599b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/);
45699b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    } else {
45799b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten        LOGW("channel count is still unknown after prepare");
458fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    }
459fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    delete reply;
460fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    // retrieve duration
4614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    {
4624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
4634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int msec = 0;
4644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (OK == mPlayer->getDuration(&msec)) {
4654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mDurationMsec = msec;
4664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
4674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
4689f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten    // now that we have a MediaPlayer, set the looping flag
4699f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten    if (mStateFlags & kFlagLooping) {
4709f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten        (void) mPlayer->setLooping(1);
4719f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten    }
4724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers
4734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // if the data source was local, and the buffers are considered full so we need to notify that
4744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    bool isLocalSource = true;
4754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (kDataLocatorUri == mDataLocatorType) {
476833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten        isLocalSource = !isDistantProtocol(mDataLocator.uriRef);
4774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
4784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (isLocalSource) {
4794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("media player prepared on local source");
4804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        {
4814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            Mutex::Autolock _l(mSettingsLock);
4824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mCacheStatus = kStatusHigh;
4834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mCacheFill = 1000;
4844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyStatus();
4854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyCacheFill();
4864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
4874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    } else {
4884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("media player prepared on non-local source");
4894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
49068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
49168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4925933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
4935933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten//--------------------------------------------------
4945933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten// If player is prepared successfully, set output parameter to that reference, otherwise NULL
4955933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid GenericMediaPlayer::getPlayerPrepared(sp<IMediaPlayer> &playerPrepared)
4965933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten{
4975933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    Mutex::Autolock _l(mPlayerPreparedLock);
4985933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    playerPrepared = mPlayerPrepared;
4995933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten}
5005933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
50168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android
502