android_GenericMediaPlayer.cpp revision f6445d330c05ccc57d1adcc6ee05735a33f78881
14980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/*
24980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Copyright (C) 2011 The Android Open Source Project
34980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
44980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Licensed under the Apache License, Version 2.0 (the "License");
54980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * you may not use this file except in compliance with the License.
64980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * You may obtain a copy of the License at
74980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
84980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *      http://www.apache.org/licenses/LICENSE-2.0
94980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Unless required by applicable law or agreed to in writing, software
114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * distributed under the License is distributed on an "AS IS" BASIS,
124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * See the License for the specific language governing permissions and
144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * limitations under the License.
154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//#define USE_LOG SLAndroidLogLevel_Verbose
184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include "sles_allinclusive.h"
204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include "android_GenericMediaPlayer.h"
214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <media/IMediaPlayerService.h>
234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <surfaceflinger/ISurfaceComposer.h>
244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <surfaceflinger/SurfaceComposerClient.h>
254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#include <media/stagefright/foundation/ADebug.h>
264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsennamespace android {
284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// default delay in Us used when reposting an event when the player is not ready to accept
304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing
314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms
324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenstatic const char* const kDistantProtocolPrefix[] = { "http:", "https:", "ftp:", "rtp:", "rtsp:"};
344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0]))
354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------------------------------------------------------
374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mGenericMediaPlayer(gmp),
394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mPlayerPrepared(PREPARE_NOT_STARTED)
404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{
414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()");
424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()");
464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// Map a MEDIA_* enum to a string
494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenstatic const char *media_to_string(int msg)
504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{
514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    switch (msg) {
524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#define _(x) case MEDIA_##x: return "MEDIA_" #x;
534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(PREPARED)
544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(SET_VIDEO_SIZE)
554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(SEEK_COMPLETE)
564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(PLAYBACK_COMPLETE)
574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(BUFFERING_UPDATE)
584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(ERROR)
594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(NOP)
604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(TIMED_TEXT)
614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      _(INFO)
624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen#undef _
634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    default:
644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return NULL;
654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// IMediaPlayerClient implementation
704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) {
714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)",
724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            media_to_string(msg), msg, ext1, ext2);
734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    switch (msg) {
754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_PREPARED:
764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY;
774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerPreparedCondition.signal();
784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_SET_VIDEO_SIZE:
814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // only send video size updates if the player was flagged as having video, to avoid
824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // sending video size updates of (0,0)
834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mGenericMediaPlayer->mHasVideo) {
844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    (int32_t)ext1, (int32_t)ext2, true /*async*/);
864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_SEEK_COMPLETE:
904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGenericMediaPlayer->seekComplete();
914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_PLAYBACK_COMPLETE:
944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_BUFFERING_UPDATE:
984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // values received from Android framework for buffer fill level use percent,
994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        //   while SL/XA use permille, so does GenericPlayer
1004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/);
1014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
1024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_ERROR:
1044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY;
1054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerPreparedCondition.signal();
1064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
1074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_NOP:
1094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_TIMED_TEXT:
1104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      case MEDIA_INFO:
1114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        break;
1124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen      default: { }
1144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
1154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
1194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid MediaPlayerNotificationClient::beforePrepare()
1204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{
1214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    Mutex::Autolock _l(mLock);
1224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(mPlayerPrepared == PREPARE_NOT_STARTED);
1234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mPlayerPrepared = PREPARE_IN_PROGRESS;
1244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
1274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
1284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    Mutex::Autolock _l(mLock);
1294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(mPlayerPrepared != PREPARE_NOT_STARTED);
1304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    while (mPlayerPrepared == PREPARE_IN_PROGRESS) {
1314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerPreparedCondition.wait(mLock);
1324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
1334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY ||
1344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY);
1354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY;
1364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------------------------------------------------------
1394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
1404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    GenericPlayer(params),
1414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mHasVideo(hasVideo),
1424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mSeekTimeMsec(0),
1434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mVideoSurface(0),
1444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mVideoSurfaceTexture(0),
1454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mPlayer(0),
1464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mPlayerClient(0),
1474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mGetMediaPlayerInfoGenCount(0)
1484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen{
1494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
1504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mServiceManager = defaultServiceManager();
1524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mBinder = mServiceManager->getService(String16("media.player"));
1534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
1544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    CHECK(mMediaPlayerService.get() != NULL);
1564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mPlayerClient = new MediaPlayerNotificationClient(this);
1584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan WillemsenGenericMediaPlayer::~GenericMediaPlayer() {
1614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
1624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::preDestroy() {
1654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::preDestroy()");
1664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // we might be in the middle of blocking for a getXXX call
1674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    {
1684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGetMediaPlayerInfoGenCount++;
1704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGetMediaPlayerInfoCondition.broadcast();
1714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
1724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    GenericPlayer::preDestroy();
1734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
1754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
1764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// overridden from GenericPlayer
1774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// pre-condition:
1784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//   msec != NULL
1794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// post-condition
1804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//   *msec == mPositionMsec ==
1814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//                  ANDROID_UNKNOWN_TIME if position is unknown at time of query,
1824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//               or the current MediaPlayer position
1834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::getPositionMsec(int* msec) {
1844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::getPositionMsec()");
1854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    uint32_t currentGen = 0;
1864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    {
1874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        currentGen = mGetMediaPlayerInfoGenCount;
1894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
1904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // send a message to update the MediaPlayer position in the event loop where it's safe to
1914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    //   access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed
1924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    (new AMessage(kWhatMediaPlayerInfo, id()))->post();
1934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    {
1944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo
1964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        //  gets processed.
1974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        while (currentGen == mGetMediaPlayerInfoGenCount) {
1984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock);
1994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // if multiple GetPosition calls were issued before any got processed on the event queue
2004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // then they will all return the same "recent-enough" position
2014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
2024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // at this point mPositionMsec has been updated
2034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // so now updates msec from mPositionMsec, while holding the lock protecting it
2044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        GenericPlayer::getPositionMsec(msec);
2054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
2094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
2104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::setVideoSurface()");
2114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mVideoSurface = surface;
2124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
2154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()");
2164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    mVideoSurfaceTexture = surfaceTexture;
2174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
2204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) {
2214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::onMessageReceived()");
2224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    switch (msg->what()) {
2234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        case kWhatMediaPlayerInfo:
2244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            onGetMediaPlayerInfo();
2254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            break;
2264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        default:
2284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            GenericPlayer::onMessageReceived(msg);
2294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            break;
2304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
2344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen// Event handlers
2354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPrepare() {
2374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onPrepare()");
2384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // Attempt to prepare at most once, and only if there is a MediaPlayer
2394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) {
2404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mHasVideo) {
2414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (mVideoSurface != 0) {
2424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mPlayer->setVideoSurface(mVideoSurface);
2434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            } else if (mVideoSurfaceTexture != 0) {
2444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
2454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
2464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
2474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
2484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayerClient->beforePrepare();
2494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayer->prepareAsync();
2504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mPlayerClient->blockUntilPlayerPrepared()) {
2514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mStateFlags |= kFlagPrepared;
2524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            afterMediaPlayerPreparedSuccessfully();
2534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } else {
2544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mStateFlags |= kFlagPreparedUnsuccessfully;
2554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
2564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        GenericPlayer::onPrepare();
2574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
2594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPlay() {
2634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onPlay()");
2644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
2654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGD("starting player");
2664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayer->start();
2674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mStateFlags |= kFlagPlaying;
2684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
2694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
2704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onPause() {
2754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onPause()");
2764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
2774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayer->pause();
2784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mStateFlags &= ~kFlagPlaying;
2794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSeekComplete() {
2844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::onSeekComplete()");
2854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // did we initiate the seek?
2864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (!(mStateFlags & kFlagSeeking)) {
2874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // no, are we looping?
2884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mStateFlags & kFlagLooping) {
2894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // yes, per OpenSL ES 1.0.1 and 1.1 do NOT report it to client
2904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
2914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // no, well that's surprising, but it's probably just a benign race condition
2924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } else {
2934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            SL_LOGW("Unexpected seek complete event ignored");
2944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
2954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
2964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    GenericPlayer::onSeekComplete();
2974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
2984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/**
3014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0
3024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
3034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) {
3044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::onSeek");
3054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    int64_t timeMsec = ANDROID_UNKNOWN_TIME;
3064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) {
3074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // invalid command, drop it
3084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return;
3094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) {
3114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // already seeking to the same time, cancel this command
3124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return;
3134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else if (mStateFlags & kFlagPreparedUnsuccessfully) {
3144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // discard seeks after unsuccessful prepare
3154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else if (!(mStateFlags & kFlagPrepared)) {
3164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // we are not ready to accept a seek command at this time, retry later
3174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US);
3184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
3194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) {
3204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mStateFlags |= kFlagSeeking;
3214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mSeekTimeMsec = (int32_t)timeMsec;
3224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (OK != mPlayer->seekTo(timeMsec)) {
3234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mStateFlags &= ~kFlagSeeking;
3244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
3254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            } else {
3264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mPositionMsec = mSeekTimeMsec;
3274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
3284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
3314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) {
3344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::onLoop");
3354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    int32_t loop = 0;
3364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) {
3374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (loop) {
3384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mStateFlags |= kFlagLooping;
3394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } else {
3404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mStateFlags &= ~kFlagLooping;
3414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // if we have a MediaPlayer then tell it now, otherwise we'll tell it after it's created
3434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mPlayer != 0) {
3444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            (void) mPlayer->setLooping(loop);
3454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
3484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onVolumeUpdate() {
3514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onVolumeUpdate()");
3524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // use settings lock to read the volume settings
3534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    Mutex::Autolock _l(mSettingsLock);
3544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (mPlayer != 0) {
3554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
3564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                mAndroidAudioLevels.mFinalVolume[1]);
3574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
3594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
3624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()");
3634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    int32_t effectId = 0;
3644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) {
3654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mPlayer != 0) {
3664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            status_t status;
3674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            status = mPlayer->attachAuxEffect(effectId);
3684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // attachAuxEffect returns a status but we have no way to report it back to app
3694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            (void) status;
3704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
3734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
3764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()");
3774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    float level = 0.0f;
3784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) {
3794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mPlayer != 0) {
3804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            status_t status;
3814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            status = mPlayer->setAuxEffectSendLevel(level);
3824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // setAuxEffectSendLevel returns a status but we have no way to report it back to app
3834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            (void) status;
3844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
3874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
3904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    int32_t fillLevel = 0;
3914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) {
3924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel);
3934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        Mutex::Autolock _l(mSettingsLock);
3954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mCacheFill = fillLevel;
3964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // handle cache fill update
3974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) {
3984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            notifyCacheFill();
3994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // handle prefetch status update
4014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        //   compute how much time ahead of position is buffered
4024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        int durationMsec, positionMsec = -1;
4034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)
4044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                && (OK == mPlayer->getDuration(&durationMsec))
4054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        && (OK == mPlayer->getCurrentPosition(&positionMsec))) {
4064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if ((-1 != durationMsec) && (-1 != positionMsec)) {
4074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                // evaluate prefetch status based on buffer time thresholds
4084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec;
4094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                CacheStatus_t newCacheStatus = mCacheStatus;
4104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) {
4114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    newCacheStatus = kStatusHigh;
4124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) {
4134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    newCacheStatus = kStatusEnough;
4144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) {
4154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    newCacheStatus = kStatusIntermediate;
4164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                } else if (bufferedDurationMsec == 0) {
4174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    newCacheStatus = kStatusEmpty;
4184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                } else {
4194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    newCacheStatus = kStatusLow;
4204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                }
4214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                if (newCacheStatus != mCacheStatus) {
4234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    mCacheStatus = newCacheStatus;
4244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    notifyStatus();
4254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                }
4264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
4274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
4294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)");
4304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
4324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::onGetMediaPlayerInfo() {
4354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()");
4364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    {
4374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
4384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) {
4404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mPositionMsec = ANDROID_UNKNOWN_TIME;
4414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } else {
4424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mPlayer->getCurrentPosition(&mPositionMsec);
4434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // the MediaPlayer info has been refreshed
4464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGetMediaPlayerInfoGenCount++;
4474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal
4484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mGetMediaPlayerInfoCondition.broadcast();
4494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
4514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen//--------------------------------------------------
4544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/**
4554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * called from GenericMediaPlayer::onPrepare after the MediaPlayer mPlayer is prepared successfully
4564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * pre-conditions:
4574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *  mPlayer != 0
4584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *  mPlayer is prepared successfully
4594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
4604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenvoid GenericMediaPlayer::afterMediaPlayerPreparedSuccessfully() {
4614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    SL_LOGV("GenericMediaPlayer::afterMediaPlayerPrepared()");
4624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(mPlayer != 0);
4634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(mStateFlags & kFlagPrepared);
4644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // retrieve channel count
4654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    assert(UNKNOWN_NUMCHANNELS == mChannelCount);
4664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    Parcel *reply = new Parcel();
4674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply);
4684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (status == NO_ERROR) {
4694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mChannelCount = reply->readInt32();
4704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
4714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo
4724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mChannelCount = 2;
4734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (UNKNOWN_NUMCHANNELS != mChannelCount) {
4754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // now that we know the channel count, re-calculate the volumes
4764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/);
4774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
4784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        LOGW("channel count is still unknown after prepare");
4794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    delete reply;
4814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // retrieve duration
4824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    {
4834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        Mutex::Autolock _l(mSettingsLock);
4844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        int msec = 0;
4854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (OK == mPlayer->getDuration(&msec)) {
4864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mDurationMsec = msec;
4874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // now that we have a MediaPlayer, set the looping flag
4904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (mStateFlags & kFlagLooping) {
4914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        (void) mPlayer->setLooping(1);
4924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers
4944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // if the data source was local, and the buffers are considered full so we need to notify that
4954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    bool isLocalSource = true;
4964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (kDataLocatorUri == mDataLocatorType) {
4974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) {
4984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (!strncasecmp(mDataLocator.uriRef,
4994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) {
5004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                isLocalSource = false;
5014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                break;
5024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
5034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
5054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    if (isLocalSource) {
5064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGD("media player prepared on local source");
5074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        {
5084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Mutex::Autolock _l(mSettingsLock);
5094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mCacheStatus = kStatusHigh;
5104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            mCacheFill = 1000;
5114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            notifyStatus();
5124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            notifyCacheFill();
5134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    } else {
5154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        SL_LOGD("media player prepared on non-local source");
5164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
5174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
5184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen} // namespace android
5204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen