android_GenericMediaPlayer.cpp revision 81e917a2605e14901b8f5e6cac7eafb5667aad0d
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),
3968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayerPrepared(false)
4068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
4168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
4368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
4568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
4768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
4868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
4968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// IMediaPlayerClient implementation
502f6d462d89356cdaa77299ca27b60c5cca198d98Gloria Wangvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) {
51e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten    SL_LOGV("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
5268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
5337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    switch (msg) {
5437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_PREPARED:
5568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPrepared = true;
5668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.signal();
5737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
5837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
5937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      case MEDIA_SET_VIDEO_SIZE:
604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // only send video size updates if the player was flagged as having video, to avoid
614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // sending video size updates of (0,0)
624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mGenericMediaPlayer->mHasVideo) {
634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    (int32_t)ext1, (int32_t)ext2, true /*async*/);
654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_SEEK_COMPLETE:
694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi          mGenericMediaPlayer->seekComplete();
704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_PLAYBACK_COMPLETE:
734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        break;
754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi      case MEDIA_BUFFERING_UPDATE:
774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // values received from Android framework for buffer fill level use percent,
784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   while SL/XA use permille, so does GenericPlayer
794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/);
8037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi        break;
8137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
8281e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_ERROR:
8381e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_NOP:
8481e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_TIMED_TEXT:
8581e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten      case MEDIA_INFO:
8681e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten        break;
8781e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten
8837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi      default: { }
8968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
9081e917a2605e14901b8f5e6cac7eafb5667aad0dGlenn Kasten
9168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
9268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
9368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
9468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
9568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    Mutex::Autolock _l(mLock);
9668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    while (!mPlayerPrepared) {
9768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerPreparedCondition.wait(mLock);
9868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
9968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
10068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
10168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
10268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericPlayer(params),
10468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mHasVideo(hasVideo),
1057ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    mSeekTimeMsec(0),
10668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mVideoSurface(0),
107ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture(0),
10868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mPlayer(0),
1094b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    mPlayerClient(0),
1104b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    mGetMediaPlayerInfoGenCount(0)
11168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi{
112e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
11368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
11468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mServiceManager = defaultServiceManager();
11568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mBinder = mServiceManager->getService(String16("media.player"));
11668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
11768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
11868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    CHECK(mMediaPlayerService.get() != NULL);
11968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
12037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    mPlayerClient = new MediaPlayerNotificationClient(this);
12168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
12268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
12368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel TriviGenericMediaPlayer::~GenericMediaPlayer() {
124e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
1254b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
1264b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
1274b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::preDestroy() {
12835a5a30fdad179ccf38d8d756590411326159a89Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::preDestroy()");
1294b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    // we might be in the middle of blocking for a getXXX call
1304b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1314b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1324b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoGenCount++;
1334b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoCondition.broadcast();
1344b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
1354b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    GenericPlayer::preDestroy();
1364b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
13768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1384b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//--------------------------------------------------
1394b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// overridden from GenericPlayer
1404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// pre-condition:
1414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//   msec != NULL
1424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi// post-condition
1434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//   *msec == mPositionMsec ==
1444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//                  ANDROID_UNKNOWN_TIME if position is unknown at time of query,
1454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//               or the current MediaPlayer position
1464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::getPositionMsec(int* msec) {
1474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::getPositionMsec()");
1484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    uint32_t currentGen = 0;
1494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        currentGen = mGetMediaPlayerInfoGenCount;
1524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
1534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    // send a message to update the MediaPlayer position in the event loop where it's safe to
1544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    //   access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed
1554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    (new AMessage(kWhatMediaPlayerInfo, id()))->post();
1564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
1574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1584b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo
1594b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        //  gets processed.
1604b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        while (currentGen == mGetMediaPlayerInfoGenCount) {
1614b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock);
1624b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            // if multiple GetPosition calls were issued before any got processed on the event queue
1634b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            // then they will all return the same "recent-enough" position
1644b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        }
1654b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // at this point mPositionMsec has been updated
1664b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // so now updates msec from mPositionMsec, while holding the lock protecting it
1674b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        GenericPlayer::getPositionMsec(msec);
1684b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
16968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
17068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
17168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
172ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
173ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurface = surface;
174ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten}
175ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten
176ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kastenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
177ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten    mVideoSurfaceTexture = surfaceTexture;
17868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
17968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
1804b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi//--------------------------------------------------
1814b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) {
1824b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    switch (msg->what()) {
1834b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        case kWhatMediaPlayerInfo:
1844b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            onGetMediaPlayerInfo();
1854b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            break;
1864b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
1874b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        default:
1884b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            GenericPlayer::onMessageReceived(msg);
1894b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            break;
1904b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
1914b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
19270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi
19368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi//--------------------------------------------------
19468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi// Event handlers
1954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
19668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPrepare() {
197e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare()");
19868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
199ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten        if (mHasVideo) {
200ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            if (mVideoSurface != 0) {
201ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurface(mVideoSurface);
202ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            } else if (mVideoSurfaceTexture != 0) {
203ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
204ad1ab1d13a9b043202b9d5cdc1d8c4ef66cbbca8Glenn Kasten            }
20568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        }
20668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
20768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->prepareAsync();
20868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayerClient->blockUntilPlayerPrepared();
2094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        onAfterMediaPlayerPrepared();
21068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericPlayer::onPrepare();
21168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
212e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
21368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
21468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
21668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPlay() {
217e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPlay()");
21868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
219e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi        SL_LOGD("starting player");
22068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->start();
22168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
22268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    } else {
22368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
22468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
22568d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
22668d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
2274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
22868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivivoid GenericMediaPlayer::onPause() {
229e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onPause()");
23068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
23168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mPlayer->pause();
23268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
23368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    }
23437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi}
23537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
2367ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi/**
2377ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0
2387ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi */
2394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) {
2404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onSeek");
2417ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    int64_t timeMsec = ANDROID_UNKNOWN_TIME;
2427ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) {
2437ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        // invalid command, drop it
2447ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
2457ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    }
2467ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) {
2477ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        // already seeking to the same time, cancel this command
2487ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi        return;
2497ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi    } else if (!(mStateFlags & kFlagPrepared)) {
2504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // we are not ready to accept a seek command at this time, retry later
2514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US);
2524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    } else {
2534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) {
2547ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mStateFlags |= kFlagSeeking;
2557ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            mSeekTimeMsec = (int32_t)timeMsec;
2567ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            if (OK != mPlayer->seekTo(timeMsec)) {
2577ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mStateFlags &= ~kFlagSeeking;
2587ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
2597ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi            } else {
2607ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi                mPositionMsec = mSeekTimeMsec;
2614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
2624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
2634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
2644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
2654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
2664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
2674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) {
2684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGV("GenericMediaPlayer::onLoop");
2694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t loop = 0;
2704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) {
271e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten        if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) {
2724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if (loop) {
2734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                mStateFlags |= kFlagLooping;
2744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            } else {
2754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                mStateFlags &= ~kFlagLooping;
2764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
2774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
2784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
2794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
2804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
2814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
28237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericMediaPlayer::onVolumeUpdate() {
2834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onVolumeUpdate()");
28437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    // use settings lock to read the volume settings
28537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    Mutex::Autolock _l(mSettingsLock);
2864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (mPlayer != 0) {
2874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mAndroidAudioLevels.mMute) {
2884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mPlayer->setVolume(0.0f, 0.0f);
2894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        } else {
2904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
2914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    mAndroidAudioLevels.mFinalVolume[1]);
2924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
29337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    }
2944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
2954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
2964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
2974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
2984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t fillLevel = 0;
2994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) {
3004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel);
30168d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
3024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
3034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        mCacheFill = fillLevel;
3044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle cache fill update
3054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) {
3064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyCacheFill();
3074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        // handle prefetch status update
3094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        //   compute how much time ahead of position is buffered
3104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int durationMsec, positionMsec = -1;
3114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)
3124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                && (OK == mPlayer->getDuration(&durationMsec))
3134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                        && (OK == mPlayer->getCurrentPosition(&positionMsec))) {
3144ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if ((-1 != durationMsec) && (-1 != positionMsec)) {
3154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                // evaluate prefetch status based on buffer time thresholds
3164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec;
3174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                CacheStatus_t newCacheStatus = mCacheStatus;
3184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) {
3194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusHigh;
3204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) {
3214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEnough;
3224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) {
3234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusIntermediate;
3244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else if (bufferedDurationMsec == 0) {
3254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusEmpty;
3264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                } else {
3274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    newCacheStatus = kStatusLow;
3284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
3294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                if (newCacheStatus != mCacheStatus) {
3314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    mCacheStatus = newCacheStatus;
3324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    notifyStatus();
3334ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                }
3344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
3354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi}
3384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
3404b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivivoid GenericMediaPlayer::onGetMediaPlayerInfo() {
3414b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()");
3424b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    {
3434b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
3444b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
3454b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) {
3464b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mPositionMsec = ANDROID_UNKNOWN_TIME;
3474b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        } else {
3484b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi            mPlayer->getCurrentPosition(&mPositionMsec);
3494b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        }
3504b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
3514b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // the MediaPlayer info has been refreshed
3524b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoGenCount++;
3534b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal
3544b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi        mGetMediaPlayerInfoCondition.broadcast();
3554b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi    }
3564b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi}
3574b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
3584b0e0b2860ffd5e246b42c8a434833cca2f068b3Jean-Michel Trivi
3594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//--------------------------------------------------
3604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi/**
3614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * called from the event handling loop
3624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi * pre-condition: mPlayer is prepared
3634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi */
3644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericMediaPlayer::onAfterMediaPlayerPrepared() {
3654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // the MediaPlayer mPlayer is prepared, retrieve its duration
36636b700a829b7a02b873b4cd0cdb0a95342b20a31Jean-Michel Trivi    // FIXME retrieve channel count
3674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    {
3684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
3694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int msec = 0;
3704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        if (OK == mPlayer->getDuration(&msec)) {
3714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mDurationMsec = msec;
3724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3734ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers
3754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // if the data source was local, and the buffers are considered full so we need to notify that
3764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    bool isLocalSource = true;
3774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (kDataLocatorUri == mDataLocatorType) {
3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) {
3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            if (!strncasecmp(mDataLocator.uriRef,
3804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                    kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) {
3814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                isLocalSource = false;
3824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi                break;
3834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            }
3844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
3864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    if (isLocalSource) {
3874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("media player prepared on local source");
3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        {
3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            Mutex::Autolock _l(mSettingsLock);
3904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mCacheStatus = kStatusHigh;
3914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            mCacheFill = 1000;
3924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyStatus();
3934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            notifyCacheFill();
3944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        }
3954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    } else {
3964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        SL_LOGD("media player prepared on non-local source");
3974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    }
39868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi}
39968d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi
40068d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi} // namespace android
401