android_GenericMediaPlayer.cpp revision 99b927751677abfb60a388d65dfeed1fed1db12c
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2011 The Android Open Source Project
35778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License.
65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at
75778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
85778822d86b0337407514b9372562b86edfa91cdAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software
115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and
145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License.
155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define USE_LOG SLAndroidLogLevel_Verbose
185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
19fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include "sles_allinclusive.h"
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "android_GenericMediaPlayer.h"
212606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/IMediaPlayerService.h>
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <surfaceflinger/ISurfaceComposer.h>
242606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <surfaceflinger/SurfaceComposerClient.h>
25c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker#include <media/stagefright/foundation/ADebug.h>
2667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
272606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangnamespace android {
28c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker
291a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian// default delay in Us used when reposting an event when the player is not ready to accept
30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber// the command yet. This is for instance used when seeking on a MediaPlayer that's still preparing
3167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#define DEFAULT_COMMAND_DELAY_FOR_REPOST_US (100*1000) // 100ms
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic const char* const kDistantProtocolPrefix[] = { "http:", "https:", "ftp:", "rtp:", "rtsp:"};
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define NB_DISTANT_PROTOCOLS (sizeof(kDistantProtocolPrefix)/sizeof(kDistantProtocolPrefix[0]))
355b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
36ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber//--------------------------------------------------------------------------------------------------
375778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    mGenericMediaPlayer(gmp),
392606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    mPlayerPrepared(PREPARE_NOT_STARTED)
406f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen{
41e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    SL_LOGV("MediaPlayerNotificationClient::MediaPlayerNotificationClient()");
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
43744f5739019d1fd917f981e740b353c3d73fd1a8David Smith
445778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGV("MediaPlayerNotificationClient::~MediaPlayerNotificationClient()");
462606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
472606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
482606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// Map a MEDIA_* enum to a string
49e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const char *media_to_string(int msg)
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber{
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg) {
5267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#define _(x) case MEDIA_##x: return "MEDIA_" #x;
5367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(PREPARED)
5467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(SET_VIDEO_SIZE)
5567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(SEEK_COMPLETE)
5667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(PLAYBACK_COMPLETE)
5767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(BUFFERING_UPDATE)
5867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(ERROR)
5967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(NOP)
6067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(TIMED_TEXT)
6167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      _(INFO)
6267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#undef _
6367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    default:
6467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        return NULL;
6567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
6667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu}
6767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
6867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu//--------------------------------------------------
6967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu// IMediaPlayerClient implementation
7067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Parcel *obj) {
7167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGV("MediaPlayerNotificationClient::notify(msg=%s (%d), ext1=%d, ext2=%d)",
7267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            media_to_string(msg), msg, ext1, ext2);
7367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
7467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    switch (msg) {
7567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      case MEDIA_PREPARED:
7667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayerPrepared = PREPARE_COMPLETED_SUCCESSFULLY;
7767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayerPreparedCondition.signal();
7867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        break;
7967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
8067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      case MEDIA_SET_VIDEO_SIZE:
8167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // only send video size updates if the player was flagged as having video, to avoid
828f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        // sending video size updates of (0,0)
838f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        if (mGenericMediaPlayer->mHasVideo) {
848f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu            mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
858f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu                    (int32_t)ext1, (int32_t)ext2, true /*async*/);
868f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        }
878f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        break;
888f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu
898f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu      case MEDIA_SEEK_COMPLETE:
908f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu          mGenericMediaPlayer->seekComplete();
918f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        break;
928f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu
938f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu      case MEDIA_PLAYBACK_COMPLETE:
948f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        mGenericMediaPlayer->notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
958f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        break;
9667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
9767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      case MEDIA_BUFFERING_UPDATE:
9867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // values received from Android framework for buffer fill level use percent,
9967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        //   while SL/XA use permille, so does GenericPlayer
10067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mGenericMediaPlayer->bufferingUpdate(ext1 * 10 /*fillLevelPerMille*/);
10167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        break;
10267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
10367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu      case MEDIA_ERROR:
10467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY;
10567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayerPreparedCondition.signal();
1062606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang        break;
1072606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
108d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang      case MEDIA_NOP:
1092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang      case MEDIA_TIMED_TEXT:
1102606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang      case MEDIA_INFO:
1112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang        break;
1122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
1132606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang      default: { }
114d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    }
1152606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
1162606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
117d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
118d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//--------------------------------------------------
119d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid MediaPlayerNotificationClient::beforePrepare()
120d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang{
121d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    Mutex::Autolock _l(mLock);
122d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    assert(mPlayerPrepared == PREPARE_NOT_STARTED);
123d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mPlayerPrepared = PREPARE_IN_PROGRESS;
124d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang}
1252606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
1262606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//--------------------------------------------------
1272606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangbool MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
128d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    Mutex::Autolock _l(mLock);
129d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    assert(mPlayerPrepared != PREPARE_NOT_STARTED);
130d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    while (mPlayerPrepared == PREPARE_IN_PROGRESS) {
131d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        mPlayerPreparedCondition.wait(mLock);
132d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    }
1332606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    assert(mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY ||
1342606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang            mPlayerPrepared == PREPARE_COMPLETED_UNSUCCESSFULLY);
1352606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    return mPlayerPrepared == PREPARE_COMPLETED_SUCCESSFULLY;
1362606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
1372606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
1382606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//--------------------------------------------------------------------------------------------------
1392606b10d51c2dceb851a2ea63e803aba4134bf00Chong ZhangGenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
140d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    GenericPlayer(params),
141d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mHasVideo(hasVideo),
142d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mSeekTimeMsec(0),
143d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mVideoSurface(0),
144d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mVideoSurfaceTexture(0),
145d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mPlayer(0),
146d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mPlayerClient(0),
1472606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    mGetMediaPlayerInfoGenCount(0)
1482606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang{
1492606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
150d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
151d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mServiceManager = defaultServiceManager();
1522606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    mBinder = mServiceManager->getService(String16("media.player"));
1532606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
154d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
155d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    CHECK(mMediaPlayerService.get() != NULL);
156d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
15745c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang    mPlayerClient = new MediaPlayerNotificationClient(this);
158d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang}
159d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
160d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong ZhangGenericMediaPlayer::~GenericMediaPlayer() {
161d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
162d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang}
163d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
164d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid GenericMediaPlayer::preDestroy() {
165d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    SL_LOGD("GenericMediaPlayer::preDestroy()");
166d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    // we might be in the middle of blocking for a getXXX call
167d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    {
168d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
169d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        mGetMediaPlayerInfoGenCount++;
170d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        mGetMediaPlayerInfoCondition.broadcast();
171d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    }
172d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    GenericPlayer::preDestroy();
1732606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
1742606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
1752606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//--------------------------------------------------
1762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang// overridden from GenericPlayer
177d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// pre-condition:
178d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//   msec != NULL
179d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang// post-condition
180d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//   *msec == mPositionMsec ==
1812606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//                  ANDROID_UNKNOWN_TIME if position is unknown at time of query,
1822606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//               or the current MediaPlayer position
1832606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::getPositionMsec(int* msec) {
1842606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    SL_LOGD("GenericMediaPlayer::getPositionMsec()");
1852606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    uint32_t currentGen = 0;
186d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    {
1872606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
1882606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang        currentGen = mGetMediaPlayerInfoGenCount;
1892606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    }
1902606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    // send a message to update the MediaPlayer position in the event loop where it's safe to
1912606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    //   access the MediaPlayer. We block until the message kWhatMediaPlayerInfo has been processed
192d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    (new AMessage(kWhatMediaPlayerInfo, id()))->post();
19345c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang    {
19445c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
195d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        // mGetMediaPlayerInfoGenCount will be incremented when the kWhatMediaPlayerInfo
196d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        //  gets processed.
1972606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang        while (currentGen == mGetMediaPlayerInfoGenCount) {
1982606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang            mGetMediaPlayerInfoCondition.wait(mGetMediaPlayerInfoLock);
1992606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang            // if multiple GetPosition calls were issued before any got processed on the event queue
2002606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang            // then they will all return the same "recent-enough" position
201d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        }
202d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        // at this point mPositionMsec has been updated
203d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        // so now updates msec from mPositionMsec, while holding the lock protecting it
204d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        GenericPlayer::getPositionMsec(msec);
2052606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    }
2062606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
2072606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
2082606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang//--------------------------------------------------
2092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
210d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    SL_LOGV("GenericMediaPlayer::setVideoSurface()");
2112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    mVideoSurface = surface;
2122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
2132606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
2142606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
2152606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    SL_LOGV("GenericMediaPlayer::setVideoSurfaceTexture()");
216d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    mVideoSurfaceTexture = surfaceTexture;
21745c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang}
21845c765da4d67088ea7ce0fab438300682c3914f0Chong Zhang
219d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//--------------------------------------------------
220d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhangvoid GenericMediaPlayer::onMessageReceived(const sp<AMessage> &msg) {
2212606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    SL_LOGV("GenericMediaPlayer::onMessageReceived()");
2222606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    switch (msg->what()) {
223d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        case kWhatMediaPlayerInfo:
224d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang            onGetMediaPlayerInfo();
225d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang            break;
226d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
227d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang        default:
228d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang            GenericPlayer::onMessageReceived(msg);
229d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang            break;
230d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang    }
231d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang}
232d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang
233d7ed649cfeff62680b8edb4cb86ce239116d8c8bChong Zhang//--------------------------------------------------
23467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu// Event handlers
23567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
23667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPrepare() {
23767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGD("GenericMediaPlayer::onPrepare()");
23867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // Attempt to prepare at most once, and only if there is a MediaPlayer
23967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)) && (mPlayer != 0)) {
24067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        if (mHasVideo) {
24167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            if (mVideoSurface != 0) {
24267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                mPlayer->setVideoSurface(mVideoSurface);
24367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            } else if (mVideoSurfaceTexture != 0) {
24467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
24567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            }
24667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        }
24767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
24867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayerClient->beforePrepare();
24967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayer->prepareAsync();
25067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mStateFlags |= mPlayerClient->blockUntilPlayerPrepared() ?
251e4237177a4a3eea059cd74247b2d770d301a8230Ronghua Wu                kFlagPrepared : kFlagPreparedUnsuccessfully;
25267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        onAfterMediaPlayerPrepared();
25367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        GenericPlayer::onPrepare();
25467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
25567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
25667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu}
25767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
25867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
25967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPlay() {
26067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGD("GenericMediaPlayer::onPlay()");
26167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
26267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        SL_LOGD("starting player");
26367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayer->start();
26467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mStateFlags |= kFlagPlaying;
26567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    } else {
26667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
26767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
26867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu}
26967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onPause() {
27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGD("GenericMediaPlayer::onPause()");
27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mPlayer->pause();
27567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mStateFlags &= ~kFlagPlaying;
27667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu}
27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
27967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu/**
28067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu * pre-condition: WHATPARAM_SEEK_SEEKTIME_MS parameter value >= 0
28167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu */
28267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuvoid GenericMediaPlayer::onSeek(const sp<AMessage> &msg) {
28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGV("GenericMediaPlayer::onSeek");
28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int64_t timeMsec = ANDROID_UNKNOWN_TIME;
28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if (!msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec)) {
28667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // invalid command, drop it
28767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        return;
28867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((mStateFlags & kFlagSeeking) && (timeMsec == mSeekTimeMsec)) {
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        // already seeking to the same time, cancel this command
291251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        return;
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mStateFlags & kFlagPreparedUnsuccessfully) {
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        // discard seeks after unsuccessful prepare
294251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    } else if (!(mStateFlags & kFlagPrepared)) {
295251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        // we are not ready to accept a seek command at this time, retry later
296251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        msg->post(DEFAULT_COMMAND_DELAY_FOR_REPOST_US);
297251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    } else {
298251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        if (msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec) && (mPlayer != 0)) {
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mStateFlags |= kFlagSeeking;
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSeekTimeMsec = (int32_t)timeMsec;
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (OK != mPlayer->seekTo(timeMsec)) {
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mStateFlags &= ~kFlagSeeking;
303251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung                mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mPositionMsec = mSeekTimeMsec;
306251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            }
307251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        }
308251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
309251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung}
310251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3125778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onLoop(const sp<AMessage> &msg) {
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGV("GenericMediaPlayer::onLoop");
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t loop = 0;
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop)) {
31692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar        if (mPlayer != 0 && OK == mPlayer->setLooping(loop)) {
3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (loop) {
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mStateFlags |= kFlagLooping;
319251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            } else {
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mStateFlags &= ~kFlagLooping;
321ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar            }
322ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar        }
3232606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    }
3242606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}
32567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
32667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3275778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onVolumeUpdate() {
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGD("GenericMediaPlayer::onVolumeUpdate()");
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // use settings lock to read the volume settings
3306507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    Mutex::Autolock _l(mSettingsLock);
3313d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang    if (mPlayer != 0) {
3323d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mAndroidAudioLevels.mFinalVolume[1]);
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
33767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3385778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGD("GenericMediaPlayer::onAttachAuxEffect()");
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t effectId = 0;
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (msg->findInt32(WHATPARAM_ATTACHAUXEFFECT, &effectId)) {
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mPlayer != 0) {
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t status;
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status = mPlayer->attachAuxEffect(effectId);
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            // attachAuxEffect returns a status but we have no way to report it back to app
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (void) status;
3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3525778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGD("GenericMediaPlayer::onSetAuxEffectSendLevel()");
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    float level = 0.0f;
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (msg->findFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, &level)) {
356c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        if (mPlayer != 0) {
3573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            status_t status;
358c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang            status = mPlayer->setAuxEffectSendLevel(level);
359c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang            // setAuxEffectSendLevel returns a status but we have no way to report it back to app
360c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang            (void) status;
361c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        }
362c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    }
363dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung}
36467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
36567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
366671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnarvoid GenericMediaPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
367671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    int32_t fillLevel = 0;
368671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATE, &fillLevel)) {
369671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar        SL_LOGD("GenericMediaPlayer::onBufferingUpdate(fillLevel=%d)", fillLevel);
370671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        Mutex::Autolock _l(mSettingsLock);
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCacheFill = fillLevel;
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        // handle cache fill update
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCacheFill - mLastNotifiedCacheFill >= mCacheFillNotifThreshold) {
375744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            notifyCacheFill();
376bcc1a8299224b35aa2d16cf522d4aa5bcfa1ab60Andy Hung        }
377744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        // handle prefetch status update
378744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        //   compute how much time ahead of position is buffered
379bcc1a8299224b35aa2d16cf522d4aa5bcfa1ab60Andy Hung        int durationMsec, positionMsec = -1;
380744f5739019d1fd917f981e740b353c3d73fd1a8David Smith        if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)
381744f5739019d1fd917f981e740b353c3d73fd1a8David Smith                && (OK == mPlayer->getDuration(&durationMsec))
382744f5739019d1fd917f981e740b353c3d73fd1a8David Smith                        && (OK == mPlayer->getCurrentPosition(&positionMsec))) {
383744f5739019d1fd917f981e740b353c3d73fd1a8David Smith            if ((-1 != durationMsec) && (-1 != positionMsec)) {
384744f5739019d1fd917f981e740b353c3d73fd1a8David Smith                // evaluate prefetch status based on buffer time thresholds
38567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                int64_t bufferedDurationMsec = (durationMsec * fillLevel / 100) - positionMsec;
386dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung                CacheStatus_t newCacheStatus = mCacheStatus;
38767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                if (bufferedDurationMsec > DURATION_CACHED_HIGH_MS) {
3886f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    newCacheStatus = kStatusHigh;
3896f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                } else if (bufferedDurationMsec > DURATION_CACHED_MED_MS) {
3906f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    newCacheStatus = kStatusEnough;
39167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                } else if (bufferedDurationMsec > DURATION_CACHED_LOW_MS) {
3926f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    newCacheStatus = kStatusIntermediate;
3936f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                } else if (bufferedDurationMsec == 0) {
39460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar                    newCacheStatus = kStatusEmpty;
39548a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung                } else {
39648a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung                    newCacheStatus = kStatusLow;
39748a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung                }
39848a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung
3996f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                if (newCacheStatus != mCacheStatus) {
4006f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    mCacheStatus = newCacheStatus;
40160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar                    notifyStatus();
40260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar                }
40360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar            }
40460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar        }
40560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar    } else {
40667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        SL_LOGV("GenericMediaPlayer::onBufferingUpdate(fillLevel=unknown)");
40760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar    }
4086f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen}
4096f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen
4106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen
4115778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onGetMediaPlayerInfo() {
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SL_LOGD("GenericMediaPlayer::onGetMediaPlayerInfo()");
41367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    {
41467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        android::Mutex::Autolock autoLock(mGetMediaPlayerInfoLock);
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if ((!(mStateFlags & kFlagPrepared)) || (mPlayer == 0)) {
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPositionMsec = ANDROID_UNKNOWN_TIME;
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else {
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPlayer->getCurrentPosition(&mPositionMsec);
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber        // the MediaPlayer info has been refreshed
4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mGetMediaPlayerInfoGenCount++;
4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        // there might be multiple requests for MediaPlayer info, so use broadcast instead of signal
4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mGetMediaPlayerInfoCondition.broadcast();
4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4281d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar
4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4301d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar//--------------------------------------------------
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber/**
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber * called from the event handling loop after the MediaPlayer mPlayer is prepared
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber * pre-conditions:
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber *  mPlayer != 0
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber *  mPlayer is prepared
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
4375778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid GenericMediaPlayer::onAfterMediaPlayerPrepared() {
43867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    SL_LOGV("GenericMediaPlayer::onAfterMediaPlayerPrepared()");
43967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    assert(mPlayer != 0);
44067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // retrieve channel count
441c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu    assert(UNKNOWN_NUMCHANNELS == mChannelCount);
442c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu    Parcel *reply = new Parcel();
44367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    status_t status = mPlayer->getParameter(KEY_PARAMETER_AUDIO_CHANNEL_COUNT, reply);
44467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if (status == NO_ERROR) {
44567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mChannelCount = reply->readInt32();
44667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    } else {
44767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // FIXME MPEG-2 TS doesn't yet implement this key, so default to stereo
44867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        mChannelCount = 2;
44967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
45067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if (UNKNOWN_NUMCHANNELS != mChannelCount) {
45167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // now that we know the channel count, re-calculate the volumes
45267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        notify(PLAYEREVENT_CHANNEL_COUNT, mChannelCount, true /*async*/);
45367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    } else {
45467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        LOGW("channel count is still unknown after prepare");
45567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
45667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    delete reply;
45767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // retrieve duration
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    {
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        Mutex::Autolock _l(mSettingsLock);
460c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        int msec = 0;
4611d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar        if (OK == mPlayer->getDuration(&msec)) {
462c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang            mDurationMsec = msec;
463c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        }
464c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    }
465c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    // when the MediaPlayer mPlayer is prepared, there is "sufficient data" in the playback buffers
466c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    // if the data source was local, and the buffers are considered full so we need to notify that
467c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    bool isLocalSource = true;
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (kDataLocatorUri == mDataLocatorType) {
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        for (unsigned int i = 0 ; i < NB_DISTANT_PROTOCOLS ; i++) {
4701a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            if (!strncasecmp(mDataLocator.uriRef,
4711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    kDistantProtocolPrefix[i], strlen(kDistantProtocolPrefix[i]))) {
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                isLocalSource = false;
4731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar                break;
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
47567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        }
47667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    }
47767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    if (isLocalSource) {
47867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        SL_LOGD("media player prepared on local source");
47967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        {
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Mutex::Autolock _l(mSettingsLock);
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCacheStatus = kStatusHigh;
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCacheFill = 1000;
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            notifyStatus();
4841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            notifyCacheFill();
4851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        }
4861bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    } else {
4871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        SL_LOGD("media player prepared on non-local source");
4881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
4891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber}
4901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber