android_GenericPlayer.cpp revision 563ba31c5b77092d3d2672a3ee89f1eaeed1aeb5
1dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
2dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
3dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
4dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * you may not use this file except in compliance with the License.
6dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * You may obtain a copy of the License at
7dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
8dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
10dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * See the License for the specific language governing permissions and
14dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * limitations under the License.
15dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
16dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
17dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose
18dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
19dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi#include "sles_allinclusive.h"
20dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
218ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h>
228ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <sys/stat.h>
238ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
24dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivinamespace android {
25dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
26dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
27dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviGenericPlayer::GenericPlayer(const AudioPlayback_Parameters* params) :
28dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocatorType(kDataLocatorNone),
29dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mNotifyClient(NULL),
30dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mNotifyUser(NULL),
31dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags(0),
32fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mPlaybackParams(*params),
33463a7641944e4a3613f5d76aa8450070ef56b9ffGlenn Kasten        mChannelCount(UNKNOWN_NUMCHANNELS),
348ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mDurationMsec(ANDROID_UNKNOWN_TIME),
35463a7641944e4a3613f5d76aa8450070ef56b9ffGlenn Kasten        mSampleRateHz(UNKNOWN_SAMPLERATE),
368ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheStatus(kStatusEmpty),
378ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFill(0),
388ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mLastNotifiedCacheFill(0),
39a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mCacheFillNotifThreshold(100),
40a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mEventFlags(0),
41a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mMarkerPositionMs(ANDROID_UNKNOWN_TIME),
42a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mPositionUpdatePeriodMs(1000), // per spec
43a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mOneShotGeneration(0),
44a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mDeliveredNewPosMs(ANDROID_UNKNOWN_TIME),
45a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mObservedPositionMs(ANDROID_UNKNOWN_TIME)
46dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{
4730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::GenericPlayer()");
48dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
49dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper = new android::ALooper();
50dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
51fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[0] = 1.0f;
52fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[1] = 1.0f;
53dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
54dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
55dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviGenericPlayer::~GenericPlayer() {
573f324661dd8bf33dd3fb2afeb84fbb05262a0d08Glenn Kasten    SL_LOGV("GenericPlayer::~GenericPlayer()");
58dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
59d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    resetDataLocator();
60dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
61dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
62dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
63dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::init(const notif_cbf_t cbf, void* notifUser) {
6430ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::init()");
65dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
661209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
671209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
681209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyClient = cbf;
691209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyUser = notifUser;
701209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    }
71dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
72dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper->registerHandler(this);
73563ba31c5b77092d3d2672a3ee89f1eaeed1aeb5Glenn Kasten    mLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, PRIORITY_DEFAULT);
74dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
75dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
76dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
771209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivivoid GenericPlayer::preDestroy() {
781209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    SL_LOGD("GenericPlayer::preDestroy()");
791209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
801209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
811209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyClient = NULL;
821209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyUser = NULL;
831209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    }
841209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
851209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    mLooper->stop();
861209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    mLooper->unregisterHandler(id());
871209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi}
881209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
891209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
90dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::setDataSource(const char *uri) {
916e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setDataSource(uri=%s)", uri);
92dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    resetDataLocator();
93dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
94dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.uriRef = uri;
95dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
96dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorUri;
97dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
98dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
99dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
100d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kastenvoid GenericPlayer::setDataSource(int fd, int64_t offset, int64_t length, bool closeAfterUse) {
101d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    SL_LOGV("GenericPlayer::setDataSource(fd=%d, offset=%lld, length=%lld, closeAfterUse=%s)", fd,
102d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten            offset, length, closeAfterUse ? "true" : "false");
103dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    resetDataLocator();
104dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
105dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.fd = fd;
106dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
107dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    struct stat sb;
108dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    int ret = fstat(fd, &sb);
109dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (ret != 0) {
110dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("GenericPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
111dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
112dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
113dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
114dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (offset >= sb.st_size) {
115dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("SfPlayer::setDataSource: invalid offset");
116dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
117dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
118dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.offset = offset;
119dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
120dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (PLAYER_FD_FIND_FILE_SIZE == length) {
121dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size;
122dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else if (offset + length > sb.st_size) {
123dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size - offset;
124dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
125dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = length;
126dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
127dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
128d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    mDataLocator.fdi.mCloseAfterUse = closeAfterUse;
129d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten
130dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorFd;
131dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
132dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
133dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
134dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::prepare() {
13530ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::prepare()");
1366bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten    // do not attempt prepare more than once
1376bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten    if (!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully))) {
1386bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten        sp<AMessage> msg = new AMessage(kWhatPrepare, id());
1396bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten        msg->post();
1406bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten    }
141dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
142dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
143dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
144dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::play() {
14530ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::play()");
146dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPlay, id());
147dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
148dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
149dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
150dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
151dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::pause() {
15230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::pause()");
153dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPause, id());
154dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
155dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
156dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
157dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
158dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::stop() {
15930ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::stop()");
160dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    (new AMessage(kWhatPause, id()))->post();
161dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
162dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // after a stop, playback should resume from the start.
163dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    seek(0);
164dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
165dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
166dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
167dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::seek(int64_t timeMsec) {
168dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::seek %lld", timeMsec);
169f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    if (timeMsec < 0) {
170f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        SL_LOGE("GenericPlayer::seek error, can't seek to negative time %lldms", timeMsec);
171f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        return;
172f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    }
173dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeek, id());
174dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt64(WHATPARAM_SEEK_SEEKTIME_MS, timeMsec);
175dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
176dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
177dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
178dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
179dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::loop(bool loop) {
1806e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::loop %s", loop ? "true" : "false");
181dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatLoop, id());
182dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt32(WHATPARAM_LOOP_LOOPING, (int32_t)loop);
183dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
184dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
185dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
186dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
1878ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::setBufferingUpdateThreshold(int16_t thresholdPercent) {
1886e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setBufferingUpdateThreshold %d", thresholdPercent);
1898ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBuffUpdateThres, id());
1908ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, (int32_t)thresholdPercent);
1918ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
1928ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1938ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1948ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
195dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
1965b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivivoid GenericPlayer::getDurationMsec(int* msec) {
1978ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    *msec = mDurationMsec;
1988ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1998ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
200be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivivoid GenericPlayer::getSampleRate(uint* hz) {
201be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi    *hz = mSampleRateHz;
202be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi}
203be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi
204fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi//--------------------------------------------------
2057e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kastenvoid GenericPlayer::setVolume(float leftVol, float rightVol)
2067e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten{
207fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    {
208fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
209fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[0] = leftVol;
210fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[1] = rightVol;
211fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
212fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // send a message for the volume to be updated by the object which implements the volume
213fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    (new AMessage(kWhatVolumeUpdate, id()))->post();
214fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
215fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
2165b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
2175b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi//--------------------------------------------------
21841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::attachAuxEffect(int32_t effectId)
21941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
22041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::attachAuxEffect(id=%d)", effectId);
22141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatAttachAuxEffect, id());
22241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setInt32(WHATPARAM_ATTACHAUXEFFECT, effectId);
22341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
22441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
22541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
22641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
22741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
22841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::setAuxEffectSendLevel(float level)
22941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
23041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::setAuxEffectSendLevel(level=%g)", level);
23141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetAuxEffectSendLevel, id());
23241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, level);
23341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
23441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
23541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
23641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
23741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
238a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
239a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::setPlayEvents(int32_t eventFlags, int32_t markerPositionMs,
240a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        int32_t positionUpdatePeriodMs)
241a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten{
242a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Normalize ms that are within the valid unsigned range, but not in the int32_t range
243a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (markerPositionMs < 0) {
244a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        markerPositionMs = ANDROID_UNKNOWN_TIME;
245a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
246a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionUpdatePeriodMs < 0) {
247a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionUpdatePeriodMs = ANDROID_UNKNOWN_TIME;
248a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
249a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // markers are delivered accurately, but new position updates are limited to every 100 ms
250a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionUpdatePeriodMs < 100) {
251a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionUpdatePeriodMs = 100;
252a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
253a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetPlayEvents, id());
254a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_FLAGS, eventFlags);
255a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_MARKER, markerPositionMs);
256a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_UPDATE, positionUpdatePeriodMs);
257a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->post();
258a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
259a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
260a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
261a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten//--------------------------------------------------
262dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
263dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone
264dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
265dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
266dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::resetDataLocator() {
2676e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::resetDataLocator()");
268d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    if (mDataLocatorType == kDataLocatorFd && mDataLocator.fdi.mCloseAfterUse) {
269d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten        (void) ::close(mDataLocator.fdi.fd);
270d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten        // would be redundant, as we're about to invalidate the union mDataLocator
271d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten        //mDataLocator.fdi.fd = -1;
272d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten        //mDataLocator.fdi.mCloseAfterUse = false;
273d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten    }
274dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorNone;
275dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
276dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
277dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
278dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data, bool async) {
2796e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notify(event=%s, data=%d, async=%s)", event, data,
2806e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            async ? "true" : "false");
281dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatNotif, id());
282dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt32(event, (int32_t)data);
283dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (async) {
284dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        msg->post();
285dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
286dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        this->onNotify(msg);
287dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
288dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
289dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
290dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
291fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data1, int data2, bool async) {
2926e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notify(event=%s, data1=%d, data2=%d, async=%s)", event, data1, data2,
2936e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            async ? "true" : "false");
294fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatNotif, id());
295fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    msg->setRect(event, 0, 0, (int32_t)data1, (int32_t)data2);
296fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    if (async) {
297fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        msg->post();
298fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else {
299fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        this->onNotify(msg);
300fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
301fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
302fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
303fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
304dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
305dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// AHandler implementation
306dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onMessageReceived(const sp<AMessage> &msg) {
3076e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onMessageReceived()");
308dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    switch (msg->what()) {
309dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPrepare:
3107e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten            SL_LOGV("kWhatPrepare");
311dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPrepare();
312dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
313dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
314dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatNotif:
3157e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten            SL_LOGV("kWhatNotif");
316dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onNotify(msg);
317dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
318dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
319dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPlay:
3206e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatPlay");
321dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPlay();
322dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
323dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
324dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPause:
3256e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatPause");
326dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPause();
327dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
328dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
329dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatSeek:
3306e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatSeek");
331dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onSeek(msg);
332dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
333dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
334dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatLoop:
3356e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatLoop");
336dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onLoop(msg);
337dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
338dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
339fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        case kWhatVolumeUpdate:
3406e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatVolumeUpdate");
341fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            onVolumeUpdate();
342fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            break;
343fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
3448ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatSeekComplete:
3456e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatSeekComplete");
3468ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onSeekComplete();
3478ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3488ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
3498ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatBufferingUpdate:
3506e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatBufferingUpdate");
3518ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onBufferingUpdate(msg);
3528ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3538ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
3548ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatBuffUpdateThres:
3556e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatBuffUpdateThres");
3568ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onSetBufferingUpdateThreshold(msg);
3578ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3588ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
35941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        case kWhatAttachAuxEffect:
36041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            SL_LOGV("kWhatAttachAuxEffect");
36141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            onAttachAuxEffect(msg);
36241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            break;
36341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
36441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        case kWhatSetAuxEffectSendLevel:
36541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            SL_LOGV("kWhatSetAuxEffectSendLevel");
36641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            onSetAuxEffectSendLevel(msg);
36741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            break;
36841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
369a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        case kWhatSetPlayEvents:
370a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("kWhatSetPlayEvents");
371a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            onSetPlayEvents(msg);
372a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            break;
373a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
374a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        case kWhatOneShot:
375a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("kWhatOneShot");
376a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            onOneShot(msg);
377a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            break;
378a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
379dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        default:
380a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGE("GenericPlayer::onMessageReceived unknown message %d", msg->what());
381dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            TRESPASS();
382dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
383dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
384dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
385dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
386dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
387dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Event handlers
3888ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//  it is strictly verboten to call those methods outside of the event loop
3898ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
390dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPrepare() {
3917e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten    SL_LOGV("GenericPlayer::onPrepare()");
392e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // Subclass is responsible for indicating whether prepare was successful or unsuccessful
393e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // by updating mStateFlags accordingly.  It must set exactly one of these two flags.
394e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    assert(!(mStateFlags & kFlagPrepared) != !(mStateFlags & kFlagPreparedUnsuccessfully));
395e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    notify(PLAYEREVENT_PREPARED, mStateFlags & kFlagPrepared ? PLAYER_SUCCESS : PLAYER_FAILURE,
396d097fa5798ab0d16265612036400f06928d1b414Glenn Kasten            true /*async*/);
39730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
398dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
399dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
400dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
401dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onNotify(const sp<AMessage> &msg) {
4026e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onNotify()");
4031209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    notif_cbf_t notifClient;
4041209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    void*       notifUser;
4051209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
4061209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
4071209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        if (NULL == mNotifyClient) {
4081209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            return;
4091209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        } else {
4101209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifClient = mNotifyClient;
4111209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifUser   = mNotifyUser;
4121209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        }
413dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
414dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
415fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    int32_t val1, val2;
4168ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(PLAYEREVENT_PREFETCHSTATUSCHANGE, &val1)) {
4178ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHSTATUSCHANGE, val1);
4181209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchStatusChange, val1, 0, notifUser);
4198ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, &val1)) {
4208ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHFILLLEVELUPDATE, val1);
4211209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchFillLevelUpdate, val1, 0, notifUser);
4228ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_ENDOFSTREAM, &val1)) {
4238ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_ENDOFSTREAM, val1);
4241209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventEndOfStream, val1, 0, notifUser);
4258ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREPARED, &val1)) {
426fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREPARED, val1);
4271209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrepared, val1, 0, notifUser);
4287e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten    } else if (msg->findInt32(PLAYEREVENT_CHANNEL_COUNT, &val1)) {
4297e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_CHANNEL_COUNT, val1);
4307e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        notifClient(kEventChannelCount, val1, 0, notifUser);
431fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else if (msg->findRect(PLAYEREVENT_VIDEO_SIZE_UPDATE, &val1, &val2, &val1, &val2)) {
4328ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d, %d", PLAYEREVENT_VIDEO_SIZE_UPDATE, val1, val2);
4331209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventHasVideoSize, val1, val2, notifUser);
434a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    } else if (msg->findInt32(PLAYEREVENT_PLAY, &val1)) {
435a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PLAY, val1);
436a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        notifClient(kEventPlay, val1, 0, notifUser);
4376e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    } else {
4386e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten        SL_LOGV("GenericPlayer notifying unknown");
439dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
440dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
441dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
442dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
443dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPlay() {
44430ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPlay()");
445a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mStateFlags & (kFlagPrepared | kFlagPlaying)) == kFlagPrepared) {
44630ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi        SL_LOGD("starting player");
447dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
448a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
449dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
450dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
451dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
452dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
453dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPause() {
45430ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPause()");
455a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(~mStateFlags & (kFlagPrepared | kFlagPlaying))) {
456a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        SL_LOGV("pausing player");
457dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
458a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
459dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
460dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
461dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
462dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
463dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onSeek(const sp<AMessage> &msg) {
464dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onSeek");
465dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
466dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
467dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
468dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onLoop(const sp<AMessage> &msg) {
469dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onLoop");
470dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
471dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
472fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
473fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid GenericPlayer::onVolumeUpdate() {
4746e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onVolumeUpdate");
475fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
476fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
4778ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4788ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSeekComplete() {
4798ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    SL_LOGD("GenericPlayer::onSeekComplete()");
4808ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mStateFlags &= ~kFlagSeeking;
481a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // avoid spurious or lost events caused by seeking past a marker
482a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mDeliveredNewPosMs = ANDROID_UNKNOWN_TIME;
483a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mObservedPositionMs = ANDROID_UNKNOWN_TIME;
484a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    updateOneShot();
4858ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4868ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4878ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4888ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
4896e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onBufferingUpdate");
4908ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4918ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4928ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4938ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSetBufferingUpdateThreshold(const sp<AMessage> &msg) {
4946e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onSetBufferingUpdateThreshold");
4958ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int32_t thresholdPercent = 0;
4968ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, &thresholdPercent)) {
4978ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
4988ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFillNotifThreshold = (int16_t)thresholdPercent;
4998ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    }
5008ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5018ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5028ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
50341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
50441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onAttachAuxEffect()");
50541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
50641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
50741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
50841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
50941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onSetAuxEffectSendLevel()");
51041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
51141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
51241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
513a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::onSetPlayEvents(const sp<AMessage> &msg) {
514a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::onSetPlayEvents()");
515a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t eventFlags, markerPositionMs, positionUpdatePeriodMs;
516a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (msg->findInt32(WHATPARAM_SETPLAYEVENTS_FLAGS, &eventFlags) &&
517a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            msg->findInt32(WHATPARAM_SETPLAYEVENTS_MARKER, &markerPositionMs) &&
518a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            msg->findInt32(WHATPARAM_SETPLAYEVENTS_UPDATE, &positionUpdatePeriodMs)) {
519a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mEventFlags = eventFlags;
520a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mMarkerPositionMs = markerPositionMs;
521a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mPositionUpdatePeriodMs = positionUpdatePeriodMs;
522a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
523a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
524a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
525a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
526a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
527a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::onOneShot(const sp<AMessage> &msg) {
528a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::onOneShot()");
529a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t generation;
530a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (msg->findInt32(WHATPARAM_ONESHOT_GENERATION, &generation)) {
531a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (generation != mOneShotGeneration) {
532a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("GenericPlayer::onOneShot() generation %d cancelled; latest is %d",
533a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten                    generation, mOneShotGeneration);
534a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            return;
535a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
536a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
537a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
538a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
539a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
540a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
5418ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//-------------------------------------------------
5428ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyStatus() {
5436e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyStatus");
5448ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHSTATUSCHANGE, (int32_t)mCacheStatus, true /*async*/);
5458ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5468ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5478ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5488ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyCacheFill() {
5496e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyCacheFill");
5508ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mLastNotifiedCacheFill = mCacheFill;
5518ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, (int32_t)mLastNotifiedCacheFill, true/*async*/);
5528ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5538ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5548ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5558ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::seekComplete() {
5566e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::seekComplete");
5578ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeekComplete, id());
5588ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5598ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5608ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5618ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5628ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::bufferingUpdate(int16_t fillLevelPerMille) {
5636e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::bufferingUpdate");
5648ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBufferingUpdate, id());
5658ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATE, fillLevelPerMille);
5668ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5678ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5688ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
569a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
570a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// For the meaning of positionMs, see comment in declaration at android_GenericPlayer.h
571a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::updateOneShot(int positionMs)
572a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten{
573a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::updateOneShot");
574a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
575a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // nop until prepared
576a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(mStateFlags & kFlagPrepared)) {
577a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        return;
578a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
579a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
580a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // cancel any pending one-shot(s)
581a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    ++mOneShotGeneration;
582a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
583a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // don't restart one-shot if player is paused or stopped
584a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(mStateFlags & kFlagPlaying)) {
585a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        return;
586a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
587a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
588a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // get current player position in milliseconds
589a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionMs < 0) {
590a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionMs = ANDROID_UNKNOWN_TIME;
591a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
592a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionMs == ANDROID_UNKNOWN_TIME) {
593a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        getPositionMsec(&positionMs);
594a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // normalize it
595a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (positionMs < 0) {
596a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            positionMs = ANDROID_UNKNOWN_TIME;
597a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
598a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (ANDROID_UNKNOWN_TIME == positionMs) {
599332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            // getPositionMsec is not working for some reason, give up
600332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            //LOGV("Does anyone really know what time it is?");
601a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            return;
602a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
603a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
604a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
605332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten    // delayUs is the expected delay between current position and marker;
606332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten    // the default is infinity in case there are no upcoming marker(s)
607a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int64_t delayUs = -1;
608332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten
609a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // is there a marker?
610a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mEventFlags & SL_PLAYEVENT_HEADATMARKER) && (mMarkerPositionMs != ANDROID_UNKNOWN_TIME)) {
611a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // check to see if we have observed the position passing through the marker
612a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mObservedPositionMs <= mMarkerPositionMs && mMarkerPositionMs <= positionMs) {
613a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            notify(PLAYEREVENT_PLAY, (int32_t) SL_PLAYEVENT_HEADATMARKER, true /*async*/);
614a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else if (positionMs < mMarkerPositionMs) {
615a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = (mMarkerPositionMs - positionMs) * 1000LL;
616a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
617a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
618332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten
619a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // are periodic position updates needed?
620a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mEventFlags & SL_PLAYEVENT_HEADATNEWPOS) &&
621a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            (mPositionUpdatePeriodMs != ANDROID_UNKNOWN_TIME)) {
622a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // check to see if we have observed the position passing through a virtual marker, where the
623a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // virtual marker is at the previously delivered new position plus position update period
624a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        int32_t virtualMarkerMs;
625a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mDeliveredNewPosMs != ANDROID_UNKNOWN_TIME) {
626a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = mDeliveredNewPosMs + mPositionUpdatePeriodMs;
627a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else if (mObservedPositionMs != ANDROID_UNKNOWN_TIME) {
628a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = mObservedPositionMs + mPositionUpdatePeriodMs;
629332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            // pretend there has been an update in the past
630332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            mDeliveredNewPosMs = mObservedPositionMs;
631a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else {
632a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = positionMs + mPositionUpdatePeriodMs;
633332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            // pretend there has been an update in the past
634332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            mDeliveredNewPosMs = positionMs;
635a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
636332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten        // nextVirtualMarkerMs will be set to the position of the next upcoming virtual marker
637332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten        int32_t nextVirtualMarkerMs;
638a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mObservedPositionMs <= virtualMarkerMs && virtualMarkerMs <= positionMs) {
639332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            // we did pass through the virtual marker, now compute the next virtual marker
640a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            mDeliveredNewPosMs = virtualMarkerMs;
641332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            nextVirtualMarkerMs = virtualMarkerMs + mPositionUpdatePeriodMs;
642a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            // re-synchronize if we missed an update
643332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            if (nextVirtualMarkerMs <= positionMs) {
644332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten                SL_LOGW("Missed SL_PLAYEVENT_HEADATNEWPOS for position %d; current position %d",
645332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten                        nextVirtualMarkerMs, positionMs);
646332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten                // try to catch up by setting next goal to current position plus update period
647332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten                mDeliveredNewPosMs = positionMs;
648332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten                nextVirtualMarkerMs = positionMs + mPositionUpdatePeriodMs;
649a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            }
650a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            notify(PLAYEREVENT_PLAY, (int32_t) SL_PLAYEVENT_HEADATNEWPOS, true /*async*/);
651332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten        } else {
652332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            // we did not pass through the virtual marker yet, so use same marker again
653332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            nextVirtualMarkerMs = virtualMarkerMs;
654a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
655332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten        // note that if arithmetic overflow occurred, nextVirtualMarkerMs will be negative
656332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten        if (positionMs < nextVirtualMarkerMs) {
657a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            int64_t trialDelayUs;
658332b3a2a95b76ea90ce23be0b48403a9dd88c1b3Glenn Kasten            trialDelayUs = (nextVirtualMarkerMs - positionMs) * 1000LL;
659a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            if (trialDelayUs > 0 && (delayUs == -1 || trialDelayUs < delayUs)) {
660a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten                delayUs = trialDelayUs;
661a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            }
662a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
663a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
664a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
665a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // we have a new observed position
666a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mObservedPositionMs = positionMs;
667a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
668a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // post the new one-shot message if needed
669becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    if (advancesPositionInRealTime() && delayUs >= 0) {
670a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // 20 ms min delay to avoid near busy waiting
671a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (delayUs < 20000LL) {
672a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = 20000LL;
673a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
674a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // 1 minute max delay avoids indefinite memory leaks caused by cancelled one-shots
675a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (delayUs > 60000000LL) {
676a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = 60000000LL;
677a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
678a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        //SL_LOGI("delayUs = %lld", delayUs);
679a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        sp<AMessage> msg = new AMessage(kWhatOneShot, id());
680a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        msg->setInt32(WHATPARAM_ONESHOT_GENERATION, mOneShotGeneration);
681a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        msg->post(delayUs);
682a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
683a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
684a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
685a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
686dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android
687