AudioPlayer_to_android.cpp revision 13837cf3f7be0eb8b1a9552bd99a89f98c987720
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//----------------------------------------------------------------------------- 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// FIXME this method will be absorbed into android_audioPlayer_setPlayState() once 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// bufferqueue and uri/fd playback are moved under the GenericPlayer C++ object 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviSLresult aplayer_setPlayState(const android::sp<android::GenericPlayer> &ap, SLuint32 playState, 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_state* pObjState) { 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_state objState = *pObjState; 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (playState) { 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_STOPPED: 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_STOPPED"); 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->stop(); 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_PAUSED: 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PAUSED"); 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch(objState) { 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *pObjState = ANDROID_PREPARING; 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->prepare(); 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->pause(); 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState); 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_PLAYING: { 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PLAYING"); 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch(objState) { 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *pObjState = ANDROID_PREPARING; 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->prepare(); 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // intended fall through 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // intended fall through 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->play(); 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState); 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // checked by caller, should not happen 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_SHOULDNT_BE_HERE_S, "aplayer_setPlayState"); 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return result; 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Callback associated with a AudioToCbRenderer of an SL ES AudioPlayer that gets its data 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// from a URI or FD, to write the decoded audio data to a buffer queue 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatic size_t adecoder_writeToBufferQueue(const uint8_t *data, size_t size, void* user) { 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t sizeConsumed = 0; 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == user) { 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return sizeConsumed; 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("received %d bytes from decoder", size); 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi slBufferQueueCallback callback = NULL; 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void * callbackPContext = NULL; 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // push decoded data to the buffer queue 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ap->mBufferQueue.mState.count != 0) { 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear); 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi BufferHeader *oldFront = ap->mBufferQueue.mFront; 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi BufferHeader *newFront = &oldFront[1]; 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi uint8_t *pDest = (uint8_t *)oldFront->mBuffer + ap->mBufferQueue.mSizeConsumed; 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ap->mBufferQueue.mSizeConsumed + size < oldFront->mSize) { 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // room to consume the whole or rest of the decoded data in one shot 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mSizeConsumed += size; 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // consume data but no callback to the BufferQueue interface here 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi memcpy (pDest, data, size); 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = size; 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // push as much as possible of the decoded data into the buffer queue 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = oldFront->mSize - ap->mBufferQueue.mSizeConsumed; 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // the buffer at the head of the buffer queue is full, update the state 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mSizeConsumed = 0; 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (newFront == &ap->mBufferQueue.mArray[ap->mBufferQueue.mNumBuffers + 1]) { 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi newFront = ap->mBufferQueue.mArray; 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mFront = newFront; 12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mState.count--; 12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mState.playIndex++; 12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // consume data 12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi memcpy (pDest, data, sizeConsumed); 13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // data has been copied to the buffer, and the buffer queue state has been updated 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // we will notify the client if applicable 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi callback = ap->mBufferQueue.mCallback; 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // save callback data 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi callbackPContext = ap->mBufferQueue.mContext; 13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // no available buffers in the queue to write the decoded data 13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = 0; 14013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 14113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 14313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // notify client 14413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != callback) { 14513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (*callback)(&ap->mBufferQueue.mItf, callbackPContext); 14613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return sizeConsumed; 14913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 152a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Triviint android_getMinFrameCount(uint32_t sampleRate) { 153a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi int afSampleRate; 154a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputSamplingRate(&afSampleRate, 155a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 156a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 157a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 158a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi int afFrameCount; 159a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputFrameCount(&afFrameCount, 160a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 161a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 162a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 163a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t afLatency; 164a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputLatency(&afLatency, 165a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 166a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 167a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 168a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // minimum nb of buffers to cover output latency, given the size of each hardware audio buffer 169a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate); 170a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (minBufCount < 2) minBufCount = 2; 171a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // minimum number of frames to cover output latency at the sample rate of the content 172a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return (afFrameCount*sampleRate*minBufCount)/afSampleRate; 1736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 1746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 175712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi 176712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//----------------------------------------------------------------------------- 1771fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define LEFT_CHANNEL_MASK 0x1 << 0 1781fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define RIGHT_CHANNEL_MASK 0x1 << 1 1796a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 180d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_updateStereoVolume(CAudioPlayer* ap) { 1816a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float leftVol = 1.0f, rightVol = 1.0f; 1826a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL == ap->mAudioTrack) { 1844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi return; 18545d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi } 1861fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // should not be used when muted 1871fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (SL_BOOLEAN_TRUE == ap->mMute) { 1881fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi return; 1891fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 1904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1911fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi int channelCount = ap->mNumChannels; 1921fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 1931fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // mute has priority over solo 1941fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi int leftAudibilityFactor = 1, rightAudibilityFactor = 1; 1951fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 196e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (channelCount >= STEREO_CHANNELS) { 197b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mMuteMask & LEFT_CHANNEL_MASK) { 1981fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left muted 1991fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 0; 2001fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2011fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left not muted 202b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & LEFT_CHANNEL_MASK) { 2031fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left soloed 2041fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 1; 2051fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2061fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left not soloed 207b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & RIGHT_CHANNEL_MASK) { 2081fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right solo silences left 2091fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 0; 2101fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2111fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left and right are not soloed, and left is not muted 2121fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 1; 2131fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2141fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2151fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2161fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 217b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mMuteMask & RIGHT_CHANNEL_MASK) { 2181fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right muted 2191fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 0; 2201fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2211fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right not muted 222b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & RIGHT_CHANNEL_MASK) { 2231fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right soloed 2241fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 1; 2251fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2261fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right not soloed 227b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & LEFT_CHANNEL_MASK) { 2281fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left solo silences right 2291fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 0; 2301fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2311fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left and right are not soloed, and right is not muted 2321fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 1; 2331fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2341fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2351fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2361fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2376a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 2386a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // compute amplification as the combination of volume level and stereo position 239172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi // amplification from volume level 240172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi ap->mAmplFromVolLevel = sles_to_android_amplification(ap->mVolume.mLevel); 241ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf) 242172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi leftVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel; 243172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi rightVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel; 244a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 245f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // amplification from stereo position 2461fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (ap->mVolume.mEnableStereoPosition) { 247f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // panning law depends on number of channels of content: stereo panning vs 2ch. balance 24845d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi if(1 == channelCount) { 249f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // stereo panning 2501fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi double theta = (1000+ap->mVolume.mStereoPosition)*M_PI_4/1000.0f; // 0 <= theta <= Pi/2 251e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = cos(theta); 252e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = sin(theta); 253f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } else { 254f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // stereo balance 2551fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (ap->mVolume.mStereoPosition > 0) { 256e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = (1000-ap->mVolume.mStereoPosition)/1000.0f; 257e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = 1.0f; 2586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } else { 259e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = 1.0f; 260e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = (1000+ap->mVolume.mStereoPosition)/1000.0f; 2616a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 2626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 263e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten leftVol *= ap->mAmplFromStereoPos[0]; 264e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten rightVol *= ap->mAmplFromStereoPos[1]; 265f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 266f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 2671fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi ap->mAudioTrack->setVolume(leftVol * leftAudibilityFactor, rightVol * rightAudibilityFactor); 268ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi 269ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // changes in the AudioPlayer volume must be reflected in the send level: 270ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // in SLEffectSendItf or in SLAndroidEffectSendItf? 271ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // FIXME replace interface test by an internal API once we have one. 272ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi if (NULL != ap->mEffectSend.mItf) { 273ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi for (unsigned int i=0 ; i<AUX_MAX ; i++) { 274ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi if (ap->mEffectSend.mEnableLevels[i].mEnable) { 275ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi android_fxSend_setSendLevel(ap, 276ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi ap->mEffectSend.mEnableLevels[i].mSendLevel + ap->mVolume.mLevel); 277ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // there's a single aux bus on Android, so we can stop looking once the first 278ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // aux effect is found. 279ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi break; 280ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 281ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 282ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } else if (NULL != ap->mAndroidEffectSend.mItf) { 283ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi android_fxSend_setSendLevel(ap, ap->mAndroidEffectSend.mSendLevel + ap->mVolume.mLevel); 284ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 2854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 2864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 288e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleMarker_lockPlay(CAudioPlayer* ap) { 28949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MARKER from AudioTrack"); 2904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 2914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 2924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 2944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 2954614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 2964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 2974614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2984614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL != callback) { 2994614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // getting this event implies SL_PLAYEVENT_HEADATMARKER was set in the event mask 3004614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATMARKER); 3014614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 3024614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 3034614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 305e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap) { 30649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_NEW_POS from AudioTrack"); 3074614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 3084614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 3094614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3104614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 3114614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 3124614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 3134614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 3144614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3154614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL != callback) { 3164614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // getting this event implies SL_PLAYEVENT_HEADATNEWPOS was set in the event mask 3174614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATNEWPOS); 3184614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 3194614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 3204614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3214614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3224614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 323e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap) { 3244614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 3254614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 3264614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3274614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 3284614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 3294614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 3304614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi bool headStalled = (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADSTALLED) != 0; 3314614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 3324614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3334614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if ((NULL != callback) && headStalled) { 3344614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADSTALLED); 335f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 336f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} 337f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 33824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 339e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi//----------------------------------------------------------------------------- 340e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi/** 341e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * post-condition: play state of AudioPlayer is SL_PLAYSTATE_PAUSED if setPlayStateToPaused is true 342e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * 343e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * note: a conditional flag, setPlayStateToPaused, is used here to specify whether the play state 344e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * needs to be changed when the player reaches the end of the content to play. This is 345e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * relative to what the specification describes for buffer queues vs the 346e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * SL_PLAYEVENT_HEADATEND event. In the OpenSL ES specification 1.0.1: 347e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * - section 8.12 SLBufferQueueItf states "In the case of starvation due to insufficient 348e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * buffers in the queue, the playing of audio data stops. The player remains in the 349e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * SL_PLAYSTATE_PLAYING state." 350e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * - section 9.2.31 SL_PLAYEVENT states "SL_PLAYEVENT_HEADATEND Playback head is at the end 351e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * of the current content and the player has paused." 352e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi */ 353fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayStateToPaused, 354fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten bool needToLock) { 35525d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi //SL_LOGV("ap=%p, setPlayStateToPaused=%d, needToLock=%d", ap, setPlayStateToPaused, 35625d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi // needToLock); 357e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi slPlayCallback playCallback = NULL; 358e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi void * playContext = NULL; 359e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // SLPlayItf callback or no callback? 360fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 361ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi interface_lock_exclusive(&ap->mPlay); 362fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 363e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) { 364e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi playCallback = ap->mPlay.mCallback; 365e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi playContext = ap->mPlay.mContext; 366e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } 36725d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi if (setPlayStateToPaused) { 368ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi ap->mPlay.mState = SL_PLAYSTATE_PAUSED; 369ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi } 370ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi if (needToLock) { 371ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi interface_unlock_exclusive(&ap->mPlay); 372fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 373e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // callback with no lock held 374e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (NULL != playCallback) { 375e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND); 376e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } 37725d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi 378e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi} 379e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 380a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 381a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi//----------------------------------------------------------------------------- 382a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi/** 383a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * pre-condition: AudioPlayer has SLPrefetchStatusItf initialized 384a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * post-condition: 385a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * - ap->mPrefetchStatus.mStatus == status 386a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * - the prefetch status callback, if any, has been notified if a change occurred 387a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * 388a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi */ 389fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_prefetchStatus_lockPrefetch(CAudioPlayer *ap, SLuint32 status, 390fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten bool needToLock) { 391a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi slPrefetchCallback prefetchCallback = NULL; 392a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi void * prefetchContext = NULL; 393a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 394fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 395fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten interface_lock_exclusive(&ap->mPrefetchStatus); 396fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 397a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // status change? 398a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (ap->mPrefetchStatus.mStatus != status) { 399a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = status; 400a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // callback or no callback? 401a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) { 402a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi prefetchCallback = ap->mPrefetchStatus.mCallback; 403a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi prefetchContext = ap->mPrefetchStatus.mContext; 404a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 405a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 406fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 407fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten interface_unlock_exclusive(&ap->mPrefetchStatus); 408fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 409a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 410a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // callback with no lock held 411a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (NULL != prefetchCallback) { 412a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext, status); 413a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 414a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi} 415a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 416a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 417f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi//----------------------------------------------------------------------------- 41875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_setStreamType(CAudioPlayer* ap, SLint32 type) { 41975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 42075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGV("type %ld", type); 42175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 42275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi int newStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 42375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi switch(type) { 42475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_VOICE: 42575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::VOICE_CALL; 42675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 42775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_SYSTEM: 42875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::SYSTEM; 42975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_RING: 43175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::RING; 43275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_MEDIA: 43475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::MUSIC; 43575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_ALARM: 43775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::ALARM; 43875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_NOTIFICATION: 44075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::NOTIFICATION; 44175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 44275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi default: 44375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_PLAYERSTREAMTYPE_SET_UNKNOWN_TYPE); 44475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 44575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 44675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 44775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 44875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type needs to be set before the object is realized 44975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // (ap->mAudioTrack is supposed to be NULL until then) 4505f71e35da153d194d805e030ab38935599e065d2Jean-Michel Trivi if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) { 45175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_PLAYERSTREAMTYPE_REALIZED); 45275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PRECONDITIONS_VIOLATED; 45375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 45475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi ap->mStreamType = newStreamType; 45575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 45675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 45775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 45875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 45975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 46275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_getStreamType(CAudioPlayer* ap, SLint32 *pType) { 46375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 46475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi switch(ap->mStreamType) { 46675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::VOICE_CALL: 46775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_VOICE; 46875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 46975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::SYSTEM: 47075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_SYSTEM; 47175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::RING: 47375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_RING; 47475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::DEFAULT: 47675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::MUSIC: 47775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_MEDIA; 47875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::ALARM: 48075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_ALARM; 48175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::NOTIFICATION: 48375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_NOTIFICATION; 48475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi default: 48675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 48775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_MEDIA; 48875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 49075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 49275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 49375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 496f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivivoid audioPlayer_auxEffectUpdate(CAudioPlayer* ap) { 497f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi if ((NULL != ap->mAudioTrack) && (ap->mAuxEffect != 0)) { 498f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi android_fxSend_attach(ap, true, ap->mAuxEffect, ap->mVolume.mLevel + ap->mAuxSendLevel); 499f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi } 500f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi} 501f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi 502f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi 503f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi//----------------------------------------------------------------------------- 50413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid audioPlayer_setInvalid(CAudioPlayer* ap) { 50513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mAndroidObjType = INVALID_TYPE; 50613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mpLock = NULL; 50713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mPlaybackRate.mCapabilities = 0; 50813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 50913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 51013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 51113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 51213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 51313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * returns true if the given data sink is supported by AudioPlayer that don't 51413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * play to an OutputMix object, false otherwise 51513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 51613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * pre-condition: the locator of the audio sink is not SL_DATALOCATOR_OUTPUTMIX 51713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 51813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivibool audioPlayer_isSupportedNonOutputMixSink(const SLDataSink* pAudioSink) { 51913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool result = true; 52013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSink->pLocator; 52113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSink->pFormat; 52213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 52313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sinkLocatorType) { 52413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 52513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 52613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 52713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (SL_DATAFORMAT_PCM != sinkFormatType) { 52813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Unsupported sink format 0x%x, expected SL_DATAFORMAT_PCM", 52913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sinkFormatType); 53013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = false; 53113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 53213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // it's no use checking the PCM format fields because additional characteristics 53313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // such as the number of channels, or sample size are unknown to the player at this stage 53413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 53513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 53613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 53713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Unsupported sink locator type 0x%x", (unsigned)sinkLocatorType); 53813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = false; 53913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 54013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 54113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return result; 54313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 54413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 54713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 54813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * returns the Android object type if the locator type combinations for the source and sinks 54913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * are supported by this implementation, INVALID_TYPE otherwise 55013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 55113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAndroidObject_type audioPlayer_getAndroidObjectTypeForSourceSink(CAudioPlayer *ap) { 55213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 55313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSource *pAudioSrc = &ap->mDataSource.u.mSource; 55413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSink *pAudioSnk = &ap->mDataSink.u.mSink; 55513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator; 55613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 55713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_type type = INVALID_TYPE; 55813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 55913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //-------------------------------------- 56013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Sink / source matching check: 56113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // the following source / sink combinations are supported 56213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_BUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_OUTPUTMIX 56513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_OUTPUTMIX 56613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDBUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_BUFFERQUEUE 56813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_BUFFERQUEUE 56913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 57013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 57113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sinkLocatorType) { 57213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 57313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_OUTPUTMIX: { 57413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 57513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 57613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Buffer Queue to AudioTrack 57713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 57813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 57913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_PCM_BQ; 58013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 58113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 58213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // URI or FD to MediaPlayer 58313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 58413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 58513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_URIFD; 58613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 58713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 58813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Android BufferQueue to MediaPlayer (shared memory streaming) 58913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: 59013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_TS_ABQ; 59113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 59213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 59313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 59413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_OUTPUTMIX sink", 59513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sourceLocatorType); 59613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 59713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 59813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 59913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 60013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 60113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 60213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 60313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 60413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 60513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // URI or FD decoded to PCM in a buffer queue 60613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 60713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 60813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_URIFD_ASQ; 60913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 61113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 61213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_BUFFERQUEUE sink", 61313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sourceLocatorType); 61413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 61613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 61813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 61913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Sink data locator 0x%x not supported", (unsigned)sinkLocatorType); 62013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 62113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 62213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return type; 62413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 62513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 6288a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivistatic void sfplayer_prepare(CAudioPlayer *ap, bool lockAP) { 6298a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 6308a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_exclusive(&ap->mObject); } 6318a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi ap->mAndroidObjState = ANDROID_PREPARING; 6328a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_exclusive(&ap->mObject); } 6338a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 6343ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (ap->mSfPlayer != 0) { 6353ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSfPlayer->prepare(); 6363ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 6373ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi} 6383ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 6393ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi//----------------------------------------------------------------------------- 640de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi// Callback associated with an SfPlayer of an SL ES AudioPlayer that gets its data 6413ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi// from a URI or FD, for prepare and prefetch events 64213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatic void sfplayer_handlePrefetchEvent(int event, int data1, void* user) { 643de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (NULL == user) { 644de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi return; 645de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 646f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 647de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 64824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi //SL_LOGV("received event %d, data %d from SfAudioPlayer", event, data1); 649de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi switch(event) { 650f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 65113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AVPlayer::kEventPrepared: { 6523ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 653581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi if (PLAYER_SUCCESS != data1) { 654f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 655f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 6563ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack = NULL; 6573ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mNumChannels = 0; 6583ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSampleRateMilliHz = 0; 6593ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAndroidObjState = ANDROID_UNINITIALIZED; 6603ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 661f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 662f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 663f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // SfPlayer prepare() failed prefetching, there is no event in SLPrefetchStatus to 664f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // indicate a prefetch error, so we signal it by sending simulataneously two events: 665f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // - SL_PREFETCHEVENT_FILLLEVELCHANGE with a level of 0 666f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // - SL_PREFETCHEVENT_STATUSCHANGE with a status of SL_PREFETCHSTATUS_UNDERFLOW 667f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi SL_LOGE(ERROR_PLAYER_PREFETCH_d, data1); 668f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 669f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi break; 670f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 671f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 672f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi slPrefetchCallback callback = NULL; 673f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi void* callbackPContext = NULL; 674f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 675f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi interface_lock_exclusive(&ap->mPrefetchStatus); 676f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 0; 677f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW; 678f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if ((ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) 679f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi && (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE)) { 680f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 681f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 682f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 683f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi interface_unlock_exclusive(&ap->mPrefetchStatus); 684f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 685f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // callback with no lock held 686f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if (NULL != callback) { 687f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, 688f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE); 689f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 690f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 691f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 6923ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } else { 693f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 694f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 695b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi if (A_PLR_URIFD == ap->mAndroidObjType) { 696581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mAudioTrack = ap->mSfPlayer->getAudioTrack(); 697581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mNumChannels = ap->mSfPlayer->getNumChannels(); 698581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mSampleRateMilliHz = 699581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz()); 700581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mSfPlayer->startPrefetch_async(); 701581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi // update the new track with the current settings 702581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi audioPlayer_auxEffectUpdate(ap); 703581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_useEventMask(ap); 704581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_volumeUpdate(ap); 705581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate, false /*lockAP*/); 70613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (A_PLR_PCM_BQ == ap->mAndroidObjType) { 70713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ((android::AudioToCbRenderer*)ap->mAPlayer.get())->startPrefetch_async(); 70813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (A_PLR_TS_ABQ == ap->mAndroidObjType) { 709581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi SL_LOGI("Received SfPlayer::kEventPrepared from AVPlayer for CAudioPlayer %p", ap); 710581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi } 71124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 7123ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAndroidObjState = ANDROID_READY; 713f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 714f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 7153ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 7163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 71713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 71813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7193ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 72013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventNewAudioTrack: { 7215d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi object_lock_exclusive(&ap->mObject); 72296ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#if 1 72396ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // SfPlayer has a new AudioTrack, update our pointer copy and configure the new one before 72496ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // starting to use it 72596ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#else 7265d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // SfPlayer has a new AudioTrack, delete the old one and configure the new one before 7275d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // starting to use it 7285d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7295d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi if (NULL != ap->mAudioTrack) { 7305d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi delete ap->mAudioTrack; 7315d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mAudioTrack = NULL; 7325d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi } 73396ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#endif 7345d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mAudioTrack = ap->mSfPlayer->getAudioTrack(); 7355d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mNumChannels = ap->mSfPlayer->getNumChannels(); 7365d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mSampleRateMilliHz = android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz()); 7375d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7385d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // update the new track with the current settings 7395d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi audioPlayer_auxEffectUpdate(ap); 7405d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_useEventMask(ap); 7415d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_volumeUpdate(ap); 7425d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate, false /*lockAP*/); 7435d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7445d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi object_unlock_exclusive(&ap->mObject); 74513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 74613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7475d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 74813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventPrefetchFillLevelUpdate : { 749a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 750a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi break; 751a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 752ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi slPrefetchCallback callback = NULL; 753ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi void* callbackPContext = NULL; 7548a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 755ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi // SLPrefetchStatusItf callback or no callback? 756ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi interface_lock_exclusive(&ap->mPrefetchStatus); 757ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) { 758ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 759ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 760ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi } 761ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi ap->mPrefetchStatus.mLevel = (SLpermille)data1; 762ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi interface_unlock_exclusive(&ap->mPrefetchStatus); 7638a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 764ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi // callback with no lock held 765ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi if (NULL != callback) { 766ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, 767ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE); 768ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi } 76913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 77013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 771de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 77213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventPrefetchStatusChange: { 773a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 774a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi break; 775a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 77606a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi slPrefetchCallback callback = NULL; 777de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi void* callbackPContext = NULL; 7788a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 779de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // SLPrefetchStatusItf callback or no callback? 7808a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 781de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) { 782de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 783de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 784de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 7854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (data1 >= android::SfPlayer::kStatusIntermediate) { 786de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA; 7874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME estimate fill level better? 7884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 1000; 7894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAndroidObjState = ANDROID_READY; 7904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else if (data1 < android::SfPlayer::kStatusIntermediate) { 791de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW; 7924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME estimate fill level better? 7934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 0; 794de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 7958a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 7968a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 797de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // callback with no lock held 79806a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi if (NULL != callback) { 799de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, SL_PREFETCHEVENT_STATUSCHANGE); 80006a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi } 80113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 80213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 803de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 80413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventEndOfStream: { 805fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_headAtEnd_lockPlay(ap, true /*set state to paused?*/, true); 80624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if ((NULL != ap->mAudioTrack) && (!ap->mSeek.mLoopEnabled)) { 8073ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->stop(); 8083ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 80913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 81013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 811de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 8126a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 8136a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 8146a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 815a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi} 816a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 81775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 818a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 819d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_checkSourceSink(CAudioPlayer *pAudioPlayer) 820c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi{ 82113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // verify that the locator types for the source / sink combination is supported 82213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAndroidObjType = audioPlayer_getAndroidObjectTypeForSourceSink(pAudioPlayer); 82313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (INVALID_TYPE == pAudioPlayer->mAndroidObjType) { 824c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 825c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 826c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 82713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource; 82813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink; 8294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 83013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // format check: 83113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator; 83213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 83313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceFormatType = *(SLuint32 *)pAudioSrc->pFormat; 83413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat; 83513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 83613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 837c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi //------------------ 838c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Buffer Queues 83901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_BUFFERQUEUE: 84001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 84101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten { 842c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLDataLocator_BufferQueue *dl_bq = (SLDataLocator_BufferQueue *) pAudioSrc->pLocator; 8434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 844c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Buffer format 84513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 846a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // currently only PCM buffer queues are supported, 847c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATAFORMAT_PCM: { 848c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) pAudioSrc->pFormat; 849c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->numChannels) { 850c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 1: 851c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 2: 852c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 853c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 8544b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // this should have already been rejected by checkDataFormat 8554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SL_LOGE("Cannot create audio player: unsupported " \ 8564b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten "PCM data source with %u channels", (unsigned) df_pcm->numChannels); 857c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 858c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 859c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->samplesPerSec) { 860c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_8: 861c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_11_025: 862c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_12: 863c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_16: 864c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_22_05: 865c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_24: 866c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_32: 867c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_44_1: 8680d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten case SL_SAMPLINGRATE_48: 869c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 8704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_64: 8714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_88_2: 8724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_96: 8734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_192: 874c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 87549e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten SL_LOGE("Cannot create audio player: unsupported sample rate %u milliHz", 87649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten (unsigned) df_pcm->samplesPerSec); 877c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 878c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 879c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->bitsPerSample) { 880c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_PCMSAMPLEFORMAT_FIXED_8: 881337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten // FIXME We should support this 8820d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten //SL_LOGE("Cannot create audio player: unsupported 8-bit data"); 8830d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten //return SL_RESULT_CONTENT_UNSUPPORTED; 884c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_PCMSAMPLEFORMAT_FIXED_16: 885c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 886c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // others 887c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 8884b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // this should have already been rejected by checkDataFormat 8894b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SL_LOGE("Cannot create audio player: unsupported sample bit depth %lu", 890c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi (SLuint32)df_pcm->bitsPerSample); 891c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 892c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 893c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->containerSize) { 8940d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten case 8: 895c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 16: 896c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 897c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // others 898c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 899337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported container size %u", 900337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten (unsigned) df_pcm->containerSize); 901c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 902c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 903c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->channelMask) { 904c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // FIXME needs work 905c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 906c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 907c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 908c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->endianness) { 909c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_BYTEORDER_LITTLEENDIAN: 910c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 9114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_BYTEORDER_BIGENDIAN: 912337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported big-endian byte order"); 9134b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten return SL_RESULT_CONTENT_UNSUPPORTED; 9144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // native is proposed but not yet in spec 915c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 916337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported byte order %u", 917337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten (unsigned) df_pcm->endianness); 918c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 919c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 920c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } //case SL_DATAFORMAT_PCM 921c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 922c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATAFORMAT_MIME: 9238b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 92401e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten SL_LOGE("Cannot create audio player with buffer queue data source " 92549e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "without SL_DATAFORMAT_PCM format"); 926c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 927c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 9288b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten // invalid data format is detected earlier 9298b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten assert(false); 9308b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten return SL_RESULT_INTERNAL_ERROR; 93113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 93201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten } // case SL_DATALOCATOR_BUFFERQUEUE or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 933c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 934c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi //------------------ 9356fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi // URI 9366fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi case SL_DATALOCATOR_URI: 9376fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi { 938989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_URI *dl_uri = (SLDataLocator_URI *) pAudioSrc->pLocator; 939989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (NULL == dl_uri->URI) { 940989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 941989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 942989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // URI format 94313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 944989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_MIME: 945989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 946989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_PCM: 9478b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 948337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player with SL_DATALOCATOR_URI data source without " 94949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "SL_DATAFORMAT_MIME format"); 950989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 95113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 95213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoding format check 95313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) && 95413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) { 95513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 95613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 9576fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi } // case SL_DATALOCATOR_URI 9586fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi break; 9596fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi //------------------ 960989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // File Descriptor 961989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 962989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi { 963989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // fd is already non null 96413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 965989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_MIME: 966989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 967989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_PCM: 968989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // FIXME implement 969a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("[ FIXME implement PCM FD data sources ]"); 970989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 9718b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 972337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player with SL_DATALOCATOR_ANDROIDFD data source " 97349e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "without SL_DATAFORMAT_MIME or SL_DATAFORMAT_PCM format"); 974989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 9758b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten default: 9768b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten // invalid data format is detected earlier 9778b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten assert(false); 9788b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten return SL_RESULT_INTERNAL_ERROR; 97913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 98013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) && 98113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) { 98213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 98313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 984989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } // case SL_DATALOCATOR_ANDROIDFD 985989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 986989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi //------------------ 987fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi // Stream 988fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: 989fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi { 990fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi } // case SL_DATALOCATOR_ANDROIDBUFFERQUEUE 991fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi break; 992fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //------------------ 993c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Address 994c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_ADDRESS: 995c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_IODEVICE: 996c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_OUTPUTMIX: 9978b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATALOCATOR_NATIVEDISPLAY: 998c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_MIDIBUFFERQUEUE: 99913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Cannot create audio player with data locator type 0x%x", 100013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned) sourceLocatorType); 1001c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 1002c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 1003fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi SL_LOGE("Cannot create audio player with invalid data locator type 0x%x", 100413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned) sourceLocatorType); 1005c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 1006c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi }// switch (locatorType) 1007c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 1008c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_SUCCESS; 1009c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi} 1010c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 1011773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 10124614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 10134614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 1014d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void audioTrack_callBack_uri(int event, void* user, void *info) { 10154614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // EVENT_MORE_DATA needs to be handled with priority over the other events 10164614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // because it will be called the most often during playback 10174614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (event == android::AudioTrack::EVENT_MORE_DATA) { 101849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack"); 10194614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // set size to 0 to signal we're not using the callback to write more data 10204614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info; 10214614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi pBuff->size = 0; 10224614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else if (NULL != user) { 10234614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi switch (event) { 102413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MARKER : 1025e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleMarker_lockPlay((CAudioPlayer *)user); 10264614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 102713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_NEW_POS : 1028e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleNewPos_lockPlay((CAudioPlayer *)user); 10294614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 103013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_UNDERRUN : 1031e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleUnderrun_lockPlay((CAudioPlayer *)user); 1032b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi break; 103313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_BUFFER_END : 103413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_LOOP_END : 103549023a839764adf67f0304e6f622d814b1729bd5Jean-Michel Trivi break; 1036e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi default: 1037e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event, 1038e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (CAudioPlayer *)user); 1039e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi break; 10404614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 10414614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 10424614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 10434614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1044a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 10451ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// Callback associated with an AudioTrack of an SL ES AudioPlayer that gets its data 10461ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// from a buffer queue. 1047a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void audioTrack_callBack_pullFromBuffQueue(int event, void* user, void *info) { 1048e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 10498f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi void * callbackPContext = NULL; 10506a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch(event) { 10516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 105213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MORE_DATA: { 105349e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack"); 10543a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten slBufferQueueCallback callback = NULL; 10551ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info; 10561ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // retrieve data from the buffer queue 1057e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi interface_lock_exclusive(&ap->mBufferQueue); 1058e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mBufferQueue.mState.count != 0) { 1059e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi //SL_LOGV("nbBuffers in queue = %lu",ap->mBufferQueue.mState.count); 1060e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear); 10611ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 1062e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi BufferHeader *oldFront = ap->mBufferQueue.mFront; 1063d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *newFront = &oldFront[1]; 10641ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10651ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // FIXME handle 8bit based on buffer format 10661ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi short *pSrc = (short*)((char *)oldFront->mBuffer 1067e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi + ap->mBufferQueue.mSizeConsumed); 1068e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mBufferQueue.mSizeConsumed + pBuff->size < oldFront->mSize) { 10691ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // can't consume the whole or rest of the buffer in one shot 1070e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mSizeConsumed += pBuff->size; 10711ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // leave pBuff->size untouched 10721ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // consume data 10733a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // FIXME can we avoid holding the lock during the copy? 10741ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi memcpy (pBuff->i16, pSrc, pBuff->size); 10751ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } else { 10761ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // finish consuming the buffer or consume the buffer in one shot 1077e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi pBuff->size = oldFront->mSize - ap->mBufferQueue.mSizeConsumed; 1078e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mSizeConsumed = 0; 10791ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10801ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi if (newFront == 1081e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi &ap->mBufferQueue.mArray 1082e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi [ap->mBufferQueue.mNumBuffers + 1]) 10831ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi { 1084e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi newFront = ap->mBufferQueue.mArray; 10851ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1086e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mFront = newFront; 10871ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 1088e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mState.count--; 1089e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mState.playIndex++; 10901ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10911ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // consume data 10923a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // FIXME can we avoid holding the lock during the copy? 10931ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi memcpy (pBuff->i16, pSrc, pBuff->size); 10941ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10951ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // data has been consumed, and the buffer queue state has been updated 109606a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi // we will notify the client if applicable 1097e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi callback = ap->mBufferQueue.mCallback; 10983a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // save callback data 1099e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi callbackPContext = ap->mBufferQueue.mContext; 11001ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1101e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } else { // empty queue 1102e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // signal no data available 11031ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi pBuff->size = 0; 1104e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 1105e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // signal we're at the end of the content, but don't pause (see note in function) 1106fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_headAtEnd_lockPlay(ap, false /*set state to paused?*/, false); 1107e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 1108a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // signal underflow to prefetch status itf 1109a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 1110fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_UNDERFLOW, 1111fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten false); 1112a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 1113a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 1114e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // stop the track so it restarts playing faster when new data is enqueued 1115e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mAudioTrack->stop(); 11161ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1117e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi interface_unlock_exclusive(&ap->mBufferQueue); 111806a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi // notify client 11198f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi if (NULL != callback) { 1120e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (*callback)(&ap->mBufferQueue.mItf, callbackPContext); 11218f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi } 11226a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 11236a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 11241ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 112513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MARKER: 1126e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleMarker_lockPlay(ap); 11274614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11286a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 112913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_NEW_POS: 1130e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleNewPos_lockPlay(ap); 11314614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11326a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 113313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_UNDERRUN: 1134e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleUnderrun_lockPlay(ap); 11354614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11366a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 11376a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 1138e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // FIXME where does the notification of SL_PLAYEVENT_HEADMOVING fit? 1139b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event, 1140b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi (CAudioPlayer *)user); 11416a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 11421ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 11431ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi} 11441ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11451ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11461ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi//----------------------------------------------------------------------------- 114713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviSLresult android_audioPlayer_create(CAudioPlayer *pAudioPlayer) { 1148773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1149c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 115013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // pAudioPlayer->mAndroidObjType has been set in audioPlayer_getAndroidObjectTypeForSourceSink() 115113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (INVALID_TYPE == pAudioPlayer->mAndroidObjType) { 115213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi audioPlayer_setInvalid(pAudioPlayer); 1153c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 115413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 1155c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 115613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mpLock = new android::Mutex(); 115713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED; 115813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 115913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAudioTrack = NULL; 116013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // not needed, as placement new (explicit constructor) already does this 116113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // pAudioPlayer->mSfPlayer.clear(); 1162de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 116313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mSessionId = android::AudioSystem::newAudioSessionId(); 11643d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi 116513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromVolLevel = 1.0f; 116613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromStereoPos[0] = 1.0f; 116713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromStereoPos[1] = 1.0f; 116813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mDirectLevel = 0; // no attenuation 116913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 117013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAuxSendLevel = 0; 1171e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 117213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // initialize interface-specific fields that can be used regardless of whether the 117313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // interface is exposed on the AudioPlayer or not 117413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // (empty section, as all initializations are the same as the defaults) 117513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 117624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 1177c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return result; 1178773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} 1179773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1180a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1181a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 118275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_setConfig(CAudioPlayer *ap, const SLchar *configKey, 118375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi const void *pConfigValue, SLuint32 valueSize) { 118475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 118575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 118675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 118775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL == ap) { 118875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 118975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if (NULL == pConfigValue) { 119075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_NULL_PARAM); 119175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 119275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 119375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) { 119475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 119575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type 119675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (KEY_STREAM_TYPE_PARAMSIZE > valueSize) { 119775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW); 119875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 119975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 120075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = audioPlayer_setStreamType(ap, *(SLuint32*)pConfigValue); 120175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 120275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 120375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 120475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY); 120575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 120675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 120775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 120875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 120975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 121075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 121375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_getConfig(CAudioPlayer* ap, const SLchar *configKey, 121475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLuint32* pValueSize, void *pConfigValue) { 121575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 121775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL == ap) { 121975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return SL_RESULT_INTERNAL_ERROR; 122075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if (NULL == pValueSize) { 122175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_NULL_PARAM); 122275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 122375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) { 122575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type 122775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (KEY_STREAM_TYPE_PARAMSIZE > *pValueSize) { 122875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW); 122975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 123075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 123175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pValueSize = KEY_STREAM_TYPE_PARAMSIZE; 123275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL != pConfigValue) { 123375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = audioPlayer_getStreamType(ap, (SLint32*)pConfigValue); 123475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 123575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 123675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 123775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 123875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY); 123975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 124075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 124175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 124275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 124375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 124475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 124575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 124675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 1247d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async) { 1248a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1249a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1250a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGV("Realize pAudioPlayer=%p", pAudioPlayer); 1251b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi 1252a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi switch (pAudioPlayer->mAndroidObjType) { 1253a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi //----------------------------------- 1254a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // AudioTrack 1255f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1256a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi { 12571fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // initialize platform-specific CAudioPlayer fields 12581fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 1259a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLDataLocator_BufferQueue *dl_bq = (SLDataLocator_BufferQueue *) 1260a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi pAudioPlayer->mDynamicSource.mDataSource; 1261a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) 1262a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi pAudioPlayer->mDynamicSource.mDataSource->pFormat; 1263a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1264a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t sampleRate = sles_to_android_sampleRate(df_pcm->samplesPerSec); 1265a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 12664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi pAudioPlayer->mAudioTrack = new android::AudioTrack( 126775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi pAudioPlayer->mStreamType, // streamType 1268a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi sampleRate, // sampleRate 1269a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi sles_to_android_sampleFormat(df_pcm->bitsPerSample), // format 12701d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten sles_to_android_channelMaskOut(df_pcm->numChannels, df_pcm->channelMask), 12711d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten //channel mask 12721ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 0, // frameCount (here min) 1273a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 0, // flags 1274a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi audioTrack_callBack_pullFromBuffQueue, // callback 1275a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi (void *) pAudioPlayer, // user 12761bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi 0 // FIXME find appropriate frame count // notificationFrame 12771bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi , pAudioPlayer->mSessionId 12781bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi ); 1279337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten android::status_t status = pAudioPlayer->mAudioTrack->initCheck(); 1280337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten if (status != android::NO_ERROR) { 1281337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("AudioTrack::initCheck status %u", status); 12826a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi result = SL_RESULT_CONTENT_UNSUPPORTED; 1283a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 12841fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 12851fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // initialize platform-independent CAudioPlayer fields 12861fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 12871fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi pAudioPlayer->mNumChannels = df_pcm->numChannels; 1288a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi pAudioPlayer->mSampleRateMilliHz = df_pcm->samplesPerSec; // Note: bad field name in SL ES 12893ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 12903ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_READY; 129113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 129213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1293a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi //----------------------------------- 1294a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // MediaPlayer 1295b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 129680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 1297f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 12983ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED; 12993ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mNumChannels = 0; 13003ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mSampleRateMilliHz = 0; 13013ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAudioTrack = NULL; 13023ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 13033ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi AudioPlayback_Parameters app; 13043ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.sessionId = pAudioPlayer->mSessionId; 13053ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.streamType = pAudioPlayer->mStreamType; 13063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.trackcb = audioTrack_callBack_uri; 13073ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.trackcbUser = (void *) pAudioPlayer; 13083ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 13093ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mSfPlayer = new android::SfPlayer(&app); 1310a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi pAudioPlayer->mSfPlayer->setNotifListener(sfplayer_handlePrefetchEvent, 1311ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi (void*)pAudioPlayer /*notifUSer*/); 1312ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi pAudioPlayer->mSfPlayer->armLooper(); 13138a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 1314de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 13156fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi 1316989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) { 1317989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_URI: 1318989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mSfPlayer->setDataSource( 1319989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI); 1320989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 1321989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: { 1322989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset; 1323989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mSfPlayer->setDataSource( 1324989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (int)pAudioPlayer->mDataSource.mLocator.mFD.fd, 1325989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 132697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 1327989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length); 132813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 132913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1330989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi default: 13313ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR); 1332989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 1333989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 1334f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 133513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 133613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 133713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 133813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // StreamPlayer 133913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_TS_ABQ: { 1340fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 1341fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 1342581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_StreamPlayer_realize_l(pAudioPlayer, sfplayer_handlePrefetchEvent, 1343581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi (void*)pAudioPlayer); 1344fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 1345fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 134613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 134713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 134813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 134913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // AudioToCbRenderer 135013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: { 135113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 135213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 135313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioPlayback_Parameters app; 135413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi app.sessionId = pAudioPlayer->mSessionId; 135513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi app.streamType = pAudioPlayer->mStreamType; 135613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 135713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi android::AudioToCbRenderer* decoder = new android::AudioToCbRenderer(&app); 135813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer = decoder; 135913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataPushListener(adecoder_writeToBufferQueue, (void*)pAudioPlayer); 136013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->init(sfplayer_handlePrefetchEvent, (void*)pAudioPlayer); 136113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 136213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) { 136313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 136413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataSource( 136513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI); 136613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 136713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: { 136813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset; 136913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataSource( 137013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int)pAudioPlayer->mDataSource.mLocator.mFD.fd, 137113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 137213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 137313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length); 137413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 137513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 137613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 137713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR); 137813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 137913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 138013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 138113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 138213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 138313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1384fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 1385a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi default: 138613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType); 1387337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1388337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten break; 1389a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 1390a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1391b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi 1392ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi // proceed with effect initialization 13934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize EQ 13944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // FIXME use a table of effect descriptors when adding support for more effects 13954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (memcmp(SL_IID_EQUALIZER, &pAudioPlayer->mEqualizer.mEqDescriptor.type, 13964be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 13977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize EQ for AudioPlayer=%p", pAudioPlayer); 13983d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_eq_init(pAudioPlayer->mSessionId, &pAudioPlayer->mEqualizer); 13994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 14004be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize BassBoost 14019cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi if (memcmp(SL_IID_BASSBOOST, &pAudioPlayer->mBassBoost.mBassBoostDescriptor.type, 14029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 14037e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize BassBoost for AudioPlayer=%p", pAudioPlayer); 14043d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_bb_init(pAudioPlayer->mSessionId, &pAudioPlayer->mBassBoost); 14059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi } 14064be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize Virtualizer 1407f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (memcmp(SL_IID_VIRTUALIZER, &pAudioPlayer->mVirtualizer.mVirtualizerDescriptor.type, 1408f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 14097e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize Virtualizer for AudioPlayer=%p", pAudioPlayer); 14103d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_virt_init(pAudioPlayer->mSessionId, &pAudioPlayer->mVirtualizer); 1411f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 14127e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi 14137e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // initialize EffectSend 14147e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // FIXME initialize EffectSend 14154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 1416a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return result; 1417a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi} 1418a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 141948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi 142048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi//----------------------------------------------------------------------------- 1421d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) { 14226a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 14239ab6dd04be11483a9e8b58de91228b17b821eca4Jean-Michel Trivi SL_LOGV("android_audioPlayer_destroy(%p)", pAudioPlayer); 14246a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch (pAudioPlayer->mAndroidObjType) { 14256a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi //----------------------------------- 14266a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // AudioTrack 1427f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 142896ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // We own the audio track for PCM buffer queue players 142996ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten if (pAudioPlayer->mAudioTrack != NULL) { 143096ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack->stop(); 143196ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten delete pAudioPlayer->mAudioTrack; 143296ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack = NULL; 143396ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten } 14346a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 14356a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi //----------------------------------- 14366a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // MediaPlayer 1437b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 143896ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // We don't own this audio track, SfPlayer does 143996ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack = NULL; 1440a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // FIXME might no longer be needed since we call explicit destructor 144113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mSfPlayer.clear(); 14426a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 1443fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 1444fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi // StreamPlayer 1445f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_TS_ABQ: 1446fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi android_StreamPlayer_destroy(pAudioPlayer); 1447fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi break; 1448fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 144913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: 145013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer.clear(); 145113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 145213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 14536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 145413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERDESTROY_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType); 1455337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1456337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten break; 14576a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 14586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1459a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // FIXME might not be needed 1460989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mAndroidObjType = INVALID_TYPE; 1461989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 1462a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // explicit destructor 1463a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten pAudioPlayer->mSfPlayer.~sp(); 1464f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi pAudioPlayer->mAuxEffect.~sp(); 146513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer.~sp(); 14664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 14670ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi if (pAudioPlayer->mpLock != NULL) { 14680ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi delete pAudioPlayer->mpLock; 14690ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi pAudioPlayer->mpLock = NULL; 14700ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi } 14710ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi 14726a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 14736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 14746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 14756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 14766a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 14778a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel TriviSLresult android_audioPlayer_setPlayRate(CAudioPlayer *ap, SLpermille rate, bool lockAP) { 1478497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 147924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uint32_t contentRate = 0; 1480497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1481f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1482b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 1483497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi // get the content sample rate 14848a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_shared(&ap->mObject); } 148524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uint32_t contentRate = sles_to_android_sampleRate(ap->mSampleRateMilliHz); 14868a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_shared(&ap->mObject); } 1487497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi // apply the SL ES playback rate on the AudioTrack as a factor of its content sample rate 14884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (ap->mAudioTrack != NULL) { 14894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setSampleRate(contentRate * (rate/1000.0f)); 1490497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1491497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1492497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 14934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1494497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1495337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Unexpected object type %d", ap->mAndroidObjType); 1496337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1497497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1498497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1499497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return result; 1500497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1501497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1502497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1503497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 1504497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held 150524430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_setPlaybackRateBehavior(CAudioPlayer *ap, 1506497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLuint32 constraints) { 1507497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1508497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1509f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1510b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 1511497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi if (constraints != (constraints & SL_RATEPROP_NOPITCHCORAUDIO)) { 1512497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi result = SL_RESULT_FEATURE_UNSUPPORTED; 1513497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1514497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1515497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1516337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Unexpected object type %d", ap->mAndroidObjType); 1517337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1518497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1519497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1520497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return result; 1521497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1522497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1523497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1524497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 1525497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held 152624430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_getCapabilitiesOfRate(CAudioPlayer *ap, 1527497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLuint32 *pCapabilities) { 1528497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1529f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1530b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 15314614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi *pCapabilities = SL_RATEPROP_NOPITCHCORAUDIO; 1532497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1533497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1534497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi *pCapabilities = 0; 1535497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1536497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1537497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return SL_RESULT_SUCCESS; 1538497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1539497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1540497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1541497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 15428a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivivoid android_audioPlayer_setPlayState(CAudioPlayer *ap, bool lockAP) { 15438a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 15448a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_shared(&ap->mObject); } 15458a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi SLuint32 playState = ap->mPlay.mState; 15468a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi AndroidObject_state objState = ap->mAndroidObjState; 15478a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_shared(&ap->mObject); } 15488a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 154948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi switch(ap->mAndroidObjType) { 1550f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 15518a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch (playState) { 155248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_STOPPED: 15533ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED"); 15543ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15553ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->stop(); 15563ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 155748913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 155848913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_PAUSED: 15593ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED"); 15603ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15613ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->pause(); 15623ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 156348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 156448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_PLAYING: 15653ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING"); 15663ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15673ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->start(); 15683ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 156948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 157048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi default: 1571e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // checked by caller, should not happen 1572e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 157348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi } 157448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 157526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1576b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 15778a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch (playState) { 15781fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi case SL_PLAYSTATE_STOPPED: { 15793ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED"); 158043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 158143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->stop(); 158243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 158313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 158413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 158580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi case SL_PLAYSTATE_PAUSED: { 15863ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED"); 15878a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch(objState) { 158813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 15898a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi sfplayer_prepare(ap, lockAP); 15903ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 159113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi caseANDROID_PREPARING: 159280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 159313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 159443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 159543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->pause(); 159643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 159780ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 159880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi default: 159980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 160080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi } 160113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 160213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 160380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi case SL_PLAYSTATE_PLAYING: { 16043ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING"); 16058a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch(objState) { 160613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 16078a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi sfplayer_prepare(ap, lockAP); 16083ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi // fall through 160913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 161013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 16113ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (ap->mSfPlayer != 0) { 16123ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSfPlayer->play(); 16133ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 16143ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 16153ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi default: 16163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 161706a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi } 161813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 161913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 16203ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 16216fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi default: 1622e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // checked by caller, should not happen 1623e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 16246fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi } 162548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 162626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1627f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_TS_ABQ: { 1628f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi android::AVPlayer* avp = (android::AVPlayer*) ap->mStreamPlayer.get(); 1629f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if (avp != NULL) { 1630581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_Player_setPlayState(avp, playState, &(ap->mAndroidObjState)); 1631f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi } 1632f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi } 163326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi break; 163426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 163513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: 163613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // FIXME report and use the return code to the lock mechanism, which is where play state 163713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // changes are updated (see object_unlock_exclusive_attributes()) 163813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi aplayer_setPlayState(ap->mAPlayer, playState, &(ap->mAndroidObjState)); 163913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 164048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi default: 164113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_UNEXPECTED_OBJECT_TYPE_D, ap->mAndroidObjType); 164248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 164348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi } 164448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi} 164548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi 16466a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 16476a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 1648d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_useEventMask(CAudioPlayer *ap) { 1649e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IPlay *pPlayItf = &ap->mPlay; 1650e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 eventFlags = pPlayItf->mEventFlags; 16514614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi /*switch(ap->mAndroidObjType) { 1652f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ:*/ 16534614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16544614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL == ap->mAudioTrack) { 1655e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten return; 16564614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATMARKER) { 1659a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi ap->mAudioTrack->setMarkerPosition((uint32_t)((((int64_t)pPlayItf->mMarkerPosition 1660a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000)); 16614614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else { 16624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // clear marker 16634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setMarkerPosition(0); 16644614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATNEWPOS) { 166749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten ap->mAudioTrack->setPositionUpdatePeriod( 166849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten (uint32_t)((((int64_t)pPlayItf->mPositionUpdatePeriod 166949e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000)); 16704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else { 16714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // clear periodic update 16724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setPositionUpdatePeriod(0); 16734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATEND) { 1676e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // nothing to do for SL_PLAYEVENT_HEADATEND, callback event will be checked against mask 16776a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 16784614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16794614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADMOVING) { 16804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME support SL_PLAYEVENT_HEADMOVING 1681a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("[ FIXME: IPlay_SetCallbackEventsMask(SL_PLAYEVENT_HEADMOVING) on an " 168249e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "SL_OBJECTID_AUDIOPLAYER to be implemented ]"); 16834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADSTALLED) { 1685e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // nothing to do for SL_PLAYEVENT_HEADSTALLED, callback event will be checked against mask 16864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16886a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 16896a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 16906a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 16916a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 1692d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_getDuration(IPlay *pPlayItf, SLmillisecond *pDurMsec) { 1693dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis; 1694dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi switch(ap->mAndroidObjType) { 1695f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1696dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi *pDurMsec = SL_TIME_UNKNOWN; 1697dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi // FIXME if the data source is not a buffer queue, and the audio data is saved in 1698dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi // shared memory with the mixer process, the duration is the size of the buffer 1699a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("FIXME: android_audioPlayer_getDuration() verify if duration can be retrieved"); 1700dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi break; 1701b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 170243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi int64_t durationUsec = SL_TIME_UNKNOWN; 170343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 170443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi durationUsec = ap->mSfPlayer->getDurationUsec(); 170543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pDurMsec = durationUsec == -1 ? SL_TIME_UNKNOWN : durationUsec / 1000; 170643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 170713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 170813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1709dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi default: 1710dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi break; 1711dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi } 1712dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi return SL_RESULT_SUCCESS; 1713dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi} 1714dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi 1715dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi 1716dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi//----------------------------------------------------------------------------- 1717d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_getPosition(IPlay *pPlayItf, SLmillisecond *pPosMsec) { 17186a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis; 17196a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch(ap->mAndroidObjType) { 1720f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 17213ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if ((ap->mSampleRateMilliHz == 0) || (NULL == ap->mAudioTrack)) { 1722a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi *pPosMsec = 0; 1723a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi } else { 17243ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi uint32_t positionInFrames; 17253ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->getPosition(&positionInFrames); 1726a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi *pPosMsec = ((int64_t)positionInFrames * 1000) / 1727a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi sles_to_android_sampleRate(ap->mSampleRateMilliHz); 1728a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi } 17296a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 1730b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 173143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 173243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pPosMsec = ap->mSfPlayer->getPositionMsec(); 173343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } else { 173443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pPosMsec = 0; 173543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 17366a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 17376a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 17386a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 17396a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 17406a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 17416a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 17426a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1743b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten//----------------------------------------------------------------------------- 174443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivivoid android_audioPlayer_seek(CAudioPlayer *ap, SLmillisecond posMsec) { 174543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi 174643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi switch(ap->mAndroidObjType) { 1747f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 17486f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 1749b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 175043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 175143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->seek(posMsec); 175243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 17536f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 17546f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi default: 17556f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 17566f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi } 17573c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi} 17583c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 17593c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 17603c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi//----------------------------------------------------------------------------- 1761d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivivoid android_audioPlayer_loop(CAudioPlayer *ap, SLboolean loopEnable) { 1762d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1763b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi if ((A_PLR_URIFD == ap->mAndroidObjType) && (ap->mSfPlayer != 0)) { 1764d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi ap->mSfPlayer->loop((bool)loopEnable); 1765d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi } 1766d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi} 1767d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1768d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1769d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi//----------------------------------------------------------------------------- 1770e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/* 1771e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Mutes or unmutes the Android media framework object associated with the CAudioPlayer that carries 1772e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * the IVolume interface. 1773e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Pre-condition: 1774e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * if ap->mMute is SL_BOOLEAN_FALSE, a call to this function was preceded by a call 1775d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi * to android_audioPlayer_volumeUpdate() 1776e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 1777d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_setMute(CAudioPlayer* ap) { 1778de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::AudioTrack *t = NULL; 1779b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi switch(ap->mAndroidObjType) { 1780f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1781b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 17824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi t = ap->mAudioTrack; 1783b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi break; 1784b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi default: 1785b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi break; 17866a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 1787de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // when unmuting: volume levels have already been updated in IVolume_SetMute 1788de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (NULL != t) { 1789e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten t->mute(ap->mMute); 1790de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 1791e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} 1792e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1793e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1794e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten//----------------------------------------------------------------------------- 1795d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_volumeUpdate(CAudioPlayer* ap) { 1796d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_updateStereoVolume(ap); 1797d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_setMute(ap); 17986a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return SL_RESULT_SUCCESS; 17996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 18004b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18014b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18024b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten//----------------------------------------------------------------------------- 18030ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivivoid android_audioPlayer_bufferQueue_onRefilled(CAudioPlayer *ap) { 1804a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // the AudioTrack associated with the AudioPlayer receiving audio from a PCM buffer 1805a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // queue was stopped when the queue become empty, we restart as soon as a new buffer 1806a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // has been enqueued since we're in playing state 1807b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 1808b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi ap->mAudioTrack->start(); 1809b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi } 1810a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 1811a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // when the queue became empty, an underflow on the prefetch status itf was sent. Now the queue 1812a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // has received new data, signal it has sufficient data 1813a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 1814fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_SUFFICIENTDATA, 1815fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten true); 1816a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 1817b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi} 1818b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 1819b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 1820b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi//----------------------------------------------------------------------------- 18214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/* 18224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * BufferQueue::Clear 18234b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten */ 18240ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel TriviSLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *ap) { 18254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLresult result = SL_RESULT_SUCCESS; 18264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18270ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi switch (ap->mAndroidObjType) { 18284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten //----------------------------------- 18294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // AudioTrack 1830f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 18310ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 18320ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi ap->mAudioTrack->flush(); 18330ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi } 18344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 18354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten default: 18364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 18374b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 18384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 18394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten return result; 18414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten} 1842b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 184326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1844fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi//----------------------------------------------------------------------------- 1845fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_registerCallback_l(CAudioPlayer *ap) { 1846f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if ((ap->mAndroidObjType == A_PLR_TS_ABQ) && (ap->mStreamPlayer != 0)) { 1847eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi android_StreamPlayer_androidBufferQueue_registerCallback(ap->mStreamPlayer.get(), 1848eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi ap->mAndroidBufferQueue.mCallback, 1849eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi ap->mAndroidBufferQueue.mContext, 1850eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi (const void*)&(ap->mAndroidBufferQueue.mItf)); 185126043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi } 185226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi} 185326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1854be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi//----------------------------------------------------------------------------- 1855be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_clear_l(CAudioPlayer *ap) { 1856f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if (ap->mAndroidObjType == A_PLR_TS_ABQ) { 1857be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi android_StreamPlayer_clear_l(ap); 1858be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi } 1859be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi} 1860be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi 1861be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_enqueue_l(CAudioPlayer *ap, 1862be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) { 1863f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if (ap->mAndroidObjType == A_PLR_TS_ABQ) { 1864be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi android_StreamPlayer_enqueue_l(ap, bufferId, length, event, pData); 1865be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi } 1866be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi} 1867