android_GenericPlayer.cpp revision a81ac67d31590942f5a3a8233cf9759c20a494dc
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),
32dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mLooperPriority(PRIORITY_DEFAULT),
33fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mPlaybackParams(*params),
34463a7641944e4a3613f5d76aa8450070ef56b9ffGlenn Kasten        mChannelCount(UNKNOWN_NUMCHANNELS),
358ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mDurationMsec(ANDROID_UNKNOWN_TIME),
36463a7641944e4a3613f5d76aa8450070ef56b9ffGlenn Kasten        mSampleRateHz(UNKNOWN_SAMPLERATE),
378ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheStatus(kStatusEmpty),
388ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFill(0),
398ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mLastNotifiedCacheFill(0),
40a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mCacheFillNotifThreshold(100),
41a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mEventFlags(0),
42a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mMarkerPositionMs(ANDROID_UNKNOWN_TIME),
43a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mPositionUpdatePeriodMs(1000), // per spec
44a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mOneShotGeneration(0),
45a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mDeliveredNewPosMs(ANDROID_UNKNOWN_TIME),
46a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mObservedPositionMs(ANDROID_UNKNOWN_TIME)
47dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{
4830ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::GenericPlayer()");
49dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
50dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper = new android::ALooper();
51dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
52fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[0] = 1.0f;
53fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[1] = 1.0f;
54dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
55dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
57dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviGenericPlayer::~GenericPlayer() {
583f324661dd8bf33dd3fb2afeb84fbb05262a0d08Glenn Kasten    SL_LOGV("GenericPlayer::~GenericPlayer()");
59dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
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);
73dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, mLooperPriority);
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
100dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
1016e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setDataSource(fd=%d, offset=%lld, length=%lld)", fd, offset, length);
102dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    resetDataLocator();
103dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
104dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.fd = fd;
105dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
106dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    struct stat sb;
107dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    int ret = fstat(fd, &sb);
108dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (ret != 0) {
109dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("GenericPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
110dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
111dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
112dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
113dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (offset >= sb.st_size) {
114dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("SfPlayer::setDataSource: invalid offset");
115dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
116dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
117dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.offset = offset;
118dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
119dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (PLAYER_FD_FIND_FILE_SIZE == length) {
120dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size;
121dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else if (offset + length > sb.st_size) {
122dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size - offset;
123dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
124dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = length;
125dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
126dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
127dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorFd;
128dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
129dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
130dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
131dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::prepare() {
13230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::prepare()");
133dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPrepare, id());
134dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
135dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
136dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
137dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
138dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::play() {
13930ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::play()");
140dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPlay, id());
141dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
142dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
143dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
144dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
145dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::pause() {
14630ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::pause()");
147dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPause, id());
148dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
149dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
150dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
151dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
152dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::stop() {
15330ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::stop()");
154dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    (new AMessage(kWhatPause, id()))->post();
155dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
156dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // after a stop, playback should resume from the start.
157dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    seek(0);
158dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
159dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
160dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
161dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::seek(int64_t timeMsec) {
162dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::seek %lld", timeMsec);
163f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    if (timeMsec < 0) {
164f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        SL_LOGE("GenericPlayer::seek error, can't seek to negative time %lldms", timeMsec);
165f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        return;
166f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    }
167dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeek, id());
168dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt64(WHATPARAM_SEEK_SEEKTIME_MS, timeMsec);
169dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
170dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
171dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
172dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
173dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::loop(bool loop) {
1746e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::loop %s", loop ? "true" : "false");
175dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatLoop, id());
176dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt32(WHATPARAM_LOOP_LOOPING, (int32_t)loop);
177dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
178dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
179dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
180dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
1818ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::setBufferingUpdateThreshold(int16_t thresholdPercent) {
1826e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setBufferingUpdateThreshold %d", thresholdPercent);
1838ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBuffUpdateThres, id());
1848ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, (int32_t)thresholdPercent);
1858ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
1868ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1878ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1888ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
189dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
1905b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivivoid GenericPlayer::getDurationMsec(int* msec) {
1918ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    *msec = mDurationMsec;
1928ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1938ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
194be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivivoid GenericPlayer::getSampleRate(uint* hz) {
195be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi    *hz = mSampleRateHz;
196be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi}
197be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi
198fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi//--------------------------------------------------
1997e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kastenvoid GenericPlayer::setVolume(float leftVol, float rightVol)
2007e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten{
201fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    {
202fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
203fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[0] = leftVol;
204fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[1] = rightVol;
205fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
206fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // send a message for the volume to be updated by the object which implements the volume
207fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    (new AMessage(kWhatVolumeUpdate, id()))->post();
208fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
209fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
2105b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
2115b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi//--------------------------------------------------
21241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::attachAuxEffect(int32_t effectId)
21341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
21441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::attachAuxEffect(id=%d)", effectId);
21541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatAttachAuxEffect, id());
21641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setInt32(WHATPARAM_ATTACHAUXEFFECT, effectId);
21741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
21841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
21941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
22041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
22141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
22241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::setAuxEffectSendLevel(float level)
22341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
22441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::setAuxEffectSendLevel(level=%g)", level);
22541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetAuxEffectSendLevel, id());
22641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, level);
22741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
22841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
22941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
23041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
23141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
232a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// Call after changing any of the IPlay settings related to SL_PLAYEVENT_*
233a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::setPlayEvents(int32_t eventFlags, int32_t markerPositionMs,
234a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        int32_t positionUpdatePeriodMs)
235a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten{
236a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // Normalize ms that are within the valid unsigned range, but not in the int32_t range
237a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (markerPositionMs < 0) {
238a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        markerPositionMs = ANDROID_UNKNOWN_TIME;
239a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
240a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionUpdatePeriodMs < 0) {
241a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionUpdatePeriodMs = ANDROID_UNKNOWN_TIME;
242a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
243a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // markers are delivered accurately, but new position updates are limited to every 100 ms
244a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionUpdatePeriodMs < 100) {
245a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionUpdatePeriodMs = 100;
246a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
247a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetPlayEvents, id());
248a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_FLAGS, eventFlags);
249a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_MARKER, markerPositionMs);
250a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->setInt32(WHATPARAM_SETPLAYEVENTS_UPDATE, positionUpdatePeriodMs);
251a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    msg->post();
252a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
253a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
254a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
255a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten//--------------------------------------------------
256dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
257dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone
258dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
259dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
260dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::resetDataLocator() {
2616e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::resetDataLocator()");
262dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorNone;
263dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
264dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
265dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
266dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data, bool async) {
2676e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notify(event=%s, data=%d, async=%s)", event, data,
2686e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            async ? "true" : "false");
269dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatNotif, id());
270dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt32(event, (int32_t)data);
271dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (async) {
272dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        msg->post();
273dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
274dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        this->onNotify(msg);
275dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
276dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
277dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
278dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
279fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data1, int data2, bool async) {
2806e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notify(event=%s, data1=%d, data2=%d, async=%s)", event, data1, data2,
2816e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            async ? "true" : "false");
282fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatNotif, id());
283fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    msg->setRect(event, 0, 0, (int32_t)data1, (int32_t)data2);
284fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    if (async) {
285fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        msg->post();
286fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else {
287fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        this->onNotify(msg);
288fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
289fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
290fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
291fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
292dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
293dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// AHandler implementation
294dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onMessageReceived(const sp<AMessage> &msg) {
2956e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onMessageReceived()");
296dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    switch (msg->what()) {
297dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPrepare:
2987e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten            SL_LOGV("kWhatPrepare");
299dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPrepare();
300dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
301dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
302dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatNotif:
3037e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten            SL_LOGV("kWhatNotif");
304dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onNotify(msg);
305dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
306dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
307dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPlay:
3086e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatPlay");
309dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPlay();
310dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
311dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
312dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatPause:
3136e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatPause");
314dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPause();
315dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
316dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
317dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatSeek:
3186e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatSeek");
319dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onSeek(msg);
320dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
321dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
322dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatLoop:
3236e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatLoop");
324dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onLoop(msg);
325dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
326dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
327fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        case kWhatVolumeUpdate:
3286e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatVolumeUpdate");
329fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            onVolumeUpdate();
330fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            break;
331fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
3328ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatSeekComplete:
3336e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatSeekComplete");
3348ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onSeekComplete();
3358ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3368ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
3378ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatBufferingUpdate:
3386e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatBufferingUpdate");
3398ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onBufferingUpdate(msg);
3408ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3418ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
3428ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        case kWhatBuffUpdateThres:
3436e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatBuffUpdateThres");
3448ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            onSetBufferingUpdateThreshold(msg);
3458ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi            break;
3468ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
34741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        case kWhatAttachAuxEffect:
34841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            SL_LOGV("kWhatAttachAuxEffect");
34941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            onAttachAuxEffect(msg);
35041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            break;
35141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
35241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten        case kWhatSetAuxEffectSendLevel:
35341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            SL_LOGV("kWhatSetAuxEffectSendLevel");
35441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            onSetAuxEffectSendLevel(msg);
35541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten            break;
35641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
357a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        case kWhatSetPlayEvents:
358a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("kWhatSetPlayEvents");
359a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            onSetPlayEvents(msg);
360a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            break;
361a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
362a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        case kWhatOneShot:
363a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("kWhatOneShot");
364a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            onOneShot(msg);
365a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            break;
366a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
367dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        default:
368a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGE("GenericPlayer::onMessageReceived unknown message %d", msg->what());
369dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            TRESPASS();
370dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
371dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
372dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
373dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
374dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
375dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Event handlers
3768ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//  it is strictly verboten to call those methods outside of the event loop
3778ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
378dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPrepare() {
3797e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten    SL_LOGV("GenericPlayer::onPrepare()");
380e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // Subclass is responsible for indicating whether prepare was successful or unsuccessful
381e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // by updating mStateFlags accordingly.  It must set exactly one of these two flags.
382e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    assert(!(mStateFlags & kFlagPrepared) != !(mStateFlags & kFlagPreparedUnsuccessfully));
383e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    notify(PLAYEREVENT_PREPARED, mStateFlags & kFlagPrepared ? PLAYER_SUCCESS : PLAYER_FAILURE,
384e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten            false /*async*/);
38530ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
386dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
387dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
388dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
389dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onNotify(const sp<AMessage> &msg) {
3906e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onNotify()");
3911209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    notif_cbf_t notifClient;
3921209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    void*       notifUser;
3931209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
3941209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
3951209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        if (NULL == mNotifyClient) {
3961209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            return;
3971209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        } else {
3981209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifClient = mNotifyClient;
3991209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifUser   = mNotifyUser;
4001209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        }
401dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
402dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
403fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    int32_t val1, val2;
4048ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(PLAYEREVENT_PREFETCHSTATUSCHANGE, &val1)) {
4058ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHSTATUSCHANGE, val1);
4061209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchStatusChange, val1, 0, notifUser);
4078ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, &val1)) {
4088ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHFILLLEVELUPDATE, val1);
4091209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchFillLevelUpdate, val1, 0, notifUser);
4108ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_ENDOFSTREAM, &val1)) {
4118ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_ENDOFSTREAM, val1);
4121209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventEndOfStream, val1, 0, notifUser);
4138ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREPARED, &val1)) {
414fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREPARED, val1);
4151209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrepared, val1, 0, notifUser);
4167e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten    } else if (msg->findInt32(PLAYEREVENT_CHANNEL_COUNT, &val1)) {
4177e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_CHANNEL_COUNT, val1);
4187e4729ac84d876de3ae439ae9cfef41701d6a2a2Glenn Kasten        notifClient(kEventChannelCount, val1, 0, notifUser);
419fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else if (msg->findRect(PLAYEREVENT_VIDEO_SIZE_UPDATE, &val1, &val2, &val1, &val2)) {
4208ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d, %d", PLAYEREVENT_VIDEO_SIZE_UPDATE, val1, val2);
4211209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventHasVideoSize, val1, val2, notifUser);
422a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    } else if (msg->findInt32(PLAYEREVENT_PLAY, &val1)) {
423a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PLAY, val1);
424a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        notifClient(kEventPlay, val1, 0, notifUser);
4256e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    } else {
4266e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten        SL_LOGV("GenericPlayer notifying unknown");
427dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
428dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
429dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
430dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
431dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPlay() {
43230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPlay()");
433a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mStateFlags & (kFlagPrepared | kFlagPlaying)) == kFlagPrepared) {
43430ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi        SL_LOGD("starting player");
435dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
436a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
437dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
438dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
439dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
440dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
441dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPause() {
44230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPause()");
443a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(~mStateFlags & (kFlagPrepared | kFlagPlaying))) {
444a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        SL_LOGV("pausing player");
445dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
446a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
447dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
448dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
449dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
450dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
451dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onSeek(const sp<AMessage> &msg) {
452dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onSeek");
453dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
454dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
455dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
456dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onLoop(const sp<AMessage> &msg) {
457dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onLoop");
458dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
459dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
460fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
461fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid GenericPlayer::onVolumeUpdate() {
4626e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onVolumeUpdate");
463fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
464fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
4658ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4668ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSeekComplete() {
4678ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    SL_LOGD("GenericPlayer::onSeekComplete()");
4688ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mStateFlags &= ~kFlagSeeking;
469a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // avoid spurious or lost events caused by seeking past a marker
470a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mDeliveredNewPosMs = ANDROID_UNKNOWN_TIME;
471a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mObservedPositionMs = ANDROID_UNKNOWN_TIME;
472a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    updateOneShot();
4738ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4748ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4758ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4768ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
4776e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onBufferingUpdate");
4788ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4798ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4808ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4818ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSetBufferingUpdateThreshold(const sp<AMessage> &msg) {
4826e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onSetBufferingUpdateThreshold");
4838ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int32_t thresholdPercent = 0;
4848ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, &thresholdPercent)) {
4858ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
4868ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFillNotifThreshold = (int16_t)thresholdPercent;
4878ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    }
4888ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4898ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4908ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
49141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
49241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onAttachAuxEffect()");
49341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
49441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
49541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
49641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
49741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onSetAuxEffectSendLevel()");
49841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
49941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
50041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
501a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::onSetPlayEvents(const sp<AMessage> &msg) {
502a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::onSetPlayEvents()");
503a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t eventFlags, markerPositionMs, positionUpdatePeriodMs;
504a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (msg->findInt32(WHATPARAM_SETPLAYEVENTS_FLAGS, &eventFlags) &&
505a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            msg->findInt32(WHATPARAM_SETPLAYEVENTS_MARKER, &markerPositionMs) &&
506a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            msg->findInt32(WHATPARAM_SETPLAYEVENTS_UPDATE, &positionUpdatePeriodMs)) {
507a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mEventFlags = eventFlags;
508a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mMarkerPositionMs = markerPositionMs;
509a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        mPositionUpdatePeriodMs = positionUpdatePeriodMs;
510a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
511a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
512a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
513a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
514a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
515a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::onOneShot(const sp<AMessage> &msg) {
516a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::onOneShot()");
517a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int32_t generation;
518a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (msg->findInt32(WHATPARAM_ONESHOT_GENERATION, &generation)) {
519a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (generation != mOneShotGeneration) {
520a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            SL_LOGV("GenericPlayer::onOneShot() generation %d cancelled; latest is %d",
521a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten                    generation, mOneShotGeneration);
522a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            return;
523a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
524a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        updateOneShot();
525a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
526a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
527a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
528a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
5298ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//-------------------------------------------------
5308ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyStatus() {
5316e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyStatus");
5328ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHSTATUSCHANGE, (int32_t)mCacheStatus, true /*async*/);
5338ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5348ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5358ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5368ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyCacheFill() {
5376e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyCacheFill");
5388ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mLastNotifiedCacheFill = mCacheFill;
5398ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, (int32_t)mLastNotifiedCacheFill, true/*async*/);
5408ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5418ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5428ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5438ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::seekComplete() {
5446e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::seekComplete");
5458ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeekComplete, id());
5468ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5478ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5488ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5498ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5508ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::bufferingUpdate(int16_t fillLevelPerMille) {
5516e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::bufferingUpdate");
5528ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBufferingUpdate, id());
5538ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATE, fillLevelPerMille);
5548ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5558ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5568ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
557a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
558a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten// For the meaning of positionMs, see comment in declaration at android_GenericPlayer.h
559a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kastenvoid GenericPlayer::updateOneShot(int positionMs)
560a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten{
561a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    SL_LOGV("GenericPlayer::updateOneShot");
562a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
563a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // nop until prepared
564a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(mStateFlags & kFlagPrepared)) {
565a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        return;
566a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
567a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
568a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // cancel any pending one-shot(s)
569a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    ++mOneShotGeneration;
570a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
571a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // don't restart one-shot if player is paused or stopped
572a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (!(mStateFlags & kFlagPlaying)) {
573a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        return;
574a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
575a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
576a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // get current player position in milliseconds
577a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionMs < 0) {
578a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        positionMs = ANDROID_UNKNOWN_TIME;
579a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
580a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (positionMs == ANDROID_UNKNOWN_TIME) {
581a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        getPositionMsec(&positionMs);
582a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // normalize it
583a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (positionMs < 0) {
584a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            positionMs = ANDROID_UNKNOWN_TIME;
585a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
586a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (ANDROID_UNKNOWN_TIME == positionMs) {
587a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            // we can't proceed if we don't know where we are now
588a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            return;
589a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
590a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
591a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
592a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // default one-shot delay is infinity
593a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    int64_t delayUs = -1;
594a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // is there a marker?
595a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mEventFlags & SL_PLAYEVENT_HEADATMARKER) && (mMarkerPositionMs != ANDROID_UNKNOWN_TIME)) {
596a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // check to see if we have observed the position passing through the marker
597a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mObservedPositionMs <= mMarkerPositionMs && mMarkerPositionMs <= positionMs) {
598a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            notify(PLAYEREVENT_PLAY, (int32_t) SL_PLAYEVENT_HEADATMARKER, true /*async*/);
599a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else if (positionMs < mMarkerPositionMs) {
600a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = (mMarkerPositionMs - positionMs) * 1000LL;
601a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
602a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
603a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // are periodic position updates needed?
604a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if ((mEventFlags & SL_PLAYEVENT_HEADATNEWPOS) &&
605a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            (mPositionUpdatePeriodMs != ANDROID_UNKNOWN_TIME)) {
606a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // check to see if we have observed the position passing through a virtual marker, where the
607a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // virtual marker is at the previously delivered new position plus position update period
608a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        int32_t virtualMarkerMs;
609a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mDeliveredNewPosMs != ANDROID_UNKNOWN_TIME) {
610a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = mDeliveredNewPosMs + mPositionUpdatePeriodMs;
611a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else if (mObservedPositionMs != ANDROID_UNKNOWN_TIME) {
612a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = mObservedPositionMs + mPositionUpdatePeriodMs;
613a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        } else {
614a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs = positionMs + mPositionUpdatePeriodMs;
615a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
616a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (mObservedPositionMs <= virtualMarkerMs && virtualMarkerMs <= positionMs) {
617a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            mDeliveredNewPosMs = virtualMarkerMs;
618a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            virtualMarkerMs += mPositionUpdatePeriodMs;
619a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            // re-synchronize if we missed an update
620a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            if (virtualMarkerMs <= positionMs) {
621a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten                virtualMarkerMs = positionMs + mPositionUpdatePeriodMs;
622a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            }
623a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            notify(PLAYEREVENT_PLAY, (int32_t) SL_PLAYEVENT_HEADATNEWPOS, true /*async*/);
624a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
625a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // note that if arithmetic overflow occurred, virtualMarkerMs will be negative
626a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (positionMs < virtualMarkerMs) {
627a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            int64_t trialDelayUs;
628a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            trialDelayUs = (virtualMarkerMs - positionMs) * 1000LL;
629a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            if (trialDelayUs > 0 && (delayUs == -1 || trialDelayUs < delayUs)) {
630a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten                delayUs = trialDelayUs;
631a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            }
632a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
633a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
634a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
635a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // we have a new observed position
636a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    mObservedPositionMs = positionMs;
637a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
638a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    // post the new one-shot message if needed
639a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    if (delayUs >= 0) {
640a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // 20 ms min delay to avoid near busy waiting
641a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (delayUs < 20000LL) {
642a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = 20000LL;
643a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
644a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        // 1 minute max delay avoids indefinite memory leaks caused by cancelled one-shots
645a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        if (delayUs > 60000000LL) {
646a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten            delayUs = 60000000LL;
647a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        }
648a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        //SL_LOGI("delayUs = %lld", delayUs);
649a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        sp<AMessage> msg = new AMessage(kWhatOneShot, id());
650a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        msg->setInt32(WHATPARAM_ONESHOT_GENERATION, mOneShotGeneration);
651a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten        msg->post(delayUs);
652a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten    }
653a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
654a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten}
655a81ac67d31590942f5a3a8233cf9759c20a494dcGlenn Kasten
656dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android
657