android_GenericPlayer.cpp revision 41562990ca46e5d6c4aadde6c2469b8007bb980c
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),
368ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mPositionMsec(ANDROID_UNKNOWN_TIME),
37463a7641944e4a3613f5d76aa8450070ef56b9ffGlenn Kasten        mSampleRateHz(UNKNOWN_SAMPLERATE),
388ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheStatus(kStatusEmpty),
398ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFill(0),
408ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mLastNotifiedCacheFill(0),
418ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFillNotifThreshold(100)
42dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{
4330ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::GenericPlayer()");
44dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
45dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper = new android::ALooper();
46dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
47fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mMute = false;
48fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[0] = 1.0f;
49fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    mAndroidAudioLevels.mFinalVolume[1] = 1.0f;
50dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
51dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
52dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
53dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviGenericPlayer::~GenericPlayer() {
543f324661dd8bf33dd3fb2afeb84fbb05262a0d08Glenn Kasten    SL_LOGV("GenericPlayer::~GenericPlayer()");
55dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
57dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
58dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
59dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::init(const notif_cbf_t cbf, void* notifUser) {
6030ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::init()");
61dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
621209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
631209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
641209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyClient = cbf;
651209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyUser = notifUser;
661209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    }
67dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
68dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper->registerHandler(this);
69dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, mLooperPriority);
70dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
71dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
72dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
731209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivivoid GenericPlayer::preDestroy() {
741209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    SL_LOGD("GenericPlayer::preDestroy()");
751209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
761209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
771209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyClient = NULL;
781209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        mNotifyUser = NULL;
791209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    }
801209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
811209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    mLooper->stop();
821209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    mLooper->unregisterHandler(id());
831209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi}
841209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
851209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi
86dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::setDataSource(const char *uri) {
876e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setDataSource(uri=%s)", uri);
88dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    resetDataLocator();
89dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
90dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.uriRef = uri;
91dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
92dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorUri;
93dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
94dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
95dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
96dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
976e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setDataSource(fd=%d, offset=%lld, length=%lld)", fd, offset, length);
98dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    resetDataLocator();
99dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
100dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.fd = fd;
101dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
102dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    struct stat sb;
103dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    int ret = fstat(fd, &sb);
104dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (ret != 0) {
105dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("GenericPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno));
106dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
107dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
108dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
109dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (offset >= sb.st_size) {
110dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGE("SfPlayer::setDataSource: invalid offset");
111dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
112dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
113dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocator.fdi.offset = offset;
114dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
115dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (PLAYER_FD_FIND_FILE_SIZE == length) {
116dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size;
117dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else if (offset + length > sb.st_size) {
118dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = sb.st_size - offset;
119dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
120dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDataLocator.fdi.length = length;
121dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
122dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
123dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDataLocatorType = kDataLocatorFd;
124dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
125dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
126dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
127dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::prepare() {
12830ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::prepare()");
129dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPrepare, id());
130dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
131dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
132dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
133dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
134dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::play() {
13530ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::play()");
136dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPlay, id());
137dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
138dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
139dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
140dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
141dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::pause() {
14230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::pause()");
143dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatPause, id());
144dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
145dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
146dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
147dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
148dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::stop() {
14930ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::stop()");
150dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    (new AMessage(kWhatPause, id()))->post();
151dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
152dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    // after a stop, playback should resume from the start.
153dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    seek(0);
154dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
155dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
156dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
157dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::seek(int64_t timeMsec) {
158dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::seek %lld", timeMsec);
159f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    if (timeMsec < 0) {
160f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        SL_LOGE("GenericPlayer::seek error, can't seek to negative time %lldms", timeMsec);
161f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi        return;
162f096e77e6cbfc60263f42b435cb34fbab7be2e45Jean-Michel Trivi    }
163dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeek, id());
164dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt64(WHATPARAM_SEEK_SEEKTIME_MS, timeMsec);
165dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
166dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
167dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
168dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
169dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::loop(bool loop) {
1706e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::loop %s", loop ? "true" : "false");
171dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatLoop, id());
172dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->setInt32(WHATPARAM_LOOP_LOOPING, (int32_t)loop);
173dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    msg->post();
174dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
175dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
176dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
1778ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::setBufferingUpdateThreshold(int16_t thresholdPercent) {
1786e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setBufferingUpdateThreshold %d", thresholdPercent);
1798ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBuffUpdateThres, id());
1808ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, (int32_t)thresholdPercent);
1818ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
1828ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1838ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1848ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
185dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
1865b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivivoid GenericPlayer::getDurationMsec(int* msec) {
1878ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    *msec = mDurationMsec;
1888ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
1898ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
1908ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::getPositionMsec(int* msec) {
1918ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    *msec = mPositionMsec;
1925b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi}
1935b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
194be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivivoid GenericPlayer::getSampleRate(uint* hz) {
195be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi    *hz = mSampleRateHz;
196be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi}
197be91f6328a084475e1cf58b54b8b732e088940b5Jean-Michel Trivi
198fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi//--------------------------------------------------
1998ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::setVolume(bool mute, bool useStereoPos,
200fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        XApermille stereoPos, XAmillibel volume) {
2016e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::setVolume mute=%s, useStereoPos=%s, stereoPos=%d, volume=%d",
2026e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            mute ?  "true" : "false", useStereoPos ? "true" : "false", stereoPos, volume);
203fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
204fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // compute amplification as the combination of volume level and stereo position
205fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    float leftVol = 1.0f, rightVol = 1.0f;
206fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    //   amplification from volume level
207fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    leftVol  *= sles_to_android_amplification(volume);
208fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    rightVol = leftVol;
209fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
210fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    //   amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf)
211fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // FIXME use calculation below when supporting effects
212fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    //leftVol  *= mAndroidAudioLevels.mAmplFromDirectLevel;
213fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    //rightVol *= mAndroidAudioLevels.mAmplFromDirectLevel;
214fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
215fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // amplification from stereo position
216fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    if (useStereoPos) {
217fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        // panning law depends on number of channels of content: stereo panning vs 2ch. balance
218fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        if (1 == mChannelCount) {
219fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            // stereo panning
220fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            double theta = (1000 + stereoPos) * M_PI_4 / 1000.0f; // 0 <= theta <= Pi/2
221fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            leftVol  *= cos(theta);
222fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            rightVol *= sin(theta);
223fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        } else {
224fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            // stereo balance
225fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            if (stereoPos > 0) {
226fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                leftVol  *= (1000 - stereoPos) / 1000.0f;
227fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                rightVol *= 1.0f;
228fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            } else {
229fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                leftVol  *= 1.0f;
230fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi                rightVol *= (1000 + stereoPos) / 1000.0f;
231fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi            }
232fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        }
233fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
234fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
235fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    {
236fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
237fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mMute = mute;
238fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[0] = leftVol;
239fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        mAndroidAudioLevels.mFinalVolume[1] = rightVol;
240fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    }
241fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
242fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    // send a message for the volume to be updated by the object which implements the volume
243fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    (new AMessage(kWhatVolumeUpdate, id()))->post();
244fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
245fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
2465b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi
2475b21a0626e173d407aa3835e5cffcaa9b582016dJean-Michel Trivi//--------------------------------------------------
24841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::attachAuxEffect(int32_t effectId)
24941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
25041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::attachAuxEffect(id=%d)", effectId);
25141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatAttachAuxEffect, id());
25241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setInt32(WHATPARAM_ATTACHAUXEFFECT, effectId);
25341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
25441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
25541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
25641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
25741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
25841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::setAuxEffectSendLevel(float level)
25941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten{
26041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::setAuxEffectSendLevel(level=%g)", level);
26141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetAuxEffectSendLevel, id());
26241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->setFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, level);
26341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    msg->post();
26441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
26541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
26641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
26741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten//--------------------------------------------------
268dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
269dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone
270dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
271dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
272dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::resetDataLocator() {
2736e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::resetDataLocator()");
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:
3106e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGD("kWhatPrepare");
311dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            onPrepare();
312dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            break;
313dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
314dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        case kWhatNotif:
3156e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGI("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
369dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        default:
3706e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten            SL_LOGV("kWhatPlay");
371dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            TRESPASS();
372dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
373dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
374dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
375dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
376dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
377dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Event handlers
3788ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//  it is strictly verboten to call those methods outside of the event loop
3798ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
380dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPrepare() {
381e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    SL_LOGI("GenericPlayer::onPrepare()");
382e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // Subclass is responsible for indicating whether prepare was successful or unsuccessful
383e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    // by updating mStateFlags accordingly.  It must set exactly one of these two flags.
384e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    assert(!(mStateFlags & kFlagPrepared) != !(mStateFlags & kFlagPreparedUnsuccessfully));
385e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten    notify(PLAYEREVENT_PREPARED, mStateFlags & kFlagPrepared ? PLAYER_SUCCESS : PLAYER_FAILURE,
386e1c913c670ee6f38940555b4247bc4a572eaa798Glenn Kasten            false /*async*/);
38730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
388dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
389dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
390dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
391dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onNotify(const sp<AMessage> &msg) {
3926e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onNotify()");
3931209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    notif_cbf_t notifClient;
3941209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    void*       notifUser;
3951209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    {
3961209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        android::Mutex::Autolock autoLock(mNotifyClientLock);
3971209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        if (NULL == mNotifyClient) {
3981209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            return;
3991209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        } else {
4001209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifClient = mNotifyClient;
4011209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi            notifUser   = mNotifyUser;
4021209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        }
403dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
404dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
405fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    int32_t val1, val2;
4068ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(PLAYEREVENT_PREFETCHSTATUSCHANGE, &val1)) {
4078ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHSTATUSCHANGE, val1);
4081209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchStatusChange, val1, 0, notifUser);
4098ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, &val1)) {
4108ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHFILLLEVELUPDATE, val1);
4111209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrefetchFillLevelUpdate, val1, 0, notifUser);
4128ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_ENDOFSTREAM, &val1)) {
4138ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_ENDOFSTREAM, val1);
4141209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventEndOfStream, val1, 0, notifUser);
4158ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    } else if (msg->findInt32(PLAYEREVENT_PREPARED, &val1)) {
416fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREPARED, val1);
4171209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventPrepared, val1, 0, notifUser);
418fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi    } else if (msg->findRect(PLAYEREVENT_VIDEO_SIZE_UPDATE, &val1, &val2, &val1, &val2)) {
4198ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        SL_LOGV("GenericPlayer notifying %s = %d, %d", PLAYEREVENT_VIDEO_SIZE_UPDATE, val1, val2);
4201209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi        notifClient(kEventHasVideoSize, val1, val2, notifUser);
4216e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    } else {
4226e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten        SL_LOGV("GenericPlayer notifying unknown");
423dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
424dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
425dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
426dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
427dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPlay() {
42830ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPlay()");
429dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared)) {
43030ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi        SL_LOGD("starting player");
431dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags |= kFlagPlaying;
432dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    } else {
433dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
434dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
435dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
436dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
437dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
438dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onPause() {
43930ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("GenericPlayer::onPause()");
440dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if ((mStateFlags & kFlagPrepared)) {
441dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mStateFlags &= ~kFlagPlaying;
442dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
443dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
444dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
445dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
446dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onSeek(const sp<AMessage> &msg) {
447dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onSeek");
448dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
449dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
450dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
451dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid GenericPlayer::onLoop(const sp<AMessage> &msg) {
452dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    SL_LOGV("GenericPlayer::onLoop");
453dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
454dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
455fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
456fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivivoid GenericPlayer::onVolumeUpdate() {
4576e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onVolumeUpdate");
458fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi}
459fcc996296bdbf6c3949ad4312991fdde4ae2e157Jean-Michel Trivi
4608ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4618ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSeekComplete() {
4628ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    SL_LOGD("GenericPlayer::onSeekComplete()");
4638ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mStateFlags &= ~kFlagSeeking;
4648ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4658ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4668ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4678ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onBufferingUpdate(const sp<AMessage> &msg) {
4686e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onBufferingUpdate");
4698ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4708ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4718ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4728ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::onSetBufferingUpdateThreshold(const sp<AMessage> &msg) {
4736e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::onSetBufferingUpdateThreshold");
4748ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    int32_t thresholdPercent = 0;
4758ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    if (msg->findInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, &thresholdPercent)) {
4768ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        Mutex::Autolock _l(mSettingsLock);
4778ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi        mCacheFillNotifThreshold = (int16_t)thresholdPercent;
4788ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    }
4798ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4808ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4818ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
48241562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onAttachAuxEffect(const sp<AMessage> &msg) {
48341562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onAttachAuxEffect()");
48441562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
48541562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
48641562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
48741562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kastenvoid GenericPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) {
48841562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten    SL_LOGV("GenericPlayer::onSetAuxEffectSendLevel()");
48941562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten}
49041562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
49141562990ca46e5d6c4aadde6c2469b8007bb980cGlenn Kasten
4928ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi//-------------------------------------------------
4938ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyStatus() {
4946e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyStatus");
4958ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHSTATUSCHANGE, (int32_t)mCacheStatus, true /*async*/);
4968ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
4978ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4988ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
4998ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::notifyCacheFill() {
5006e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::notifyCacheFill");
5018ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    mLastNotifiedCacheFill = mCacheFill;
5028ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    notify(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, (int32_t)mLastNotifiedCacheFill, true/*async*/);
5038ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5048ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5058ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5068ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::seekComplete() {
5076e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::seekComplete");
5088ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatSeekComplete, id());
5098ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5108ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5118ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5128ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
5138ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivivoid GenericPlayer::bufferingUpdate(int16_t fillLevelPerMille) {
5146e00efb769f780bc46c2ccda92688ba890623fb4Glenn Kasten    SL_LOGV("GenericPlayer::bufferingUpdate");
5158ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    sp<AMessage> msg = new AMessage(kWhatBufferingUpdate, id());
5168ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->setInt32(WHATPARAM_BUFFERING_UPDATE, fillLevelPerMille);
5178ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi    msg->post();
5188ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi}
5198ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
520dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android
521