AudioPlayer_to_android.cpp revision 24430c9070298f12e68b84c921add38da6ad0490
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/*
2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License.
6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at
7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi *
10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and
14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License.
15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */
16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
17daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include "sles_allinclusive.h"
18f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi#include "utils/RefBase.h"
1975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#include "android_prompts.h"
20773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
2175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#define KEY_STREAM_TYPE_PARAMSIZE  sizeof(SLint32)
221ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
2305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//-----------------------------------------------------------------------------
24a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Triviint android_getMinFrameCount(uint32_t sampleRate) {
25a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    int afSampleRate;
26a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputSamplingRate(&afSampleRate,
27a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
28a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
29a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
30a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    int afFrameCount;
31a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputFrameCount(&afFrameCount,
32a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
33a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
34a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
35a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    uint32_t afLatency;
36a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputLatency(&afLatency,
37a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
38a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
39a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
40a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // minimum nb of buffers to cover output latency, given the size of each hardware audio buffer
41a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
42a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (minBufCount < 2) minBufCount = 2;
43a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // minimum number of frames to cover output latency at the sample rate of the content
44a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    return (afFrameCount*sampleRate*minBufCount)/afSampleRate;
456a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
466a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
47712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
48712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//-----------------------------------------------------------------------------
491fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define LEFT_CHANNEL_MASK  0x1 << 0
501fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define RIGHT_CHANNEL_MASK 0x1 << 1
516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
52d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_updateStereoVolume(CAudioPlayer* ap) {
536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float leftVol = 1.0f, rightVol = 1.0f;
546a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
554614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL == ap->mAudioTrack) {
564614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        return;
5745d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi    }
581fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // should not be used when muted
591fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    if (SL_BOOLEAN_TRUE == ap->mMute) {
601fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        return;
611fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    }
624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
631fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    int channelCount = ap->mNumChannels;
641fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
651fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // mute has priority over solo
661fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    int leftAudibilityFactor = 1, rightAudibilityFactor = 1;
671fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
68e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    if (channelCount >= STEREO_CHANNELS) {
69b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten        if (ap->mMuteMask & LEFT_CHANNEL_MASK) {
701fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // left muted
711fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            leftAudibilityFactor = 0;
721fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        } else {
731fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // left not muted
74b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten            if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
751fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // left soloed
761fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                leftAudibilityFactor = 1;
771fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } else {
781fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // left not soloed
79b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten                if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
801fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // right solo silences left
811fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    leftAudibilityFactor = 0;
821fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                } else {
831fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left and right are not soloed, and left is not muted
841fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    leftAudibilityFactor = 1;
851fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                }
861fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            }
871fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        }
881fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
89b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten        if (ap->mMuteMask & RIGHT_CHANNEL_MASK) {
901fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // right muted
911fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            rightAudibilityFactor = 0;
921fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        } else {
931fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // right not muted
94b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten            if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
951fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // right soloed
961fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                rightAudibilityFactor = 1;
971fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } else {
981fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // right not soloed
99b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten                if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
1001fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left solo silences right
1011fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    rightAudibilityFactor = 0;
1021fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                } else {
1031fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left and right are not soloed, and right is not muted
1041fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    rightAudibilityFactor = 1;
1051fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                }
1061fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            }
1071fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        }
1081fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    }
1096a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
1106a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // compute amplification as the combination of volume level and stereo position
111172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    //   amplification from volume level
112172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    ap->mAmplFromVolLevel = sles_to_android_amplification(ap->mVolume.mLevel);
113ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    //   amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf)
114172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    leftVol  *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel;
115172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    rightVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel;
116a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
117f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    // amplification from stereo position
1181fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    if (ap->mVolume.mEnableStereoPosition) {
119f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi        // panning law depends on number of channels of content: stereo panning vs 2ch. balance
12045d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi        if(1 == channelCount) {
121f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi            // stereo panning
1221fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            double theta = (1000+ap->mVolume.mStereoPosition)*M_PI_4/1000.0f; // 0 <= theta <= Pi/2
123e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            ap->mAmplFromStereoPos[0] = cos(theta);
124e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            ap->mAmplFromStereoPos[1] = sin(theta);
125f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi        } else {
126f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi            // stereo balance
1271fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            if (ap->mVolume.mStereoPosition > 0) {
128e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[0] = (1000-ap->mVolume.mStereoPosition)/1000.0f;
129e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[1] = 1.0f;
1306a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            } else {
131e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[0] = 1.0f;
132e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[1] = (1000+ap->mVolume.mStereoPosition)/1000.0f;
1336a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            }
1346a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        }
135e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        leftVol  *= ap->mAmplFromStereoPos[0];
136e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        rightVol *= ap->mAmplFromStereoPos[1];
137f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    }
138f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
1391fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    ap->mAudioTrack->setVolume(leftVol * leftAudibilityFactor, rightVol * rightAudibilityFactor);
140ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi
141ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    // changes in the AudioPlayer volume must be reflected in the send level:
142ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    //  in SLEffectSendItf or in SLAndroidEffectSendItf?
143ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    // FIXME replace interface test by an internal API once we have one.
144ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    if (NULL != ap->mEffectSend.mItf) {
145ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        for (unsigned int i=0 ; i<AUX_MAX ; i++) {
146ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi            if (ap->mEffectSend.mEnableLevels[i].mEnable) {
147ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                android_fxSend_setSendLevel(ap,
148ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                        ap->mEffectSend.mEnableLevels[i].mSendLevel + ap->mVolume.mLevel);
149ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                // there's a single aux bus on Android, so we can stop looking once the first
150ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                // aux effect is found.
151ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                break;
152ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi            }
153ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        }
154ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    } else if (NULL != ap->mAndroidEffectSend.mItf) {
155ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        android_fxSend_setSendLevel(ap, ap->mAndroidEffectSend.mSendLevel + ap->mVolume.mLevel);
156ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    }
1574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1594614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
160e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleMarker_lockPlay(CAudioPlayer* ap) {
16149e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten    //SL_LOGV("received event EVENT_MARKER from AudioTrack");
1624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
1644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
1664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
1674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
1684614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
1694614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL != callback) {
1714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // getting this event implies SL_PLAYEVENT_HEADATMARKER was set in the event mask
1724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATMARKER);
1734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
1744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
177e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap) {
17849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten    //SL_LOGV("received event EVENT_NEW_POS from AudioTrack");
1794614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
1814614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
1834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
1844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
1854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
1864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL != callback) {
1884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // getting this event implies SL_PLAYEVENT_HEADATNEWPOS was set in the event mask
1894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATNEWPOS);
1904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
1914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
195e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap) {
1964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1974614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
1984614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1994614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
2004614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
2014614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
2024614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    bool headStalled = (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADSTALLED) != 0;
2034614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
2044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
2054614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if ((NULL != callback) && headStalled) {
2064614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADSTALLED);
207f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    }
208f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi}
209f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
21024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
211e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi//-----------------------------------------------------------------------------
212e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi/**
213e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * post-condition: play state of AudioPlayer is SL_PLAYSTATE_PAUSED if setPlayStateToPaused is true
214e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *
215e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * note: a conditional flag, setPlayStateToPaused, is used here to specify whether the play state
216e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       needs to be changed when the player reaches the end of the content to play. This is
217e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       relative to what the specification describes for buffer queues vs the
218e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       SL_PLAYEVENT_HEADATEND event. In the OpenSL ES specification 1.0.1:
219e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *        - section 8.12 SLBufferQueueItf states "In the case of starvation due to insufficient
220e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          buffers in the queue, the playing of audio data stops. The player remains in the
221e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          SL_PLAYSTATE_PLAYING state."
222e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *        - section 9.2.31 SL_PLAYEVENT states "SL_PLAYEVENT_HEADATEND Playback head is at the end
223e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          of the current content and the player has paused."
224e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi */
225fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayStateToPaused,
226fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        bool needToLock) {
22725d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    //SL_LOGV("ap=%p, setPlayStateToPaused=%d, needToLock=%d", ap, setPlayStateToPaused,
22825d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    //        needToLock);
229e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    slPlayCallback playCallback = NULL;
230e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    void * playContext = NULL;
231e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    // SLPlayItf callback or no callback?
232fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
233ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        interface_lock_exclusive(&ap->mPlay);
234fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
235e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) {
236e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        playCallback = ap->mPlay.mCallback;
237e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        playContext = ap->mPlay.mContext;
238e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    }
23925d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    if (setPlayStateToPaused) {
240ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        ap->mPlay.mState = SL_PLAYSTATE_PAUSED;
241ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    }
242ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    if (needToLock) {
243ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        interface_unlock_exclusive(&ap->mPlay);
244fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
245e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    // callback with no lock held
246e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    if (NULL != playCallback) {
247e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND);
248e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    }
24925d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi
250e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi}
251e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
252a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
253a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi//-----------------------------------------------------------------------------
254a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi/**
255a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * pre-condition: AudioPlayer has SLPrefetchStatusItf initialized
256a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * post-condition:
257a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *  - ap->mPrefetchStatus.mStatus == status
258a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *  - the prefetch status callback, if any, has been notified if a change occurred
259a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *
260a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi */
261fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_prefetchStatus_lockPrefetch(CAudioPlayer *ap, SLuint32 status,
262fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        bool needToLock) {
263a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    slPrefetchCallback prefetchCallback = NULL;
264a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    void * prefetchContext = NULL;
265a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
266fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
267fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        interface_lock_exclusive(&ap->mPrefetchStatus);
268fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
269a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // status change?
270a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (ap->mPrefetchStatus.mStatus != status) {
271a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        ap->mPrefetchStatus.mStatus = status;
272a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        // callback or no callback?
273a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) {
274a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            prefetchCallback = ap->mPrefetchStatus.mCallback;
275a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            prefetchContext  = ap->mPrefetchStatus.mContext;
276a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
277a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
278fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
279fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        interface_unlock_exclusive(&ap->mPrefetchStatus);
280fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
281a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
282a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // callback with no lock held
283a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (NULL != prefetchCallback) {
284a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext, status);
285a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
286a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi}
287a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
288a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
289f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi//-----------------------------------------------------------------------------
29075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_setStreamType(CAudioPlayer* ap, SLint32 type) {
29175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
29275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SL_LOGV("type %ld", type);
29375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
29475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    int newStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
29575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    switch(type) {
29675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_VOICE:
29775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::VOICE_CALL;
29875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
29975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_SYSTEM:
30075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::SYSTEM;
30175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_RING:
30375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::RING;
30475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_MEDIA:
30675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::MUSIC;
30775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_ALARM:
30975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::ALARM;
31075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_NOTIFICATION:
31275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::NOTIFICATION;
31375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    default:
31575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_PLAYERSTREAMTYPE_SET_UNKNOWN_TYPE);
31675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
31775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
31975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
32075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    // stream type needs to be set before the object is realized
32175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    // (ap->mAudioTrack is supposed to be NULL until then)
3225f71e35da153d194d805e030ab38935599e065d2Jean-Michel Trivi    if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) {
32375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_PLAYERSTREAMTYPE_REALIZED);
32475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PRECONDITIONS_VIOLATED;
32575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
32675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        ap->mStreamType = newStreamType;
32775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
32875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
32975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
33075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
33175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
33475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_getStreamType(CAudioPlayer* ap, SLint32 *pType) {
33575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
33675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    switch(ap->mStreamType) {
33875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::VOICE_CALL:
33975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_VOICE;
34075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::SYSTEM:
34275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_SYSTEM;
34375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::RING:
34575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_RING;
34675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::DEFAULT:
34875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::MUSIC:
34975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_MEDIA;
35075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::ALARM:
35275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_ALARM;
35375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::NOTIFICATION:
35575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_NOTIFICATION;
35675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    default:
35875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_INTERNAL_ERROR;
35975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_MEDIA;
36075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
36175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
36275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
36475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
36575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
36875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#ifndef USE_BACKPORT
3693ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivistatic void sfplayer_prepare(CAudioPlayer *ap) {
3703ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    if (ap->mSfPlayer != 0) {
3713ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        ap->mSfPlayer->prepare();
3723ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    }
3733ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    ap->mAndroidObjState = ANDROID_PREPARING;
3743ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi}
3753ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi#endif
3763ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
3773ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi//-----------------------------------------------------------------------------
3783ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi#ifndef USE_BACKPORT
379de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi// Callback associated with an SfPlayer of an SL ES AudioPlayer that gets its data
3803ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi// from a URI or FD, for prepare and prefetch events
381a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void sfplayer_handlePrefetchEvent(const int event, const int data1, void* user) {
382de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    if (NULL == user) {
383de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        return;
384de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    }
385f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
386de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)user;
38724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    //SL_LOGV("received event %d, data %d from SfAudioPlayer", event, data1);
388de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    switch(event) {
389f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
3903ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    case(android::SfPlayer::kEventPrepared): {
3913ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        object_lock_exclusive(&ap->mObject);
3923ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
3933ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        if (SFPLAYER_SUCCESS != data1) {
3943ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack = NULL;
3953ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mNumChannels = 0;
3963ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSampleRateMilliHz = 0;
3973ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_UNINITIALIZED;
3983ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
3993ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        } else {
4003ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack = ap->mSfPlayer->getAudioTrack();
4013ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mNumChannels = ap->mSfPlayer->getNumChannels();
4023ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSampleRateMilliHz = android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz());
4033ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSfPlayer->startPrefetch_async();
4043ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
40524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            // update the new track with the current settings
40624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            android_audioPlayer_useEventMask(ap);
40724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            android_audioPlayer_volumeUpdate(ap);
40824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate);
40924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
4103ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_READY;
4113ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        }
4123ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
4133ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        object_unlock_exclusive(&ap->mObject);
4143ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    } break;
4153ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
416de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventPrefetchFillLevelUpdate): {
417a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
418a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            break;
419a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
420ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        slPrefetchCallback callback = NULL;
421ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        void* callbackPContext = NULL;
422ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        // SLPrefetchStatusItf callback or no callback?
423ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        interface_lock_exclusive(&ap->mPrefetchStatus);
424ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) {
425ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            callback = ap->mPrefetchStatus.mCallback;
426ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            callbackPContext = ap->mPrefetchStatus.mContext;
427ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        }
428ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        ap->mPrefetchStatus.mLevel = (SLpermille)data1;
429ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        interface_unlock_exclusive(&ap->mPrefetchStatus);
430ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        // callback with no lock held
431ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        if (NULL != callback) {
432ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext,
433ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi                    SL_PREFETCHEVENT_FILLLEVELCHANGE);
434ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        }
435ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi    } break;
436de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
437de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventPrefetchStatusChange): {
438a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
439a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            break;
440a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
44106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        slPrefetchCallback callback = NULL;
442de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        void* callbackPContext = NULL;
443de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        // SLPrefetchStatusItf callback or no callback?
444de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        interface_lock_exclusive(&ap->mPrefetchStatus);
445de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) {
446de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            callback = ap->mPrefetchStatus.mCallback;
447de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            callbackPContext = ap->mPrefetchStatus.mContext;
448de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        }
4494614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        if (data1 >= android::SfPlayer::kStatusIntermediate) {
450de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA;
4514614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            // FIXME estimate fill level better?
4524614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mPrefetchStatus.mLevel = 1000;
4534614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_READY;
4544614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        } else if (data1 < android::SfPlayer::kStatusIntermediate) {
455de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
4564614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            // FIXME estimate fill level better?
4574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mPrefetchStatus.mLevel = 0;
458de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        }
459de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        interface_unlock_exclusive(&ap->mPrefetchStatus);
460de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        // callback with no lock held
46106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        if (NULL != callback) {
462de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, SL_PREFETCHEVENT_STATUSCHANGE);
46306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        }
464de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
465de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
466de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventEndOfStream): {
467fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        audioPlayer_dispatch_headAtEnd_lockPlay(ap, true /*set state to paused?*/, true);
46824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        if ((NULL != ap->mAudioTrack) && (!ap->mSeek.mLoopEnabled)) {
4693ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack->stop();
4703ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        }
471de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
472de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
4736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
4746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
4756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
476a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi}
47714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
478a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
47975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
480a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
481d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_checkSourceSink(CAudioPlayer *pAudioPlayer)
482c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi{
483acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource;
484acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink;
485c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
486c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Sink check:
487c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //     currently only OutputMix sinks are supported, regardless of the data source
488c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    if (*(SLuint32 *)pAudioSnk->pLocator != SL_DATALOCATOR_OUTPUTMIX) {
48949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        SL_LOGE("Cannot create audio player: data sink is not SL_DATALOCATOR_OUTPUTMIX");
490c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
491c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
492c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
493c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
494c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
495c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
496c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 formatType = *(SLuint32 *)pAudioSrc->pFormat;
4974b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
498c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
499c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
500c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Buffer Queues
50101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_BUFFERQUEUE:
50201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
50301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten        {
504c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        SLDataLocator_BufferQueue *dl_bq =  (SLDataLocator_BufferQueue *) pAudioSrc->pLocator;
5054b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
506c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        // Buffer format
507c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        switch (formatType) {
508a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        //     currently only PCM buffer queues are supported,
509c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_PCM: {
510c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) pAudioSrc->pFormat;
511c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->numChannels) {
512c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 1:
513c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 2:
514c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
515c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
5164b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // this should have already been rejected by checkDataFormat
5174b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported " \
5184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                    "PCM data source with %u channels", (unsigned) df_pcm->numChannels);
519c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
520c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
521c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->samplesPerSec) {
522c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_8:
523c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_11_025:
524c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_12:
525c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_16:
526c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_22_05:
527c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_24:
528c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_32:
529c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_44_1:
530c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
5314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_48:    // not 48?
5324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_64:
5334b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_88_2:
5344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_96:
5354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_192:
536c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
53749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported sample rate %u milliHz",
53849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                    (unsigned) df_pcm->samplesPerSec);
539c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
540c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
541c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->bitsPerSample) {
542c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_8:
543337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                // FIXME We should support this
544337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported 8-bit data");
5454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                return SL_RESULT_CONTENT_UNSUPPORTED;
546c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_16:
547c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
548c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
549c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
5504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // this should have already been rejected by checkDataFormat
5514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported sample bit depth %lu",
552c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                        (SLuint32)df_pcm->bitsPerSample);
553c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
554c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
555c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->containerSize) {
556c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 16:
557c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
558c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
559c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
560337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported container size %u",
561337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                    (unsigned) df_pcm->containerSize);
562c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
563c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
564c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->channelMask) {
565c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // FIXME needs work
566c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
567c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
568c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
569c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->endianness) {
570c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_BYTEORDER_LITTLEENDIAN:
571c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
5724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_BYTEORDER_BIGENDIAN:
573337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported big-endian byte order");
5744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                return SL_RESULT_CONTENT_UNSUPPORTED;
5754b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // native is proposed but not yet in spec
576c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
577337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported byte order %u",
578337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                    (unsigned) df_pcm->endianness);
579c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
580c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
581c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            } //case SL_DATAFORMAT_PCM
582c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            break;
583c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_MIME:
584c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
58501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten            SL_LOGE("Cannot create audio player with buffer queue data source "
58649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_PCM format");
587c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
588c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        default:
58901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten            SL_LOGE("Cannot create audio player with buffer queue data source "
59049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_PCM format");
591c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
592c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        } // switch (formatType)
59301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten        } // case SL_DATALOCATOR_BUFFERQUEUE or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
594c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
595c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
5966fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    //   URI
5976fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    case SL_DATALOCATOR_URI:
5986fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        {
599989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        SLDataLocator_URI *dl_uri =  (SLDataLocator_URI *) pAudioSrc->pLocator;
600989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        if (NULL == dl_uri->URI) {
601989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
602989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        }
603989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        // URI format
604989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (formatType) {
605989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_MIME:
606989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
607989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_PCM:
608989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
609337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("Cannot create audio player with SL_DATALOCATOR_URI data source without "
61049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "SL_DATAFORMAT_MIME format");
611989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
612989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // switch (formatType)
6136fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        } // case SL_DATALOCATOR_URI
6146fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        break;
6156fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    //------------------
616989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //   File Descriptor
617989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
618989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        {
619989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        // fd is already non null
620989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (formatType) {
621989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_MIME:
622989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
623989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_PCM:
624989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            // FIXME implement
625a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten            SL_LOGD("[ FIXME implement PCM FD data sources ]");
626989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
627989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
628337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("Cannot create audio player with SL_DATALOCATOR_ANDROIDFD data source "
62949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_MIME or SL_DATAFORMAT_PCM format");
630989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
631989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // switch (formatType)
632989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // case SL_DATALOCATOR_ANDROIDFD
633989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        break;
634989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //------------------
635c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Address
636c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_ADDRESS:
637c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_IODEVICE:
638c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_OUTPUTMIX:
639c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED5:
640c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_MIDIBUFFERQUEUE:
641c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED8:
642337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Cannot create audio player with data locator type 0x%x", (unsigned) locatorType);
643c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_CONTENT_UNSUPPORTED;
644c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
645c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
646c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }// switch (locatorType)
647c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
648c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return SL_RESULT_SUCCESS;
649c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi}
650c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
6524614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
6534614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
654d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void audioTrack_callBack_uri(int event, void* user, void *info) {
6554614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    // EVENT_MORE_DATA needs to be handled with priority over the other events
6564614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    // because it will be called the most often during playback
6574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (event == android::AudioTrack::EVENT_MORE_DATA) {
65849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack");
6594614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // set size to 0 to signal we're not using the callback to write more data
6604614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info;
6614614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pBuff->size = 0;
6624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else if (NULL != user) {
6634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        switch (event) {
6644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_MARKER) :
665e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleMarker_lockPlay((CAudioPlayer *)user);
6664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi                break;
6674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_NEW_POS) :
668e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleNewPos_lockPlay((CAudioPlayer *)user);
6694614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi                break;
6704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_UNDERRUN) :
671e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleUnderrun_lockPlay((CAudioPlayer *)user);
672b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi                break;
673e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            default:
674e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event,
675e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                        (CAudioPlayer *)user);
676e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                break;
6774614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        }
6784614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
6794614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
6804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
681a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
6821ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// Callback associated with an AudioTrack of an SL ES AudioPlayer that gets its data
6831ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// from a buffer queue.
684a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void audioTrack_callBack_pullFromBuffQueue(int event, void* user, void *info) {
685e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)user;
6868f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi    void * callbackPContext = NULL;
6876a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch(event) {
6886a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
6896a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case (android::AudioTrack::EVENT_MORE_DATA) : {
69049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack");
6913a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten        slBufferQueueCallback callback = NULL;
6921ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info;
6931ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        // retrieve data from the buffer queue
694e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        interface_lock_exclusive(&ap->mBufferQueue);
695e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        if (ap->mBufferQueue.mState.count != 0) {
696e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            //SL_LOGV("nbBuffers in queue = %lu",ap->mBufferQueue.mState.count);
697e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear);
6981ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
699e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            BufferHeader *oldFront = ap->mBufferQueue.mFront;
700d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            BufferHeader *newFront = &oldFront[1];
7011ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7021ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            // FIXME handle 8bit based on buffer format
7031ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            short *pSrc = (short*)((char *)oldFront->mBuffer
704e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                    + ap->mBufferQueue.mSizeConsumed);
705e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            if (ap->mBufferQueue.mSizeConsumed + pBuff->size < oldFront->mSize) {
7061ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // can't consume the whole or rest of the buffer in one shot
707e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mSizeConsumed += pBuff->size;
7081ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // leave pBuff->size untouched
7091ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // consume data
7103a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // FIXME can we avoid holding the lock during the copy?
7111ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                memcpy (pBuff->i16, pSrc, pBuff->size);
7121ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            } else {
7131ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // finish consuming the buffer or consume the buffer in one shot
714e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                pBuff->size = oldFront->mSize - ap->mBufferQueue.mSizeConsumed;
715e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mSizeConsumed = 0;
7161ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7171ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                if (newFront ==
718e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                        &ap->mBufferQueue.mArray
719e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                            [ap->mBufferQueue.mNumBuffers + 1])
7201ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                {
721e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                    newFront = ap->mBufferQueue.mArray;
7221ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                }
723e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mFront = newFront;
7241ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
725e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mState.count--;
726e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mState.playIndex++;
7271ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7281ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // consume data
7293a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // FIXME can we avoid holding the lock during the copy?
7301ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                memcpy (pBuff->i16, pSrc, pBuff->size);
7311ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7321ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // data has been consumed, and the buffer queue state has been updated
73306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi                // we will notify the client if applicable
734e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                callback = ap->mBufferQueue.mCallback;
7353a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // save callback data
736e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                callbackPContext = ap->mBufferQueue.mContext;
7371ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            }
738e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        } else { // empty queue
739e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // signal no data available
7401ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            pBuff->size = 0;
741e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
742e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // signal we're at the end of the content, but don't pause (see note in function)
743fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten            audioPlayer_dispatch_headAtEnd_lockPlay(ap, false /*set state to paused?*/, false);
744e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
745a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            // signal underflow to prefetch status itf
746a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
747fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten                audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_UNDERFLOW,
748fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten                    false);
749a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            }
750a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
751e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // stop the track so it restarts playing faster when new data is enqueued
752e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            ap->mAudioTrack->stop();
7531ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        }
754e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        interface_unlock_exclusive(&ap->mBufferQueue);
75506a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        // notify client
7568f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi        if (NULL != callback) {
757e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            (*callback)(&ap->mBufferQueue.mItf, callbackPContext);
7588f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi        }
7596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
7606a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    break;
7611ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_MARKER) :
763e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleMarker_lockPlay(ap);
7644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_NEW_POS) :
767e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleNewPos_lockPlay(ap);
7684614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_UNDERRUN) :
771e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleUnderrun_lockPlay(ap);
7724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
775e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // FIXME where does the notification of SL_PLAYEVENT_HEADMOVING fit?
776b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi        SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event,
777b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi                (CAudioPlayer *)user);
7786a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
7791ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    }
7801ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi}
7811ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7821ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7831ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi//-----------------------------------------------------------------------------
784d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_create(
78572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten        CAudioPlayer *pAudioPlayer) {
786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
787acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource;
788acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink;
789c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
790c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
791a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //--------------------------------------
792928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // Sink check:
793c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // currently only OutputMix sinks are supported
794928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // this has already been verified in sles_to_android_CheckAudioPlayerSourceSink
795928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // SLuint32 locatorType = *(SLuint32 *)pAudioSnk->pLocator;
796928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // if (SL_DATALOCATOR_OUTPUTMIX == locatorType) {
797928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // }
798c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
799c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
800c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
801928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
802c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
803a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   -----------------------------------
804a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   Buffer Queue to AudioTrack
805c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_BUFFERQUEUE:
80601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
8071ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        pAudioPlayer->mAndroidObjType = AUDIOTRACK_PULL;
80806a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = new android::Mutex();
809497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
810c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
811a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   -----------------------------------
812989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //   URI or FD to MediaPlayer
8133a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    case SL_DATALOCATOR_URI:
814989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
815c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = MEDIAPLAYER;
81606a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = new android::Mutex();
8174614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
818c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
819c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
820c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = INVALID_TYPE;
82106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = NULL;
822497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = 0;
823c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
824337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
825c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
826c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
827de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED;
82875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
8294614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    pAudioPlayer->mAudioTrack = NULL;
83014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
8314614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    pAudioPlayer->mSfPlayer.clear();
83214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
833de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
8343d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi#ifndef USE_BACKPORT
8353d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi    pAudioPlayer->mSessionId = android::AudioSystem::newAudioSessionId();
8363d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi#endif
8373d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi
838e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromVolLevel = 1.0f;
839e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromStereoPos[0] = 1.0f;
840e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromStereoPos[1] = 1.0f;
841fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    pAudioPlayer->mDirectLevel = 0; // no attenuation
842fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
843e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
844ca533f4e1c67e9136044f25ca84b65102c8892fdEric Laurent    pAudioPlayer->mAndroidEffect.mEffects =
845ca533f4e1c67e9136044f25ca84b65102c8892fdEric Laurent            new android::KeyedVector<SLuint32, android::AudioEffect* >();
846ca533f4e1c67e9136044f25ca84b65102c8892fdEric Laurent
84724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    // initialize interface-specific fields that can be used regardless of whether the interface
84824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    // is exposed on the AudioPlayer or not
84924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    pAudioPlayer->mSeek.mLoopEnabled = SL_BOOLEAN_FALSE;
85024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    pAudioPlayer->mPlaybackRate.mRate = 1000;
85124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
852c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return result;
853773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
854773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}
855773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
856a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
857a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
85875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_setConfig(CAudioPlayer *ap, const SLchar *configKey,
85975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        const void *pConfigValue, SLuint32 valueSize) {
86075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
86175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
86275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
86375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    if (NULL == ap) {
86475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_INTERNAL_ERROR;
86575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if (NULL == pConfigValue) {
86675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_NULL_PARAM);
86775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
86875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
86975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
87075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
87175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        // stream type
87275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        if (KEY_STREAM_TYPE_PARAMSIZE > valueSize) {
87375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
87475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
87575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        } else {
87675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = audioPlayer_setStreamType(ap, *(SLuint32*)pConfigValue);
87775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        }
87875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
87975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
88075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
88175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
88275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
88375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
88475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
88575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
88675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
88775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
88875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
88975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_getConfig(CAudioPlayer* ap, const SLchar *configKey,
89075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SLuint32* pValueSize, void *pConfigValue) {
89175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
89375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    if (NULL == ap) {
89575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        return SL_RESULT_INTERNAL_ERROR;
89675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if (NULL == pValueSize) {
89775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_NULL_PARAM);
89875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
89975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
90075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
90175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
90275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        // stream type
90375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        if (KEY_STREAM_TYPE_PARAMSIZE > *pValueSize) {
90475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
90575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
90675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        } else {
90775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            *pValueSize = KEY_STREAM_TYPE_PARAMSIZE;
90875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            if (NULL != pConfigValue) {
90975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi                result = audioPlayer_getStreamType(ap, (SLint32*)pConfigValue);
91075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            }
91175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        }
91275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
91375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
91475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
91575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
91675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
91775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
91875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
91975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
92075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
923d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async) {
924a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
925a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
926a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten    SL_LOGV("Realize pAudioPlayer=%p", pAudioPlayer);
927b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi
928a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    switch (pAudioPlayer->mAndroidObjType) {
929a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //-----------------------------------
930a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // AudioTrack
9311ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    case AUDIOTRACK_PULL:
932a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        {
9331fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        // initialize platform-specific CAudioPlayer fields
9341fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
935a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        SLDataLocator_BufferQueue *dl_bq =  (SLDataLocator_BufferQueue *)
936a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                pAudioPlayer->mDynamicSource.mDataSource;
937a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *)
938a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                pAudioPlayer->mDynamicSource.mDataSource->pFormat;
939a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
940a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        uint32_t sampleRate = sles_to_android_sampleRate(df_pcm->samplesPerSec);
941a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
9424614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack = new android::AudioTrack(
94375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi                pAudioPlayer->mStreamType,                           // streamType
944a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sampleRate,                                          // sampleRate
945a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sles_to_android_sampleFormat(df_pcm->bitsPerSample), // format
946a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sles_to_android_channelMask(df_pcm->numChannels, df_pcm->channelMask),//channel mask
9471ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                0,                                                   // frameCount (here min)
948a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                0,                                                   // flags
949a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi                audioTrack_callBack_pullFromBuffQueue,               // callback
950a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                (void *) pAudioPlayer,                               // user
9511bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                0      // FIXME find appropriate frame count         // notificationFrame
9521bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi#ifndef USE_BACKPORT
9531bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                , pAudioPlayer->mSessionId
9541bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi#endif
9551bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                );
956337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        android::status_t status = pAudioPlayer->mAudioTrack->initCheck();
957337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        if (status != android::NO_ERROR) {
958337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("AudioTrack::initCheck status %u", status);
9596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            result = SL_RESULT_CONTENT_UNSUPPORTED;
960a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        }
9611fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
9621fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        // initialize platform-independent CAudioPlayer fields
9631fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
9641fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        pAudioPlayer->mNumChannels = df_pcm->numChannels;
965a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        pAudioPlayer->mSampleRateMilliHz = df_pcm->samplesPerSec; // Note: bad field name in SL ES
9663ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9673ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAndroidObjState = ANDROID_READY;
968de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
96914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
970a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //-----------------------------------
971a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // MediaPlayer
9726fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    case MEDIAPLAYER: {
97380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        object_lock_exclusive(&pAudioPlayer->mObject);
974f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
9753ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED;
9763ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mNumChannels = 0;
9773ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mSampleRateMilliHz = 0;
9783ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAudioTrack = NULL;
9793ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9803ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        AudioPlayback_Parameters app;
9813ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.sessionId = pAudioPlayer->mSessionId;
9823ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.streamType = pAudioPlayer->mStreamType;
9833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.trackcb = audioTrack_callBack_uri;
9843ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.trackcbUser = (void *) pAudioPlayer;
9853ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mSfPlayer = new android::SfPlayer(&app);
987a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        pAudioPlayer->mSfPlayer->setNotifListener(sfplayer_handlePrefetchEvent,
988ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi                        (void*)pAudioPlayer /*notifUSer*/);
989ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        pAudioPlayer->mSfPlayer->armLooper();
990de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        object_unlock_exclusive(&pAudioPlayer->mObject);
9916fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi
992989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) {
993989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            case SL_DATALOCATOR_URI:
994989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                pAudioPlayer->mSfPlayer->setDataSource(
995989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI);
996989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                break;
997989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            case SL_DATALOCATOR_ANDROIDFD: {
998989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset;
999989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                pAudioPlayer->mSfPlayer->setDataSource(
1000989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (int)pAudioPlayer->mDataSource.mLocator.mFD.fd,
1001989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
1002989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                                (int64_t)SFPLAYER_FD_FIND_FILE_SIZE : offset,
1003989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length);
1004989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                } break;
1005989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            default:
10063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR);
1007989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                break;
1008989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        }
1009f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
1010de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
101114e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
1012a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    default:
1013337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", pAudioPlayer->mAndroidObjType);
1014337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1015337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
1016a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
1017a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
101814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
1019b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi
1020ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    // proceed with effect initialization
10214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize EQ
10224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // FIXME use a table of effect descriptors when adding support for more effects
10234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (memcmp(SL_IID_EQUALIZER, &pAudioPlayer->mEqualizer.mEqDescriptor.type,
10244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            sizeof(effect_uuid_t)) == 0) {
10257e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize EQ for AudioPlayer=%p", pAudioPlayer);
10263d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_eq_init(pAudioPlayer->mSessionId, &pAudioPlayer->mEqualizer);
10274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
10284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize BassBoost
10299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (memcmp(SL_IID_BASSBOOST, &pAudioPlayer->mBassBoost.mBassBoostDescriptor.type,
10309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            sizeof(effect_uuid_t)) == 0) {
10317e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize BassBoost for AudioPlayer=%p", pAudioPlayer);
10323d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_bb_init(pAudioPlayer->mSessionId, &pAudioPlayer->mBassBoost);
10339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
10344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize Virtualizer
1035f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (memcmp(SL_IID_VIRTUALIZER, &pAudioPlayer->mVirtualizer.mVirtualizerDescriptor.type,
1036f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi               sizeof(effect_uuid_t)) == 0) {
10377e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize Virtualizer for AudioPlayer=%p", pAudioPlayer);
10383d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_virt_init(pAudioPlayer->mSessionId, &pAudioPlayer->mVirtualizer);
1039f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
10407e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
10417e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // initialize EffectSend
10427e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME initialize EffectSend
104314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
10444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1045a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    return result;
1046a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi}
1047a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
104848913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi
104948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi//-----------------------------------------------------------------------------
1050d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) {
10516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
10529ab6dd04be11483a9e8b58de91228b17b821eca4Jean-Michel Trivi    SL_LOGV("android_audioPlayer_destroy(%p)", pAudioPlayer);
10536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch (pAudioPlayer->mAndroidObjType) {
10546a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    //-----------------------------------
10556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // AudioTrack
10566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case AUDIOTRACK_PULL:
10576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
105814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
10596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    //-----------------------------------
10606a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // MediaPlayer
10616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case MEDIAPLAYER:
1062ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        if (pAudioPlayer->mSfPlayer != 0) {
1063de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            pAudioPlayer->mSfPlayer.clear();
10646fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        }
10656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
106614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
10676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
1068337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", pAudioPlayer->mAndroidObjType);
1069337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1070337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
10716a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
10726a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
10734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (pAudioPlayer->mAudioTrack != NULL) {
10744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack->stop();
10754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        delete pAudioPlayer->mAudioTrack;
10764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack = NULL;
10774614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
10784614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
107906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    if (pAudioPlayer->mpLock != NULL) {
108006a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        delete pAudioPlayer->mpLock;
108106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = NULL;
108206a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi    }
108306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi
1084989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    pAudioPlayer->mAndroidObjType = INVALID_TYPE;
1085989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi
108614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
10875b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    // FIXME this shouldn't have to be done here, there should be an "interface destroy" hook,
10885b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    //       just like there is an interface init hook, to avoid memory leaks.
10894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    pAudioPlayer->mEqualizer.mEqEffect.clear();
10905b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    pAudioPlayer->mBassBoost.mBassBoostEffect.clear();
10915b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    pAudioPlayer->mVirtualizer.mVirtualizerEffect.clear();
109204c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten    if (NULL != pAudioPlayer->mAndroidEffect.mEffects) {
109304c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten        if (!pAudioPlayer->mAndroidEffect.mEffects->isEmpty()) {
109404c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten            for (size_t i = 0 ; i < pAudioPlayer->mAndroidEffect.mEffects->size() ; i++) {
109504c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten                delete pAudioPlayer->mAndroidEffect.mEffects->valueAt(i);
109604c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten            }
109704c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten            pAudioPlayer->mAndroidEffect.mEffects->clear();
10985b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        }
109904c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten        delete pAudioPlayer->mAndroidEffect.mEffects;
1100b53d7081eafa71685d04fade76126b18c0744ad4Glenn Kasten        pAudioPlayer->mAndroidEffect.mEffects = NULL;
11015b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    }
110214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
11034be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
11046a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    return result;
11056a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
11066a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
11076a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
11086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
1109497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held
111024430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_setPlayRate(CAudioPlayer *ap, SLpermille rate) {
1111497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
111224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    uint32_t contentRate = 0;
1113497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
11144614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case AUDIOTRACK_PULL:
11154614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case MEDIAPLAYER: {
1116497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        // get the content sample rate
1117497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        object_lock_peek(ap);
111824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        uint32_t contentRate = sles_to_android_sampleRate(ap->mSampleRateMilliHz);
1119497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        object_unlock_peek(ap);
1120497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        // apply the SL ES playback rate on the AudioTrack as a factor of its content sample rate
1121497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        ap->mpLock->lock();
11224614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        if (ap->mAudioTrack != NULL) {
11234614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mAudioTrack->setSampleRate(contentRate * (rate/1000.0f));
1124497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1125497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        ap->mpLock->unlock();
1126497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1127497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
11284614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1129497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1130337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", ap->mAndroidObjType);
1131337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1132497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1133497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1134497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return result;
1135497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1136497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1137497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1138497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
1139497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held
114024430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_setPlaybackRateBehavior(CAudioPlayer *ap,
1141497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        SLuint32 constraints) {
1142497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
1143497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1144497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case AUDIOTRACK_PULL:
11454614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case MEDIAPLAYER:
1146497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        if (constraints != (constraints & SL_RATEPROP_NOPITCHCORAUDIO)) {
1147497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi            result = SL_RESULT_FEATURE_UNSUPPORTED;
1148497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1149497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1150497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1151337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", ap->mAndroidObjType);
1152337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1153497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1154497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1155497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return result;
1156497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1157497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1158497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1159497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
1160497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held
116124430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_getCapabilitiesOfRate(CAudioPlayer *ap,
1162497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        SLuint32 *pCapabilities) {
1163497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1164497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case AUDIOTRACK_PULL:
1165497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case MEDIAPLAYER:
11664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        *pCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
1167497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1168497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1169497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        *pCapabilities = 0;
1170497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1171497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1172497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return SL_RESULT_SUCCESS;
1173497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1174497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1175497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1176497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
1177d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_setPlayState(CAudioPlayer *ap) {
1178e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 state = ap->mPlay.mState;
117948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    switch(ap->mAndroidObjType) {
11801ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    case AUDIOTRACK_PULL:
118148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        switch (state) {
118248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_STOPPED:
11833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED");
11843ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11853ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->stop();
11863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
118748913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
118848913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_PAUSED:
11893ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED");
11903ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11913ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->pause();
11923ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
119348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
119448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_PLAYING:
11953ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING");
11963ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11973ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->start();
11983ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
119948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
120048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        default:
1201e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            // checked by caller, should not happen
1202e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            break;
120348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        }
120448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
120514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
120648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    case MEDIAPLAYER:
12076fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        switch (state) {
12081fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        case SL_PLAYSTATE_STOPPED: {
12093ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED");
121043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            if (ap->mSfPlayer != 0) {
121143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                ap->mSfPlayer->stop();
121243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            }
12131fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } break;
121480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        case SL_PLAYSTATE_PAUSED: {
12153ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED");
121680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            object_lock_peek(&ap);
121780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            AndroidObject_state state = ap->mAndroidObjState;
121880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            object_unlock_peek(&ap);
121980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            switch(state) {
122080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_UNINITIALIZED):
12213ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    sfplayer_prepare(ap);
12223ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
122380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_PREPARING):
122480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
122580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_READY):
122643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                    if (ap->mSfPlayer != 0) {
122743e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                        ap->mSfPlayer->pause();
122843e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                    }
122980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
123080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                default:
123180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
123280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            }
123380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            } break;
123480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        case SL_PLAYSTATE_PLAYING: {
12353ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING");
123680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            object_lock_peek(&ap);
123780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            AndroidObject_state state = ap->mAndroidObjState;
123880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            object_unlock_peek(&ap);
12393ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            switch(state) {
12403ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_UNINITIALIZED):
12413ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    sfplayer_prepare(ap);
12423ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    // fall through
12433ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_PREPARING):
12443ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_READY):
12453ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    if (ap->mSfPlayer != 0) {
12463ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                        ap->mSfPlayer->play();
12473ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    }
12483ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
12493ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                default:
12503ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
125106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi            }
125280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            } break;
12533ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
12546fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        default:
1255e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            // checked by caller, should not happen
1256e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            break;
12576fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        }
125848913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
125914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
126048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    default:
126148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
126248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    }
126348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi}
126448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi
12656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
12666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
1267d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_useEventMask(CAudioPlayer *ap) {
1268e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IPlay *pPlayItf = &ap->mPlay;
1269e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 eventFlags = pPlayItf->mEventFlags;
12704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    /*switch(ap->mAndroidObjType) {
12714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case AUDIOTRACK_PULL:*/
12724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL == ap->mAudioTrack) {
1274e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        return;
12754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12774614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATMARKER) {
1278a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        ap->mAudioTrack->setMarkerPosition((uint32_t)((((int64_t)pPlayItf->mMarkerPosition
1279a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi                * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
12804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else {
12814614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // clear marker
12824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        ap->mAudioTrack->setMarkerPosition(0);
12834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATNEWPOS) {
128649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten         ap->mAudioTrack->setPositionUpdatePeriod(
128749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                (uint32_t)((((int64_t)pPlayItf->mPositionUpdatePeriod
128849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
12894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else {
12904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // clear periodic update
12914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        ap->mAudioTrack->setPositionUpdatePeriod(0);
12924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATEND) {
1295e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // nothing to do for SL_PLAYEVENT_HEADATEND, callback event will be checked against mask
12966a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
12974614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12984614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADMOVING) {
12994614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // FIXME support SL_PLAYEVENT_HEADMOVING
1300a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten        SL_LOGD("[ FIXME: IPlay_SetCallbackEventsMask(SL_PLAYEVENT_HEADMOVING) on an "
130149e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten            "SL_OBJECTID_AUDIOPLAYER to be implemented ]");
13024614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
13034614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADSTALLED) {
1304e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // nothing to do for SL_PLAYEVENT_HEADSTALLED, callback event will be checked against mask
13054614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
13064614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
13076a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
13086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13096a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13106a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
1311d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_getDuration(IPlay *pPlayItf, SLmillisecond *pDurMsec) {
1312dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
1313dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1314dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    case AUDIOTRACK_PULL:
1315dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        *pDurMsec = SL_TIME_UNKNOWN;
1316dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        // FIXME if the data source is not a buffer queue, and the audio data is saved in
1317dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        //       shared memory with the mixer process, the duration is the size of the buffer
1318a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten        SL_LOGD("FIXME: android_audioPlayer_getDuration() verify if duration can be retrieved");
1319dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        break;
132014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
1321de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case MEDIAPLAYER: {
132243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        int64_t durationUsec = SL_TIME_UNKNOWN;
132343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
132443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            durationUsec = ap->mSfPlayer->getDurationUsec();
132543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pDurMsec = durationUsec == -1 ? SL_TIME_UNKNOWN : durationUsec / 1000;
132643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
1327de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
132814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
1329dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    default:
1330dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        break;
1331dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    }
1332dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    return SL_RESULT_SUCCESS;
1333dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi}
1334dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi
1335dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi
1336dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi//-----------------------------------------------------------------------------
1337d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_getPosition(IPlay *pPlayItf, SLmillisecond *pPosMsec) {
13386a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
13396a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch(ap->mAndroidObjType) {
13406a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case AUDIOTRACK_PULL:
13413ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        if ((ap->mSampleRateMilliHz == 0) || (NULL == ap->mAudioTrack)) {
1342a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi            *pPosMsec = 0;
1343a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        } else {
13443ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            uint32_t positionInFrames;
13453ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack->getPosition(&positionInFrames);
1346a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi            *pPosMsec = ((int64_t)positionInFrames * 1000) /
1347a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi                    sles_to_android_sampleRate(ap->mSampleRateMilliHz);
1348a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        }
13496a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13506a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case MEDIAPLAYER:
135143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
135243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pPosMsec = ap->mSfPlayer->getPositionMsec();
135343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        } else {
135443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pPosMsec = 0;
135543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
13566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
13586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
13606a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
13616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
1363b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten//-----------------------------------------------------------------------------
136443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivivoid android_audioPlayer_seek(CAudioPlayer *ap, SLmillisecond posMsec) {
136543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi
136643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi    switch(ap->mAndroidObjType) {
13676f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    case AUDIOTRACK_PULL:
13686f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
136914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
13706f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    case MEDIAPLAYER:
137143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
137243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            ap->mSfPlayer->seek(posMsec);
137343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
13746f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
137514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
13766f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    default:
13776f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
13786f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    }
13793c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi}
13803c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
13813c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
13823c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi//-----------------------------------------------------------------------------
1383d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivivoid android_audioPlayer_loop(CAudioPlayer *ap, SLboolean loopEnable) {
1384d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1385d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi    if ((MEDIAPLAYER == ap->mAndroidObjType) && (ap->mSfPlayer != 0)) {
1386d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi        ap->mSfPlayer->loop((bool)loopEnable);
1387d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi    }
1388d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi}
1389d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1390d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1391d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi//-----------------------------------------------------------------------------
1392e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*
1393e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Mutes or unmutes the Android media framework object associated with the CAudioPlayer that carries
1394e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * the IVolume interface.
1395e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Pre-condition:
1396e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten *   if ap->mMute is SL_BOOLEAN_FALSE, a call to this function was preceded by a call
1397d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi *   to android_audioPlayer_volumeUpdate()
1398e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */
1399d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_setMute(CAudioPlayer* ap) {
1400de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::AudioTrack *t = NULL;
1401b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    switch(ap->mAndroidObjType) {
1402b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    case AUDIOTRACK_PULL:
1403b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    case MEDIAPLAYER:
14044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        t = ap->mAudioTrack;
1405b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi        break;
1406b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    default:
1407b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi        break;
14086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
1409de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    // when unmuting: volume levels have already been updated in IVolume_SetMute
1410de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    if (NULL != t) {
1411e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        t->mute(ap->mMute);
1412de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    }
1413e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten}
1414e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1415e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1416e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten//-----------------------------------------------------------------------------
1417d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_volumeUpdate(CAudioPlayer* ap) {
1418d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi    android_audioPlayer_updateStereoVolume(ap);
1419d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi    android_audioPlayer_setMute(ap);
14206a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    return SL_RESULT_SUCCESS;
14216a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
14224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14234b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten//-----------------------------------------------------------------------------
1425a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivivoid android_audioPlayer_bufferQueueRefilled(CAudioPlayer *ap) {
1426a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // the AudioTrack associated with the AudioPlayer receiving audio from a PCM buffer
1427a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // queue was stopped when the queue become empty, we restart as soon as a new buffer
1428a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // has been enqueued since we're in playing state
1429b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi    if (NULL != ap->mAudioTrack) {
1430b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi        ap->mAudioTrack->start();
1431b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi    }
1432a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
1433a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // when the queue became empty, an underflow on the prefetch status itf was sent. Now the queue
1434a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // has received new data, signal it has sufficient data
1435a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
1436fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_SUFFICIENTDATA,
1437fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten            true);
1438a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
1439b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi}
1440b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1441b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1442b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi//-----------------------------------------------------------------------------
14434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/*
14444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * BufferQueue::Clear
14454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten */
14464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn KastenSLresult android_audioPlayerClear(CAudioPlayer *pAudioPlayer) {
14474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SLresult result = SL_RESULT_SUCCESS;
14484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    switch (pAudioPlayer->mAndroidObjType) {
14504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    //-----------------------------------
14514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // AudioTrack
14524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    case AUDIOTRACK_PULL:
14534b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        pAudioPlayer->mAudioTrack->flush();
14544b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        break;
14554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    default:
14564b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
14574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        break;
14584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    }
14594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    return result;
14614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten}
1462b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1463