android_GenericMediaPlayer.cpp revision 06059e5ee1eaf907589c7f8d1320253f92211348
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:
904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi          mGenericMediaPlayer->seekComplete();
914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_PLAYBACK_COMPLETE:
944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_BUFFERING_UPDATE:
984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // values received from Android framework for buffer fill level use percent,
994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   while SL/XA use permille, so does GenericPlayer
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/);
10137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
10237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
10381e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_ERROR:
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),
1464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    mPlayerClient(0),
1474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    mGetMediaPlayerInfoGenCount(0)
14868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
149e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
15068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mServiceManager = defaultServiceManager();
15268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mBinder = mServiceManager->getService(String16("media.player"));
15368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
15468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    CHECK(mMediaPlayerService.get() != NULL);
15668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
15737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mPlayerClient = new MediaPlayerNotificationClient(this);
15868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
15968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
16068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() {
161e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
1624b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
1634b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
1644b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() {
16535a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::preDestroy()");
1664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    // we might be in the middle of blocking for a getXXX call
1674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1694b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoGenCount++;
1704b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoCondition.broadcast();
1714b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
1724b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    GenericPlayer::preDestroy();
1734b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
17468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1754b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//--------------------------------------------------
1764b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer
1774b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition:
1784b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//   msec != NULL
1794b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition
1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//   *msec == mPositionMsec ==
1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//                  ANDROID_UNKNOWN_TIME if position is unknown at time of query,
1824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//               or the current MediaPlayer position
1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) {
1844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::getPositionMsec()");
1854b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    uint32_t currentGen = 0;
1864b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1874b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1884b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        currentGen = mGetMediaPlayerInfoGenCount;
1894b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
1904b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    // send a message to update the MediaPlayer position in the event loop where it's safe to
1914b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    //   access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed
1924b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    (new AMessage(kWhatMediaPlayerInfo, id()))->post();
1934b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1944b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1954b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo
1964b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        //  gets processed.
1974b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        while (currentGen == mGetMediaPlayerInfoGenCount) {
1984b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock);
1994b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            // if multiple GetPosition calls were issued before any got processed on the event queue
2004b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            // then they will all return the same "recent-enough" position
2014b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        }
2024b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // at this point mPositionMsec has been updated
2034b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // so now updates msec from mPositionMsec, while holding the lock protecting it
2044b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        GenericPlayer::getPositionMsec(msec);
2054b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
20668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
20768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
20868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
209ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
210b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("GenericMediaPlayer::setVideoSurface()");
211ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurface = surface;
212ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten}
213ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
214ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
215b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()");
216ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture = surfaceTexture;
21768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
21868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2194b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//--------------------------------------------------
2204b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) {
221b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    SL_LOGV("GenericMediaPlayer::onMessageReceived()");
2224b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    switch (msg->what()) {
2234b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        case kWhatMediaPlayerInfo:
2244b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            onGetMediaPlayerInfo();
2254b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            break;
2264b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
2274b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        default:
2284b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            GenericPlayer::onMessageReceived(msg);
2294b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            break;
2304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
2314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
23270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
23368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
23468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers
2354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
23668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() {
237e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare()");
23849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    // Attempt to prepare at most once, and only if there is a MediaPlayer
23949935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) {
240ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        if (mHasVideo) {
241ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            if (mVideoSurface != 0) {
242ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurface(mVideoSurface);
243ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            } else if (mVideoSurfaceTexture != 0) {
244ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
245ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            }
24668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        }
24768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
24849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        mPlayerClient->beforePrepare();
24968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->prepareAsync();
25006059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        if (mPlayerClient->blockUntilPlayerPrepared()) {
25106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            mStateFlags |= kFlagPrepared;
25206059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            afterMediaPlayerPreparedSuccessfully();
25306059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        } else {
25406059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten            mStateFlags |= kFlagPreparedUnsuccessfully;
25506059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten        }
25668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericPlayer::onPrepare();
25768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
258e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
25968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
26068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
26268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() {
263e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPlay()");
26468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
265e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi        SL_LOGD("starting player");
26668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->start();
26768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
26868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    } else {
26968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
27068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
27168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
27268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
27468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() {
275e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPause()");
27668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
27768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->pause();
27868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
27968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
28037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi}
28137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
2827ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/**
2837ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0
2847ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */
2854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) {
2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onSeek");
2877ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    int64_t timeMsec = ANDROID_UNKNOWN_TIME;
2887ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) {
2897ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        // invalid command, drop it
2907ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
2917ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    }
2927ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) {
2937ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        // already seeking to the same time, cancel this command
2947ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
29549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    } else if (mStateFlags & kFlagPreparedUnsuccessfully) {
29649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten        // discard seeks after unsuccessful prepare
2977ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    } else if (!(mStateFlags & kFlagPrepared)) {
2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // we are not ready to accept a seek command at this time, retry later
2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US);
3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    } else {
3014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) {
3027ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mStateFlags |= kFlagSeeking;
3037ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mSeekTimeMsec = (int32_t)timeMsec;
3047ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            if (OK != mPlayer->seekTo(timeMsec)) {
3057ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mStateFlags &= ~kFlagSeeking;
3067ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
3077ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            } else {
3087ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mPositionMsec = mSeekTimeMsec;
3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) {
3164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onLoop");
3174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t loop = 0;
3184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) {
319e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten        if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) {
3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if (loop) {
3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                mStateFlags |= kFlagLooping;
3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            } else {
3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                mStateFlags &= ~kFlagLooping;
3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
3254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
33037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() {
3314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onVolumeUpdate()");
33237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    // use settings lock to read the volume settings
33337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex::Autolock _l(mSettingsLock);
3344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (mPlayer != 0) {
335fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
336fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten                mAndroidAudioLevels.mFinalVolume[1]);
33737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    }
3384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3413610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
3423610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()");
3433610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    int32_t effectId = 0;
3443610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) {
3453610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        if (mPlayer != 0) {
3463610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status_t status;
3473610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status = mPlayer->attachAuxEffect(effectId);
3483610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            // attachAuxEffect returns a status but we have no way to report it back to app
3493610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            (void) status;
3503610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        }
3513610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    }
3523610785fa93586ce84a27a27530feb77b8035229Glenn Kasten}
3533610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3543610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3553610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
3563610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()");
3573610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    float level = 0.0f;
3583610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) {
3593610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        if (mPlayer != 0) {
3603610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status_t status;
3613610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            status = mPlayer->setAuxEffectSendLevel(level);
3623610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            // setAuxEffectSendLevel returns a status but we have no way to report it back to app
3633610785fa93586ce84a27a27530feb77b8035229Glenn Kasten            (void) status;
3643610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        }
3653610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    }
3663610785fa93586ce84a27a27530feb77b8035229Glenn Kasten}
3673610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3683610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
3694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
3704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t fillLevel = 0;
3714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) {
3724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel);
37368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
3754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mCacheFill = fillLevel;
3764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle cache fill update
3774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) {
3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyCacheFill();
3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle prefetch status update
3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   compute how much time ahead of position is buffered
3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int durationMsec, positionMsec = -1;
3834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)
3844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                && (OK == mPlayer->getDuration(&durationMsec))
3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                        && (OK == mPlayer->getCurrentPosition(&positionMsec))) {
3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if ((-1 != durationMsec) && (-1 != positionMsec)) {
3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                // evaluate prefetch status based on buffer time thresholds
3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec;
3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                CacheStatus_t newCacheStatus = mCacheStatus;
3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) {
3914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusHigh;
3924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) {
3934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEnough;
3944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) {
3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusIntermediate;
3964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec == 0) {
3974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEmpty;
3984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else {
3994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusLow;
4004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
4014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (newCacheStatus != mCacheStatus) {
4034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    mCacheStatus = newCacheStatus;
4044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    notifyStatus();
4054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
4064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
4074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
408b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten    } else {
409b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten        SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)");
4104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
4114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
4124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
4144b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onGetMediaPlayerInfo() {
4154b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()");
4164b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
4174b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
4184b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
4194b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) {
4204b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mPositionMsec = ANDROID_UNKNOWN_TIME;
4214b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        } else {
4224b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mPlayer->getCurrentPosition(&mPositionMsec);
4234b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        }
4244b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
4254b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // the MediaPlayer info has been refreshed
4264b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoGenCount++;
4274b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal
4284b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoCondition.broadcast();
4294b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
4304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
4314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
4324b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
4334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//--------------------------------------------------
4344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/**
43506059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten * called from GenericMediaPlayer::onPrepare after the MediaPlayer mPlayer is prepared successfully
436fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten * pre-conditions:
437fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten *  mPlayer != 0
43806059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten *  mPlayer is prepared successfully
4394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */
44006059e5ee1eaf907589c7f8d1320253f92211348Glenn Kastenvoid GenericMediaPlayer::afterMediaPlayerPreparedSuccessfully() {
44106059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten    SL_LOGV("GenericMediaPlayer::afterMediaPlayerPrepared()");
442fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    assert(mPlayer != 0);
44306059e5ee1eaf907589c7f8d1320253f92211348Glenn Kasten    assert(mStateFlags & kFlagPrepared);
444fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    // retrieve channel count
445fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    assert(UNKNOWN_NUMCHANNELS == mChannelCount);
446fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    Parcel *reply = new Parcel();
447fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply);
448fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    if (status == NO_ERROR) {
449fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        mChannelCount = reply->readInt32();
450fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        if (UNKNOWN_NUMCHANNELS != mChannelCount) {
451fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten            // now that we know the channel count, re-calculate the volumes
452fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten            notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/);
453fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        } else {
454fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten            LOGW("channel count is still unknown after prepare");
455fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        }
456fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    }
457fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    delete reply;
458fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    // retrieve duration
4594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    {
4604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
4614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int msec = 0;
4624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (OK == mPlayer->getDuration(&msec)) {
4634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mDurationMsec = msec;
4644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
4654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
4664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers
4674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // if the data source was local, and the buffers are considered full so we need to notify that
4684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    bool isLocalSource = true;
4694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (kDataLocatorUri == mDataLocatorType) {
4704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) {
4714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if (!strncasecmp(mDataLocator.uriRef,
4724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) {
4734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                isLocalSource = false;
4744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                break;
4754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
4764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
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
49268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android
493