AudioPlayer_to_android.cpp revision a9a70a4451545034c9263dd55b181f2912534c37
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
21a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastentemplate class android::KeyedVector<SLuint32, android::AudioEffect* > ;
22a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
2375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#define KEY_STREAM_TYPE_PARAMSIZE  sizeof(SLint32)
241ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
2505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//-----------------------------------------------------------------------------
26a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Triviint android_getMinFrameCount(uint32_t sampleRate) {
27a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    int afSampleRate;
28a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputSamplingRate(&afSampleRate,
29a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
30a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
31a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
32a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    int afFrameCount;
33a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputFrameCount(&afFrameCount,
34a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
35a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
36a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
37a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    uint32_t afLatency;
38a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (android::AudioSystem::getOutputLatency(&afLatency,
39a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi            ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) {
40a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE;
41a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
42a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // minimum nb of buffers to cover output latency, given the size of each hardware audio buffer
43a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
44a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    if (minBufCount < 2) minBufCount = 2;
45a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // minimum number of frames to cover output latency at the sample rate of the content
46a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    return (afFrameCount*sampleRate*minBufCount)/afSampleRate;
476a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
486a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
49712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
50712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//-----------------------------------------------------------------------------
511fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define LEFT_CHANNEL_MASK  0x1 << 0
521fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define RIGHT_CHANNEL_MASK 0x1 << 1
536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
54d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_updateStereoVolume(CAudioPlayer* ap) {
556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    float leftVol = 1.0f, rightVol = 1.0f;
566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL == ap->mAudioTrack) {
584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        return;
5945d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi    }
601fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // should not be used when muted
611fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    if (SL_BOOLEAN_TRUE == ap->mMute) {
621fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        return;
631fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    }
644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
651fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    int channelCount = ap->mNumChannels;
661fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
671fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    // mute has priority over solo
681fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    int leftAudibilityFactor = 1, rightAudibilityFactor = 1;
691fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
70e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    if (channelCount >= STEREO_CHANNELS) {
71b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten        if (ap->mMuteMask & LEFT_CHANNEL_MASK) {
721fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // left muted
731fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            leftAudibilityFactor = 0;
741fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        } else {
751fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // left not muted
76b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten            if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
771fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // left soloed
781fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                leftAudibilityFactor = 1;
791fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } else {
801fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // left not soloed
81b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten                if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
821fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // right solo silences left
831fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    leftAudibilityFactor = 0;
841fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                } else {
851fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left and right are not soloed, and left is not muted
861fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    leftAudibilityFactor = 1;
871fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                }
881fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            }
891fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        }
901fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
91b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten        if (ap->mMuteMask & RIGHT_CHANNEL_MASK) {
921fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // right muted
931fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            rightAudibilityFactor = 0;
941fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        } else {
951fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            // right not muted
96b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten            if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
971fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // right soloed
981fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                rightAudibilityFactor = 1;
991fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } else {
1001fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                // right not soloed
101b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten                if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
1021fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left solo silences right
1031fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    rightAudibilityFactor = 0;
1041fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                } else {
1051fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    // left and right are not soloed, and right is not muted
1061fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                    rightAudibilityFactor = 1;
1071fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi                }
1081fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            }
1091fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        }
1101fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    }
1116a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
1126a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // compute amplification as the combination of volume level and stereo position
113172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    //   amplification from volume level
114172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    ap->mAmplFromVolLevel = sles_to_android_amplification(ap->mVolume.mLevel);
115ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    //   amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf)
116172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    leftVol  *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel;
117172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    rightVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel;
118a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
119f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    // amplification from stereo position
1201fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    if (ap->mVolume.mEnableStereoPosition) {
121f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi        // panning law depends on number of channels of content: stereo panning vs 2ch. balance
12245d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi        if(1 == channelCount) {
123f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi            // stereo panning
1241fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            double theta = (1000+ap->mVolume.mStereoPosition)*M_PI_4/1000.0f; // 0 <= theta <= Pi/2
125e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            ap->mAmplFromStereoPos[0] = cos(theta);
126e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            ap->mAmplFromStereoPos[1] = sin(theta);
127f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi        } else {
128f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi            // stereo balance
1291fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            if (ap->mVolume.mStereoPosition > 0) {
130e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[0] = (1000-ap->mVolume.mStereoPosition)/1000.0f;
131e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[1] = 1.0f;
1326a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            } else {
133e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[0] = 1.0f;
134e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                ap->mAmplFromStereoPos[1] = (1000+ap->mVolume.mStereoPosition)/1000.0f;
1356a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            }
1366a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        }
137e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        leftVol  *= ap->mAmplFromStereoPos[0];
138e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        rightVol *= ap->mAmplFromStereoPos[1];
139f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    }
140f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
1411fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi    ap->mAudioTrack->setVolume(leftVol * leftAudibilityFactor, rightVol * rightAudibilityFactor);
142ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi
143ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    // changes in the AudioPlayer volume must be reflected in the send level:
144ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    //  in SLEffectSendItf or in SLAndroidEffectSendItf?
145ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    // FIXME replace interface test by an internal API once we have one.
146ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    if (NULL != ap->mEffectSend.mItf) {
147ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        for (unsigned int i=0 ; i<AUX_MAX ; i++) {
148ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi            if (ap->mEffectSend.mEnableLevels[i].mEnable) {
149ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                android_fxSend_setSendLevel(ap,
150ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                        ap->mEffectSend.mEnableLevels[i].mSendLevel + ap->mVolume.mLevel);
151ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                // there's a single aux bus on Android, so we can stop looking once the first
152ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                // aux effect is found.
153ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi                break;
154ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi            }
155ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        }
156ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    } else if (NULL != ap->mAndroidEffectSend.mItf) {
157ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi        android_fxSend_setSendLevel(ap, ap->mAndroidEffectSend.mSendLevel + ap->mVolume.mLevel);
158ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi    }
1594614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1604614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1614614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
162e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleMarker_lockPlay(CAudioPlayer* ap) {
16349e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten    //SL_LOGV("received event EVENT_MARKER from AudioTrack");
1644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
1664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
1684614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
1694614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
1704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
1714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL != callback) {
1734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // getting this event implies SL_PLAYEVENT_HEADATMARKER was set in the event mask
1744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATMARKER);
1754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
1764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1774614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1784614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
179e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap) {
18049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten    //SL_LOGV("received event EVENT_NEW_POS from AudioTrack");
1814614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
1834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
1854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
1864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
1874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
1884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL != callback) {
1904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // getting this event implies SL_PLAYEVENT_HEADATNEWPOS was set in the event mask
1914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATNEWPOS);
1924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
1934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
1944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1954614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
197e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap) {
1984614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    slPlayCallback callback = NULL;
1994614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    void* callbackPContext = NULL;
2004614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
2014614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_lock_shared(&ap->mPlay);
2024614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callback = ap->mPlay.mCallback;
2034614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    callbackPContext = ap->mPlay.mContext;
2044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    bool headStalled = (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADSTALLED) != 0;
2054614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    interface_unlock_shared(&ap->mPlay);
2064614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
2074614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if ((NULL != callback) && headStalled) {
2084614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADSTALLED);
209f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi    }
210f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi}
211f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
21224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
213e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi//-----------------------------------------------------------------------------
214e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi/**
215e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * post-condition: play state of AudioPlayer is SL_PLAYSTATE_PAUSED if setPlayStateToPaused is true
216e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *
217e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * note: a conditional flag, setPlayStateToPaused, is used here to specify whether the play state
218e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       needs to be changed when the player reaches the end of the content to play. This is
219e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       relative to what the specification describes for buffer queues vs the
220e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *       SL_PLAYEVENT_HEADATEND event. In the OpenSL ES specification 1.0.1:
221e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *        - section 8.12 SLBufferQueueItf states "In the case of starvation due to insufficient
222e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          buffers in the queue, the playing of audio data stops. The player remains in the
223e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          SL_PLAYSTATE_PLAYING state."
224e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *        - section 9.2.31 SL_PLAYEVENT states "SL_PLAYEVENT_HEADATEND Playback head is at the end
225e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi *          of the current content and the player has paused."
226e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi */
227fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayStateToPaused,
228fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        bool needToLock) {
22925d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    //SL_LOGV("ap=%p, setPlayStateToPaused=%d, needToLock=%d", ap, setPlayStateToPaused,
23025d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    //        needToLock);
231e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    slPlayCallback playCallback = NULL;
232e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    void * playContext = NULL;
233e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    // SLPlayItf callback or no callback?
234fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
235ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        interface_lock_exclusive(&ap->mPlay);
236fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
237e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) {
238e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        playCallback = ap->mPlay.mCallback;
239e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        playContext = ap->mPlay.mContext;
240e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    }
24125d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi    if (setPlayStateToPaused) {
242ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        ap->mPlay.mState = SL_PLAYSTATE_PAUSED;
243ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    }
244ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    if (needToLock) {
245ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        interface_unlock_exclusive(&ap->mPlay);
246fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
247e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    // callback with no lock held
248e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    if (NULL != playCallback) {
249e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND);
250e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    }
25125d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi
252e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi}
253e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
254a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
255a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi//-----------------------------------------------------------------------------
256a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi/**
257a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * pre-condition: AudioPlayer has SLPrefetchStatusItf initialized
258a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * post-condition:
259a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *  - ap->mPrefetchStatus.mStatus == status
260a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *  - the prefetch status callback, if any, has been notified if a change occurred
261a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi *
262a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi */
263fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_prefetchStatus_lockPrefetch(CAudioPlayer *ap, SLuint32 status,
264fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        bool needToLock) {
265a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    slPrefetchCallback prefetchCallback = NULL;
266a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    void * prefetchContext = NULL;
267a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
268fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
269fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        interface_lock_exclusive(&ap->mPrefetchStatus);
270fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
271a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // status change?
272a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (ap->mPrefetchStatus.mStatus != status) {
273a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        ap->mPrefetchStatus.mStatus = status;
274a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        // callback or no callback?
275a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) {
276a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            prefetchCallback = ap->mPrefetchStatus.mCallback;
277a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            prefetchContext  = ap->mPrefetchStatus.mContext;
278a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
279a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
280fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    if (needToLock) {
281fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        interface_unlock_exclusive(&ap->mPrefetchStatus);
282fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    }
283a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
284a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // callback with no lock held
285a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (NULL != prefetchCallback) {
286a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext, status);
287a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
288a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi}
289a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
290a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
291f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi//-----------------------------------------------------------------------------
29275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_setStreamType(CAudioPlayer* ap, SLint32 type) {
29375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
29475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SL_LOGV("type %ld", type);
29575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
29675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    int newStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
29775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    switch(type) {
29875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_VOICE:
29975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::VOICE_CALL;
30075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_SYSTEM:
30275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::SYSTEM;
30375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_RING:
30575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::RING;
30675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
30775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_MEDIA:
30875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::MUSIC;
30975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_ALARM:
31175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::ALARM;
31275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case SL_ANDROID_STREAM_NOTIFICATION:
31475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        newStreamType = android::AudioSystem::NOTIFICATION;
31575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
31675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    default:
31775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_PLAYERSTREAMTYPE_SET_UNKNOWN_TYPE);
31875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
31975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
32075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
32175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
32275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    // stream type needs to be set before the object is realized
32375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    // (ap->mAudioTrack is supposed to be NULL until then)
3245f71e35da153d194d805e030ab38935599e065d2Jean-Michel Trivi    if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) {
32575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_PLAYERSTREAMTYPE_REALIZED);
32675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PRECONDITIONS_VIOLATED;
32775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
32875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        ap->mStreamType = newStreamType;
32975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
33075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
33275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
33375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
33675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_getStreamType(CAudioPlayer* ap, SLint32 *pType) {
33775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
33875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
33975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    switch(ap->mStreamType) {
34075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::VOICE_CALL:
34175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_VOICE;
34275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::SYSTEM:
34475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_SYSTEM;
34575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::RING:
34775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_RING;
34875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
34975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::DEFAULT:
35075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::MUSIC:
35175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_MEDIA;
35275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::ALARM:
35475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_ALARM;
35575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    case android::AudioSystem::NOTIFICATION:
35775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_NOTIFICATION;
35875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
35975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    default:
36075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_INTERNAL_ERROR;
36175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        *pType = SL_ANDROID_STREAM_MEDIA;
36275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        break;
36375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
36475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
36675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
36775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
36975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
37075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#ifndef USE_BACKPORT
3718a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivistatic void sfplayer_prepare(CAudioPlayer *ap, bool lockAP) {
3728a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
3738a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    if (lockAP) { object_lock_exclusive(&ap->mObject); }
3748a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    ap->mAndroidObjState = ANDROID_PREPARING;
3758a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    if (lockAP) { object_unlock_exclusive(&ap->mObject); }
3768a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
3773ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    if (ap->mSfPlayer != 0) {
3783ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        ap->mSfPlayer->prepare();
3793ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    }
3803ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi}
3813ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi#endif
3823ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
3833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi//-----------------------------------------------------------------------------
3843ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi#ifndef USE_BACKPORT
385de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi// Callback associated with an SfPlayer of an SL ES AudioPlayer that gets its data
3863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi// from a URI or FD, for prepare and prefetch events
387a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void sfplayer_handlePrefetchEvent(const int event, const int data1, void* user) {
388de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    if (NULL == user) {
389de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        return;
390de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    }
391f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
392de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)user;
39324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    //SL_LOGV("received event %d, data %d from SfAudioPlayer", event, data1);
394de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    switch(event) {
395f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
3963ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    case(android::SfPlayer::kEventPrepared): {
3973ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        object_lock_exclusive(&ap->mObject);
3983ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
3993ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        if (SFPLAYER_SUCCESS != data1) {
4003ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack = NULL;
4013ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mNumChannels = 0;
4023ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSampleRateMilliHz = 0;
4033ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_UNINITIALIZED;
4043ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
4053ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        } else {
4063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack = ap->mSfPlayer->getAudioTrack();
4073ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mNumChannels = ap->mSfPlayer->getNumChannels();
4083ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSampleRateMilliHz = android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz());
4093ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mSfPlayer->startPrefetch_async();
4103ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
41124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            // update the new track with the current settings
41224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            android_audioPlayer_useEventMask(ap);
41324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            android_audioPlayer_volumeUpdate(ap);
4148a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi            android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate, false /*lockAP*/);
41524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
4163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_READY;
4173ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        }
4183ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
4193ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        object_unlock_exclusive(&ap->mObject);
4203ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi    } break;
4213ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
422de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventPrefetchFillLevelUpdate): {
423a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
424a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            break;
425a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
426ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        slPrefetchCallback callback = NULL;
427ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        void* callbackPContext = NULL;
4288a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
429ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        // SLPrefetchStatusItf callback or no callback?
430ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        interface_lock_exclusive(&ap->mPrefetchStatus);
431ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) {
432ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            callback = ap->mPrefetchStatus.mCallback;
433ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            callbackPContext = ap->mPrefetchStatus.mContext;
434ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        }
435ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        ap->mPrefetchStatus.mLevel = (SLpermille)data1;
436ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        interface_unlock_exclusive(&ap->mPrefetchStatus);
4378a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
438ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        // callback with no lock held
439ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        if (NULL != callback) {
440ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi            (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext,
441ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi                    SL_PREFETCHEVENT_FILLLEVELCHANGE);
442ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi        }
443ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi    } break;
444de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
445de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventPrefetchStatusChange): {
446a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
447a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            break;
448a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        }
44906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        slPrefetchCallback callback = NULL;
450de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        void* callbackPContext = NULL;
4518a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
452de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        // SLPrefetchStatusItf callback or no callback?
4538a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        object_lock_exclusive(&ap->mObject);
454de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) {
455de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            callback = ap->mPrefetchStatus.mCallback;
456de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            callbackPContext = ap->mPrefetchStatus.mContext;
457de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        }
4584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        if (data1 >= android::SfPlayer::kStatusIntermediate) {
459de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA;
4604614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            // FIXME estimate fill level better?
4614614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mPrefetchStatus.mLevel = 1000;
4624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mAndroidObjState = ANDROID_READY;
4634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        } else if (data1 < android::SfPlayer::kStatusIntermediate) {
464de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
4654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            // FIXME estimate fill level better?
4664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mPrefetchStatus.mLevel = 0;
467de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        }
4688a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        object_unlock_exclusive(&ap->mObject);
4698a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
470de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        // callback with no lock held
47106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        if (NULL != callback) {
472de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, SL_PREFETCHEVENT_STATUSCHANGE);
47306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        }
474de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
475de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
476de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case(android::SfPlayer::kEventEndOfStream): {
477fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        audioPlayer_dispatch_headAtEnd_lockPlay(ap, true /*set state to paused?*/, true);
47824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        if ((NULL != ap->mAudioTrack) && (!ap->mSeek.mLoopEnabled)) {
4793ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack->stop();
4803ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        }
481de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
482de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
4836a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
4846a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
4856a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
486a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi}
48714e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
488a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
48975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
490a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
491d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_checkSourceSink(CAudioPlayer *pAudioPlayer)
492c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi{
493acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource;
494acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink;
495c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
496c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Sink check:
497c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //     currently only OutputMix sinks are supported, regardless of the data source
498c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    if (*(SLuint32 *)pAudioSnk->pLocator != SL_DATALOCATOR_OUTPUTMIX) {
49949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        SL_LOGE("Cannot create audio player: data sink is not SL_DATALOCATOR_OUTPUTMIX");
500c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
501c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
502c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
503c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
504c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
505c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
506c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLuint32 formatType = *(SLuint32 *)pAudioSrc->pFormat;
5074b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
508c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
509c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
510c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Buffer Queues
51101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_BUFFERQUEUE:
51201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
51301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten        {
514c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        SLDataLocator_BufferQueue *dl_bq =  (SLDataLocator_BufferQueue *) pAudioSrc->pLocator;
5154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
516c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        // Buffer format
517c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        switch (formatType) {
518a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        //     currently only PCM buffer queues are supported,
519c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_PCM: {
520c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) pAudioSrc->pFormat;
521c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->numChannels) {
522c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 1:
523c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 2:
524c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
525c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
5264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // this should have already been rejected by checkDataFormat
5274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported " \
5284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                    "PCM data source with %u channels", (unsigned) df_pcm->numChannels);
529c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
530c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
531c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->samplesPerSec) {
532c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_8:
533c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_11_025:
534c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_12:
535c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_16:
536c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_22_05:
537c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_24:
538c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_32:
539c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_SAMPLINGRATE_44_1:
540c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
5414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_48:    // not 48?
5424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_64:
5434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_88_2:
5444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_96:
5454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_SAMPLINGRATE_192:
546c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
54749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported sample rate %u milliHz",
54849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                    (unsigned) df_pcm->samplesPerSec);
549c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
550c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
551c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->bitsPerSample) {
552c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_8:
553337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                // FIXME We should support this
554337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported 8-bit data");
5554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                return SL_RESULT_CONTENT_UNSUPPORTED;
556c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_PCMSAMPLEFORMAT_FIXED_16:
557c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
558c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
559c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
5604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // this should have already been rejected by checkDataFormat
5614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported sample bit depth %lu",
562c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                        (SLuint32)df_pcm->bitsPerSample);
563c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
564c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
565c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->containerSize) {
566c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case 16:
567c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
568c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // others
569c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
570337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported container size %u",
571337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                    (unsigned) df_pcm->containerSize);
572c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
573c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
574c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->channelMask) {
575c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                // FIXME needs work
576c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
577c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
578c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
579c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            switch (df_pcm->endianness) {
580c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            case SL_BYTEORDER_LITTLEENDIAN:
581c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                break;
5824b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            case SL_BYTEORDER_BIGENDIAN:
583337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported big-endian byte order");
5844b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                return SL_RESULT_CONTENT_UNSUPPORTED;
5854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten                // native is proposed but not yet in spec
586c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            default:
587337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                SL_LOGE("Cannot create audio player: unsupported byte order %u",
588337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten                    (unsigned) df_pcm->endianness);
589c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi                return SL_RESULT_CONTENT_UNSUPPORTED;
590c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            }
591c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            } //case SL_DATAFORMAT_PCM
592c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            break;
593c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_MIME:
594c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
59501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten            SL_LOGE("Cannot create audio player with buffer queue data source "
59649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_PCM format");
597c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
598c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        default:
59901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten            SL_LOGE("Cannot create audio player with buffer queue data source "
60049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_PCM format");
601c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
602c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        } // switch (formatType)
60301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten        } // case SL_DATALOCATOR_BUFFERQUEUE or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
604c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
605c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //------------------
6066fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    //   URI
6076fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    case SL_DATALOCATOR_URI:
6086fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        {
609989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        SLDataLocator_URI *dl_uri =  (SLDataLocator_URI *) pAudioSrc->pLocator;
610989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        if (NULL == dl_uri->URI) {
611989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_PARAMETER_INVALID;
612989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        }
613989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        // URI format
614989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (formatType) {
615989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_MIME:
616989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
617989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_PCM:
618989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
619337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("Cannot create audio player with SL_DATALOCATOR_URI data source without "
62049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "SL_DATAFORMAT_MIME format");
621989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
622989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // switch (formatType)
6236fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        } // case SL_DATALOCATOR_URI
6246fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        break;
6256fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    //------------------
626989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //   File Descriptor
627989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
628989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        {
629989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        // fd is already non null
630989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (formatType) {
631989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_MIME:
632989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
633989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_PCM:
634989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            // FIXME implement
635a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten            SL_LOGD("[ FIXME implement PCM FD data sources ]");
636989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            break;
637989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        case SL_DATAFORMAT_RESERVED3:
638337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("Cannot create audio player with SL_DATALOCATOR_ANDROIDFD data source "
63949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                "without SL_DATAFORMAT_MIME or SL_DATAFORMAT_PCM format");
640989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            return SL_RESULT_CONTENT_UNSUPPORTED;
641989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // switch (formatType)
642989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        } // case SL_DATALOCATOR_ANDROIDFD
643989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        break;
644989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //------------------
645c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //   Address
646c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_ADDRESS:
647c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_IODEVICE:
648c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_OUTPUTMIX:
649c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED5:
650c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_MIDIBUFFERQUEUE:
651c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_RESERVED8:
652337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Cannot create audio player with data locator type 0x%x", (unsigned) locatorType);
653c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_CONTENT_UNSUPPORTED;
654c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
655c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
656c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }// switch (locatorType)
657c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
658c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return SL_RESULT_SUCCESS;
659c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi}
660c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
6624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
6634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//-----------------------------------------------------------------------------
664d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void audioTrack_callBack_uri(int event, void* user, void *info) {
6654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    // EVENT_MORE_DATA needs to be handled with priority over the other events
6664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    // because it will be called the most often during playback
6674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (event == android::AudioTrack::EVENT_MORE_DATA) {
66849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack");
6694614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // set size to 0 to signal we're not using the callback to write more data
6704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info;
6714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pBuff->size = 0;
6724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else if (NULL != user) {
6734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        switch (event) {
6744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_MARKER) :
675e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleMarker_lockPlay((CAudioPlayer *)user);
6764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi                break;
6774614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_NEW_POS) :
678e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleNewPos_lockPlay((CAudioPlayer *)user);
6794614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi                break;
6804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            case (android::AudioTrack::EVENT_UNDERRUN) :
681e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                audioTrack_handleUnderrun_lockPlay((CAudioPlayer *)user);
682b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi                break;
683e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            default:
684e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event,
685e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                        (CAudioPlayer *)user);
686e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                break;
6874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        }
6884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
6894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi}
6904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
691a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
6921ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// Callback associated with an AudioTrack of an SL ES AudioPlayer that gets its data
6931ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// from a buffer queue.
694a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void audioTrack_callBack_pullFromBuffQueue(int event, void* user, void *info) {
695e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)user;
6968f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi    void * callbackPContext = NULL;
6976a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch(event) {
6986a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
6996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case (android::AudioTrack::EVENT_MORE_DATA) : {
70049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack");
7013a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten        slBufferQueueCallback callback = NULL;
7021ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info;
7031ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        // retrieve data from the buffer queue
704e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        interface_lock_exclusive(&ap->mBufferQueue);
705e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        if (ap->mBufferQueue.mState.count != 0) {
706e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            //SL_LOGV("nbBuffers in queue = %lu",ap->mBufferQueue.mState.count);
707e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear);
7081ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
709e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            BufferHeader *oldFront = ap->mBufferQueue.mFront;
710d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            BufferHeader *newFront = &oldFront[1];
7111ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7121ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            // FIXME handle 8bit based on buffer format
7131ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            short *pSrc = (short*)((char *)oldFront->mBuffer
714e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                    + ap->mBufferQueue.mSizeConsumed);
715e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            if (ap->mBufferQueue.mSizeConsumed + pBuff->size < oldFront->mSize) {
7161ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // can't consume the whole or rest of the buffer in one shot
717e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mSizeConsumed += pBuff->size;
7181ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // leave pBuff->size untouched
7191ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // consume data
7203a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // FIXME can we avoid holding the lock during the copy?
7211ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                memcpy (pBuff->i16, pSrc, pBuff->size);
7221ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            } else {
7231ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // finish consuming the buffer or consume the buffer in one shot
724e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                pBuff->size = oldFront->mSize - ap->mBufferQueue.mSizeConsumed;
725e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mSizeConsumed = 0;
7261ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7271ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                if (newFront ==
728e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                        &ap->mBufferQueue.mArray
729e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                            [ap->mBufferQueue.mNumBuffers + 1])
7301ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                {
731e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                    newFront = ap->mBufferQueue.mArray;
7321ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                }
733e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mFront = newFront;
7341ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
735e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mState.count--;
736e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                ap->mBufferQueue.mState.playIndex++;
7371ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7381ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // consume data
7393a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // FIXME can we avoid holding the lock during the copy?
7401ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                memcpy (pBuff->i16, pSrc, pBuff->size);
7411ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7421ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                // data has been consumed, and the buffer queue state has been updated
74306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi                // we will notify the client if applicable
744e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                callback = ap->mBufferQueue.mCallback;
7453a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten                // save callback data
746e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi                callbackPContext = ap->mBufferQueue.mContext;
7471ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            }
748e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        } else { // empty queue
749e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // signal no data available
7501ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi            pBuff->size = 0;
751e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
752e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // signal we're at the end of the content, but don't pause (see note in function)
753fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten            audioPlayer_dispatch_headAtEnd_lockPlay(ap, false /*set state to paused?*/, false);
754e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi
755a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            // signal underflow to prefetch status itf
756a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
757fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten                audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_UNDERFLOW,
758fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten                    false);
759a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi            }
760a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
761e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            // stop the track so it restarts playing faster when new data is enqueued
762e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            ap->mAudioTrack->stop();
7631ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        }
764e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        interface_unlock_exclusive(&ap->mBufferQueue);
76506a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        // notify client
7668f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi        if (NULL != callback) {
767e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi            (*callback)(&ap->mBufferQueue.mItf, callbackPContext);
7688f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi        }
7696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
7706a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    break;
7711ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_MARKER) :
773e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleMarker_lockPlay(ap);
7744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_NEW_POS) :
777e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleNewPos_lockPlay(ap);
7784614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7796a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case (android::AudioTrack::EVENT_UNDERRUN) :
781e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        audioTrack_handleUnderrun_lockPlay(ap);
7824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        break;
7836a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
7846a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
785e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // FIXME where does the notification of SL_PLAYEVENT_HEADMOVING fit?
786b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi        SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event,
787b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi                (CAudioPlayer *)user);
7886a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
7891ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    }
7901ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi}
7911ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7921ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi
7931ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi//-----------------------------------------------------------------------------
794d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_create(
79572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten        CAudioPlayer *pAudioPlayer) {
796773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
797acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource;
798acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten    const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink;
799c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
800c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
801a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //--------------------------------------
802928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // Sink check:
803c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // currently only OutputMix sinks are supported
804928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // this has already been verified in sles_to_android_CheckAudioPlayerSourceSink
805928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // SLuint32 locatorType = *(SLuint32 *)pAudioSnk->pLocator;
806928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // if (SL_DATALOCATOR_OUTPUTMIX == locatorType) {
807928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    // }
808c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
809c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    //--------------------------------------
810c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    // Source check:
811928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    SLuint32 locatorType = *(SLuint32 *)pAudioSrc->pLocator;
812c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    switch (locatorType) {
813a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   -----------------------------------
814a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   Buffer Queue to AudioTrack
815c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    case SL_DATALOCATOR_BUFFERQUEUE:
81601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
8171ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi        pAudioPlayer->mAndroidObjType = AUDIOTRACK_PULL;
81806a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = new android::Mutex();
819497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
820c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
821a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //   -----------------------------------
822989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    //   URI or FD to MediaPlayer
8233a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten    case SL_DATALOCATOR_URI:
824989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    case SL_DATALOCATOR_ANDROIDFD:
825c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = MEDIAPLAYER;
82606a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = new android::Mutex();
8274614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
828c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        break;
829c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    default:
830c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        pAudioPlayer->mAndroidObjType = INVALID_TYPE;
83106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi        pAudioPlayer->mpLock = NULL;
832497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        pAudioPlayer->mPlaybackRate.mCapabilities = 0;
833c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
834337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
835c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    }
836c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi
837de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED;
83875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
8394614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    pAudioPlayer->mAudioTrack = NULL;
84014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
841a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // no longer needed, as placement new (explicit constructor) already does this
842a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // pAudioPlayer->mSfPlayer.clear();
84314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
844de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi
8453d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi#ifndef USE_BACKPORT
8463d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi    pAudioPlayer->mSessionId = android::AudioSystem::newAudioSessionId();
8473d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi#endif
8483d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi
849e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromVolLevel = 1.0f;
850e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromStereoPos[0] = 1.0f;
851e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    pAudioPlayer->mAmplFromStereoPos[1] = 1.0f;
852fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    pAudioPlayer->mDirectLevel = 0; // no attenuation
853fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
854e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
85524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    // initialize interface-specific fields that can be used regardless of whether the interface
85624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    // is exposed on the AudioPlayer or not
857a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // (section no longer applicable, as all previous initializations were the same as the defaults)
85824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
859c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi    return result;
860773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
861773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}
862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi
863a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
864a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//-----------------------------------------------------------------------------
86575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_setConfig(CAudioPlayer *ap, const SLchar *configKey,
86675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        const void *pConfigValue, SLuint32 valueSize) {
86775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
86875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
86975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
87075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    if (NULL == ap) {
87175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_INTERNAL_ERROR;
87275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if (NULL == pConfigValue) {
87375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_NULL_PARAM);
87475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
87575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
87675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
87775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
87875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        // stream type
87975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        if (KEY_STREAM_TYPE_PARAMSIZE > valueSize) {
88075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
88175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
88275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        } else {
88375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = audioPlayer_setStreamType(ap, *(SLuint32*)pConfigValue);
88475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        }
88575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
88675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
88775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
88875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
88975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
89075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
89275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
89375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
89675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_getConfig(CAudioPlayer* ap, const SLchar *configKey,
89775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SLuint32* pValueSize, void *pConfigValue) {
89875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
89975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
90075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
90175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    if (NULL == ap) {
90275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        return SL_RESULT_INTERNAL_ERROR;
90375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if (NULL == pValueSize) {
90475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_NULL_PARAM);
90575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
90675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
90775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
90875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
90975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        // stream type
91075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        if (KEY_STREAM_TYPE_PARAMSIZE > *pValueSize) {
91175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
91275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
91375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        } else {
91475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            *pValueSize = KEY_STREAM_TYPE_PARAMSIZE;
91575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            if (NULL != pConfigValue) {
91675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi                result = audioPlayer_getStreamType(ap, (SLint32*)pConfigValue);
91775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi            }
91875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        }
91975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    } else {
92175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
92275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
92375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    }
92475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi    return result;
92675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi}
92775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi
92975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//-----------------------------------------------------------------------------
930d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async) {
931a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
932a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
933a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten    SL_LOGV("Realize pAudioPlayer=%p", pAudioPlayer);
934b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi
935a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    switch (pAudioPlayer->mAndroidObjType) {
936a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //-----------------------------------
937a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // AudioTrack
9381ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    case AUDIOTRACK_PULL:
939a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        {
9401fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        // initialize platform-specific CAudioPlayer fields
9411fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
942a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        SLDataLocator_BufferQueue *dl_bq =  (SLDataLocator_BufferQueue *)
943a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                pAudioPlayer->mDynamicSource.mDataSource;
944a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *)
945a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                pAudioPlayer->mDynamicSource.mDataSource->pFormat;
946a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
947a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        uint32_t sampleRate = sles_to_android_sampleRate(df_pcm->samplesPerSec);
948a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
9494614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack = new android::AudioTrack(
95075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi                pAudioPlayer->mStreamType,                           // streamType
951a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sampleRate,                                          // sampleRate
952a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sles_to_android_sampleFormat(df_pcm->bitsPerSample), // format
953a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                sles_to_android_channelMask(df_pcm->numChannels, df_pcm->channelMask),//channel mask
9541ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi                0,                                                   // frameCount (here min)
955a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                0,                                                   // flags
956a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi                audioTrack_callBack_pullFromBuffQueue,               // callback
957a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi                (void *) pAudioPlayer,                               // user
9581bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                0      // FIXME find appropriate frame count         // notificationFrame
9591bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi#ifndef USE_BACKPORT
9601bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                , pAudioPlayer->mSessionId
9611bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi#endif
9621bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi                );
963337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        android::status_t status = pAudioPlayer->mAudioTrack->initCheck();
964337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        if (status != android::NO_ERROR) {
965337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten            SL_LOGE("AudioTrack::initCheck status %u", status);
9666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi            result = SL_RESULT_CONTENT_UNSUPPORTED;
967a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi        }
9681fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
9691fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        // initialize platform-independent CAudioPlayer fields
9701fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi
9711fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        pAudioPlayer->mNumChannels = df_pcm->numChannels;
972a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        pAudioPlayer->mSampleRateMilliHz = df_pcm->samplesPerSec; // Note: bad field name in SL ES
9733ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9743ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAndroidObjState = ANDROID_READY;
975de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
97614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
977a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    //-----------------------------------
978a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    // MediaPlayer
9796fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi    case MEDIAPLAYER: {
98080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        object_lock_exclusive(&pAudioPlayer->mObject);
981f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
9823ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED;
9833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mNumChannels = 0;
9843ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mSampleRateMilliHz = 0;
9853ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mAudioTrack = NULL;
9863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9873ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        AudioPlayback_Parameters app;
9883ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.sessionId = pAudioPlayer->mSessionId;
9893ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.streamType = pAudioPlayer->mStreamType;
9903ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.trackcb = audioTrack_callBack_uri;
9913ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        app.trackcbUser = (void *) pAudioPlayer;
9923ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
9933ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        pAudioPlayer->mSfPlayer = new android::SfPlayer(&app);
994a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi        pAudioPlayer->mSfPlayer->setNotifListener(sfplayer_handlePrefetchEvent,
995ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi                        (void*)pAudioPlayer /*notifUSer*/);
996ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        pAudioPlayer->mSfPlayer->armLooper();
9978a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
998de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        object_unlock_exclusive(&pAudioPlayer->mObject);
9996fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi
1000989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) {
1001989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            case SL_DATALOCATOR_URI:
1002989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                pAudioPlayer->mSfPlayer->setDataSource(
1003989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI);
1004989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                break;
1005989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            case SL_DATALOCATOR_ANDROIDFD: {
1006989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset;
1007989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                pAudioPlayer->mSfPlayer->setDataSource(
1008989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (int)pAudioPlayer->mDataSource.mLocator.mFD.fd,
1009989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
1010989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                                (int64_t)SFPLAYER_FD_FIND_FILE_SIZE : offset,
1011989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                        (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length);
1012989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                } break;
1013989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi            default:
10143ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR);
1015989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi                break;
1016989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi        }
1017f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi
1018de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
101914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
1020a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    default:
1021337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", pAudioPlayer->mAndroidObjType);
1022337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1023337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
1024a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    }
1025a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
102614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
1027b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi
1028ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi    // proceed with effect initialization
10294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize EQ
10304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // FIXME use a table of effect descriptors when adding support for more effects
10314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (memcmp(SL_IID_EQUALIZER, &pAudioPlayer->mEqualizer.mEqDescriptor.type,
10324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            sizeof(effect_uuid_t)) == 0) {
10337e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize EQ for AudioPlayer=%p", pAudioPlayer);
10343d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_eq_init(pAudioPlayer->mSessionId, &pAudioPlayer->mEqualizer);
10354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
10364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize BassBoost
10379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (memcmp(SL_IID_BASSBOOST, &pAudioPlayer->mBassBoost.mBassBoostDescriptor.type,
10389cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            sizeof(effect_uuid_t)) == 0) {
10397e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize BassBoost for AudioPlayer=%p", pAudioPlayer);
10403d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_bb_init(pAudioPlayer->mSessionId, &pAudioPlayer->mBassBoost);
10419cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
10424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize Virtualizer
1043f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (memcmp(SL_IID_VIRTUALIZER, &pAudioPlayer->mVirtualizer.mVirtualizerDescriptor.type,
1044f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi               sizeof(effect_uuid_t)) == 0) {
10457e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        SL_LOGV("Need to initialize Virtualizer for AudioPlayer=%p", pAudioPlayer);
10463d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi        android_virt_init(pAudioPlayer->mSessionId, &pAudioPlayer->mVirtualizer);
1047f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
10487e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
10497e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // initialize EffectSend
10507e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME initialize EffectSend
105114e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
10524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1053a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi    return result;
1054a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi}
1055a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi
105648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi
105748913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi//-----------------------------------------------------------------------------
1058d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) {
10596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
10609ab6dd04be11483a9e8b58de91228b17b821eca4Jean-Michel Trivi    SL_LOGV("android_audioPlayer_destroy(%p)", pAudioPlayer);
10616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch (pAudioPlayer->mAndroidObjType) {
10626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    //-----------------------------------
10636a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // AudioTrack
10646a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case AUDIOTRACK_PULL:
10656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
106614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
10676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    //-----------------------------------
10686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    // MediaPlayer
10696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case MEDIAPLAYER:
1070a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten        // FIXME might no longer be needed since we call explicit destructor
1071ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi        if (pAudioPlayer->mSfPlayer != 0) {
1072de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi            pAudioPlayer->mSfPlayer.clear();
10736fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        }
10746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
107514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
10766a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
1077337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", pAudioPlayer->mAndroidObjType);
1078337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1079337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        break;
10806a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
10816a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
10824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (pAudioPlayer->mAudioTrack != NULL) {
10834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack->stop();
10844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        delete pAudioPlayer->mAudioTrack;
10854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        pAudioPlayer->mAudioTrack = NULL;
10864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
10874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1088a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // FIXME might not be needed
1089989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi    pAudioPlayer->mAndroidObjType = INVALID_TYPE;
1090989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi
1091a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // explicit destructor
1092a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    pAudioPlayer->mSfPlayer.~sp();
10934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
10940ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi    if (pAudioPlayer->mpLock != NULL) {
10950ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi        delete pAudioPlayer->mpLock;
10960ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi        pAudioPlayer->mpLock = NULL;
10970ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi    }
10980ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi
10996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    return result;
11006a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
11016a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
11026a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
11036a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
11048a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel TriviSLresult android_audioPlayer_setPlayRate(CAudioPlayer *ap, SLpermille rate, bool lockAP) {
1105497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
110624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    uint32_t contentRate = 0;
1107497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
11084614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case AUDIOTRACK_PULL:
11094614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case MEDIAPLAYER: {
1110497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        // get the content sample rate
11118a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        if (lockAP) { object_lock_shared(&ap->mObject); }
111224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        uint32_t contentRate = sles_to_android_sampleRate(ap->mSampleRateMilliHz);
11138a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        if (lockAP) { object_unlock_shared(&ap->mObject); }
1114497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        // apply the SL ES playback rate on the AudioTrack as a factor of its content sample rate
11154614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        if (ap->mAudioTrack != NULL) {
11164614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi            ap->mAudioTrack->setSampleRate(contentRate * (rate/1000.0f));
1117497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1118497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1119497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
11204614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
1121497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1122337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", ap->mAndroidObjType);
1123337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1124497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1125497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1126497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return result;
1127497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1128497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1129497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1130497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
1131497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held
113224430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_setPlaybackRateBehavior(CAudioPlayer *ap,
1133497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        SLuint32 constraints) {
1134497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
1135497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1136497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case AUDIOTRACK_PULL:
11374614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case MEDIAPLAYER:
1138497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        if (constraints != (constraints & SL_RATEPROP_NOPITCHCORAUDIO)) {
1139497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi            result = SL_RESULT_FEATURE_UNSUPPORTED;
1140497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        }
1141497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1142497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1143337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        SL_LOGE("Unexpected object type %d", ap->mAndroidObjType);
1144337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
1145497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1146497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1147497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return result;
1148497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1149497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1150497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1151497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
1152497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held
115324430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_getCapabilitiesOfRate(CAudioPlayer *ap,
1154497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        SLuint32 *pCapabilities) {
1155497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1156497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case AUDIOTRACK_PULL:
1157497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    case MEDIAPLAYER:
11584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        *pCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
1159497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1160497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    default:
1161497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        *pCapabilities = 0;
1162497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        break;
1163497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
1164497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return SL_RESULT_SUCCESS;
1165497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi}
1166497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1167497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi
1168497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//-----------------------------------------------------------------------------
11698a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivivoid android_audioPlayer_setPlayState(CAudioPlayer *ap, bool lockAP) {
11708a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
11718a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    if (lockAP) { object_lock_shared(&ap->mObject); }
11728a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    SLuint32 playState = ap->mPlay.mState;
11738a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    AndroidObject_state objState = ap->mAndroidObjState;
11748a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi    if (lockAP) { object_unlock_shared(&ap->mObject); }
11758a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi
117648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    switch(ap->mAndroidObjType) {
11771ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi    case AUDIOTRACK_PULL:
11788a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        switch (playState) {
117948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_STOPPED:
11803ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED");
11813ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11823ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->stop();
11833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
118448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
118548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_PAUSED:
11863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED");
11873ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11883ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->pause();
11893ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
119048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
119148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        case SL_PLAYSTATE_PLAYING:
11923ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING");
11933ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            if (NULL != ap->mAudioTrack) {
11943ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                ap->mAudioTrack->start();
11953ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            }
119648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi            break;
119748913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        default:
1198e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            // checked by caller, should not happen
1199e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            break;
120048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        }
120148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
120214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
120348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    case MEDIAPLAYER:
12048a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi        switch (playState) {
12051fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi        case SL_PLAYSTATE_STOPPED: {
12063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED");
120743e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            if (ap->mSfPlayer != 0) {
120843e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                ap->mSfPlayer->stop();
120943e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            }
12101fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi            } break;
121180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        case SL_PLAYSTATE_PAUSED: {
12123ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED");
12138a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi            switch(objState) {
121480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_UNINITIALIZED):
12158a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi                    sfplayer_prepare(ap, lockAP);
12163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
121780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_PREPARING):
121880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
121980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                case(ANDROID_READY):
122043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                    if (ap->mSfPlayer != 0) {
122143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                        ap->mSfPlayer->pause();
122243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi                    }
122380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
122480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                default:
122580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi                    break;
122680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            }
122780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            } break;
122880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi        case SL_PLAYSTATE_PLAYING: {
12293ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING");
12308a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi            switch(objState) {
12313ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_UNINITIALIZED):
12328a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi                    sfplayer_prepare(ap, lockAP);
12333ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    // fall through
12343ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_PREPARING):
12353ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                case(ANDROID_READY):
12363ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    if (ap->mSfPlayer != 0) {
12373ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                        ap->mSfPlayer->play();
12383ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    }
12393ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
12403ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                default:
12413ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi                    break;
124206a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi            }
124380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi            } break;
12443ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi
12456fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        default:
1246e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            // checked by caller, should not happen
1247e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            break;
12486fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi        }
124948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
125014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
125148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    default:
125248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi        break;
125348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi    }
125448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi}
125548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi
12566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
12576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
1258d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_useEventMask(CAudioPlayer *ap) {
1259e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    IPlay *pPlayItf = &ap->mPlay;
1260e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLuint32 eventFlags = pPlayItf->mEventFlags;
12614614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    /*switch(ap->mAndroidObjType) {
12624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    case AUDIOTRACK_PULL:*/
12634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (NULL == ap->mAudioTrack) {
1265e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        return;
12664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12684614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATMARKER) {
1269a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        ap->mAudioTrack->setMarkerPosition((uint32_t)((((int64_t)pPlayItf->mMarkerPosition
1270a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi                * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
12714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else {
12724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // clear marker
12734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        ap->mAudioTrack->setMarkerPosition(0);
12744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12764614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATNEWPOS) {
127749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten         ap->mAudioTrack->setPositionUpdatePeriod(
127849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                (uint32_t)((((int64_t)pPlayItf->mPositionUpdatePeriod
127949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten                * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
12804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    } else {
12814614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // clear periodic update
12824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        ap->mAudioTrack->setPositionUpdatePeriod(0);
12834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADATEND) {
1286e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // nothing to do for SL_PLAYEVENT_HEADATEND, callback event will be checked against mask
12876a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
12884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADMOVING) {
12904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        // FIXME support SL_PLAYEVENT_HEADMOVING
1291a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten        SL_LOGD("[ FIXME: IPlay_SetCallbackEventsMask(SL_PLAYEVENT_HEADMOVING) on an "
129249e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten            "SL_OBJECTID_AUDIOPLAYER to be implemented ]");
12934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    if (eventFlags & SL_PLAYEVENT_HEADSTALLED) {
1295e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi        // nothing to do for SL_PLAYEVENT_HEADSTALLED, callback event will be checked against mask
12964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi    }
12974614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi
12986a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
12996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13006a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13016a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//-----------------------------------------------------------------------------
1302d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_getDuration(IPlay *pPlayItf, SLmillisecond *pDurMsec) {
1303dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
1304dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    switch(ap->mAndroidObjType) {
1305dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    case AUDIOTRACK_PULL:
1306dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        *pDurMsec = SL_TIME_UNKNOWN;
1307dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        // FIXME if the data source is not a buffer queue, and the audio data is saved in
1308dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        //       shared memory with the mixer process, the duration is the size of the buffer
1309a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten        SL_LOGD("FIXME: android_audioPlayer_getDuration() verify if duration can be retrieved");
1310dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        break;
131114e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
1312de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    case MEDIAPLAYER: {
131343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        int64_t durationUsec = SL_TIME_UNKNOWN;
131443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
131543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            durationUsec = ap->mSfPlayer->getDurationUsec();
131643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pDurMsec = durationUsec == -1 ? SL_TIME_UNKNOWN : durationUsec / 1000;
131743e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
1318de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi        } break;
131914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
1320dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    default:
1321dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi        break;
1322dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    }
1323dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi    return SL_RESULT_SUCCESS;
1324dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi}
1325dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi
1326dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi
1327dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi//-----------------------------------------------------------------------------
1328d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_getPosition(IPlay *pPlayItf, SLmillisecond *pPosMsec) {
13296a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
13306a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    switch(ap->mAndroidObjType) {
13316a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case AUDIOTRACK_PULL:
13323ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi        if ((ap->mSampleRateMilliHz == 0) || (NULL == ap->mAudioTrack)) {
1333a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi            *pPosMsec = 0;
1334a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        } else {
13353ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            uint32_t positionInFrames;
13363ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi            ap->mAudioTrack->getPosition(&positionInFrames);
1337a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi            *pPosMsec = ((int64_t)positionInFrames * 1000) /
1338a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi                    sles_to_android_sampleRate(ap->mSampleRateMilliHz);
1339a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi        }
13406a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13416a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    case MEDIAPLAYER:
134243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
134343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pPosMsec = ap->mSfPlayer->getPositionMsec();
134443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        } else {
134543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            *pPosMsec = 0;
134643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
13476a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13486a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    default:
13496a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi        break;
13506a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
13516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
13526a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
13536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi
1354b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten//-----------------------------------------------------------------------------
135543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivivoid android_audioPlayer_seek(CAudioPlayer *ap, SLmillisecond posMsec) {
135643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi
135743e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi    switch(ap->mAndroidObjType) {
13586f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    case AUDIOTRACK_PULL:
13596f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
136014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT
13616f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    case MEDIAPLAYER:
136243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        if (ap->mSfPlayer != 0) {
136343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi            ap->mSfPlayer->seek(posMsec);
136443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi        }
13656f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
136614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif
13676f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    default:
13686f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi        break;
13696f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi    }
13703c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi}
13713c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
13723c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi
13733c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi//-----------------------------------------------------------------------------
1374d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivivoid android_audioPlayer_loop(CAudioPlayer *ap, SLboolean loopEnable) {
1375d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1376d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi    if ((MEDIAPLAYER == ap->mAndroidObjType) && (ap->mSfPlayer != 0)) {
1377d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi        ap->mSfPlayer->loop((bool)loopEnable);
1378d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi    }
1379d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi}
1380d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1381d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi
1382d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi//-----------------------------------------------------------------------------
1383e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*
1384e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Mutes or unmutes the Android media framework object associated with the CAudioPlayer that carries
1385e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * the IVolume interface.
1386e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Pre-condition:
1387e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten *   if ap->mMute is SL_BOOLEAN_FALSE, a call to this function was preceded by a call
1388d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi *   to android_audioPlayer_volumeUpdate()
1389e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */
1390d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_setMute(CAudioPlayer* ap) {
1391de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    android::AudioTrack *t = NULL;
1392b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    switch(ap->mAndroidObjType) {
1393b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    case AUDIOTRACK_PULL:
1394b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    case MEDIAPLAYER:
13954614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi        t = ap->mAudioTrack;
1396b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi        break;
1397b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi    default:
1398b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi        break;
13996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    }
1400de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    // when unmuting: volume levels have already been updated in IVolume_SetMute
1401de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    if (NULL != t) {
1402e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        t->mute(ap->mMute);
1403de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi    }
1404e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten}
1405e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1406e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
1407e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten//-----------------------------------------------------------------------------
1408d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_volumeUpdate(CAudioPlayer* ap) {
1409d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi    android_audioPlayer_updateStereoVolume(ap);
1410d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi    android_audioPlayer_setMute(ap);
14116a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi    return SL_RESULT_SUCCESS;
14126a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi}
14134b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten//-----------------------------------------------------------------------------
14160ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivivoid android_audioPlayer_bufferQueue_onRefilled(CAudioPlayer *ap) {
1417a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // the AudioTrack associated with the AudioPlayer receiving audio from a PCM buffer
1418a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // queue was stopped when the queue become empty, we restart as soon as a new buffer
1419a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // has been enqueued since we're in playing state
1420b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi    if (NULL != ap->mAudioTrack) {
1421b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi        ap->mAudioTrack->start();
1422b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi    }
1423a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi
1424a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // when the queue became empty, an underflow on the prefetch status itf was sent. Now the queue
1425a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    // has received new data, signal it has sufficient data
1426a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) {
1427fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_SUFFICIENTDATA,
1428fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten            true);
1429a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi    }
1430b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi}
1431b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1432b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1433b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi//-----------------------------------------------------------------------------
14344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/*
14354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * BufferQueue::Clear
14364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten */
14370ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel TriviSLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *ap) {
14384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    SLresult result = SL_RESULT_SUCCESS;
14394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14400ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi    switch (ap->mAndroidObjType) {
14414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    //-----------------------------------
14424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // AudioTrack
14434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    case AUDIOTRACK_PULL:
14440ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi        if (NULL != ap->mAudioTrack) {
14450ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi            ap->mAudioTrack->flush();
14460ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi        }
14474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        break;
14484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    default:
14494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        result = SL_RESULT_INTERNAL_ERROR;
14504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        break;
14514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    }
14524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
14534b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    return result;
14544b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten}
1455b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi
1456