AudioPlayer_to_android.cpp revision d158d31a6bbb06426b71c3d097b7768bc3fb79a3
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" 18d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi#include "android/AndroidBufferQueueSource.h" 19f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi#include "utils/RefBase.h" 2075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#include "android_prompts.h" 21773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 22a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastentemplate class android::KeyedVector<SLuint32, android::AudioEffect* > ; 23a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 2475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi#define KEY_STREAM_TYPE_PARAMSIZE sizeof(SLint32) 251ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 2605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//----------------------------------------------------------------------------- 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// FIXME this method will be absorbed into android_audioPlayer_setPlayState() once 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// bufferqueue and uri/fd playback are moved under the GenericPlayer C++ object 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviSLresult aplayer_setPlayState(const android::sp<android::GenericPlayer> &ap, SLuint32 playState, 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_state* pObjState) { 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_state objState = *pObjState; 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (playState) { 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_STOPPED: 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_STOPPED"); 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->stop(); 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_PAUSED: 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PAUSED"); 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch(objState) { 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *pObjState = ANDROID_PREPARING; 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->prepare(); 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->pause(); 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState); 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_PLAYSTATE_PLAYING: { 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PLAYING"); 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch(objState) { 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *pObjState = ANDROID_PREPARING; 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->prepare(); 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // intended fall through 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // intended fall through 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->play(); 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState); 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // checked by caller, should not happen 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_SHOULDNT_BE_HERE_S, "aplayer_setPlayState"); 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return result; 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Callback associated with a AudioToCbRenderer of an SL ES AudioPlayer that gets its data 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// from a URI or FD, to write the decoded audio data to a buffer queue 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatic size_t adecoder_writeToBufferQueue(const uint8_t *data, size_t size, void* user) { 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t sizeConsumed = 0; 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == user) { 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return sizeConsumed; 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("received %d bytes from decoder", size); 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi slBufferQueueCallback callback = NULL; 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void * callbackPContext = NULL; 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // push decoded data to the buffer queue 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ap->mBufferQueue.mState.count != 0) { 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi BufferHeader *oldFront = ap->mBufferQueue.mFront; 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi BufferHeader *newFront = &oldFront[1]; 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi uint8_t *pDest = (uint8_t *)oldFront->mBuffer + ap->mBufferQueue.mSizeConsumed; 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ap->mBufferQueue.mSizeConsumed + size < oldFront->mSize) { 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // room to consume the whole or rest of the decoded data in one shot 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mSizeConsumed += size; 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // consume data but no callback to the BufferQueue interface here 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi memcpy (pDest, data, size); 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = size; 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // push as much as possible of the decoded data into the buffer queue 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = oldFront->mSize - ap->mBufferQueue.mSizeConsumed; 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // the buffer at the head of the buffer queue is full, update the state 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mSizeConsumed = 0; 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (newFront == &ap->mBufferQueue.mArray[ap->mBufferQueue.mNumBuffers + 1]) { 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi newFront = ap->mBufferQueue.mArray; 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mFront = newFront; 12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mState.count--; 12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mBufferQueue.mState.playIndex++; 12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // consume data 13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi memcpy (pDest, data, sizeConsumed); 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // data has been copied to the buffer, and the buffer queue state has been updated 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // we will notify the client if applicable 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi callback = ap->mBufferQueue.mCallback; 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // save callback data 13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi callbackPContext = ap->mBufferQueue.mContext; 13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // no available buffers in the queue to write the decoded data 14013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sizeConsumed = 0; 14113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 14213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 14413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // notify client 14513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != callback) { 14613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (*callback)(&ap->mBufferQueue.mItf, callbackPContext); 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return sizeConsumed; 15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 153a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Triviint android_getMinFrameCount(uint32_t sampleRate) { 154a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi int afSampleRate; 155a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputSamplingRate(&afSampleRate, 156a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 157a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 158a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 159a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi int afFrameCount; 160a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputFrameCount(&afFrameCount, 161a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 162a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 163a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 164a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t afLatency; 165a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (android::AudioSystem::getOutputLatency(&afLatency, 166a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi ANDROID_DEFAULT_OUTPUT_STREAM_TYPE) != android::NO_ERROR) { 167a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return ANDROID_DEFAULT_AUDIOTRACK_BUFFER_SIZE; 168a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 169a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // minimum nb of buffers to cover output latency, given the size of each hardware audio buffer 170a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate); 171a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi if (minBufCount < 2) minBufCount = 2; 172a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // minimum number of frames to cover output latency at the sample rate of the content 173a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return (afFrameCount*sampleRate*minBufCount)/afSampleRate; 1746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 1756a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 176712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi 177712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//----------------------------------------------------------------------------- 1781fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define LEFT_CHANNEL_MASK 0x1 << 0 1791fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define RIGHT_CHANNEL_MASK 0x1 << 1 1806a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 181d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_updateStereoVolume(CAudioPlayer* ap) { 1826a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi float leftVol = 1.0f, rightVol = 1.0f; 1836a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL == ap->mAudioTrack) { 1854614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi return; 18645d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi } 1871fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // should not be used when muted 1881fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (SL_BOOLEAN_TRUE == ap->mMute) { 1891fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi return; 1901fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 1914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1921fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi int channelCount = ap->mNumChannels; 1931fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 1941fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // mute has priority over solo 1951fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi int leftAudibilityFactor = 1, rightAudibilityFactor = 1; 1961fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 197e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (channelCount >= STEREO_CHANNELS) { 198b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mMuteMask & LEFT_CHANNEL_MASK) { 1991fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left muted 2001fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 0; 2011fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2021fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left not muted 203b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & LEFT_CHANNEL_MASK) { 2041fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left soloed 2051fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 1; 2061fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2071fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left not soloed 208b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & RIGHT_CHANNEL_MASK) { 2091fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right solo silences left 2101fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 0; 2111fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2121fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left and right are not soloed, and left is not muted 2131fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi leftAudibilityFactor = 1; 2141fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2151fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2161fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2171fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 218b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mMuteMask & RIGHT_CHANNEL_MASK) { 2191fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right muted 2201fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 0; 2211fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2221fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right not muted 223b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & RIGHT_CHANNEL_MASK) { 2241fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right soloed 2251fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 1; 2261fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2271fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // right not soloed 228b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten if (ap->mSoloMask & LEFT_CHANNEL_MASK) { 2291fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left solo silences right 2301fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 0; 2311fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } else { 2321fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // left and right are not soloed, and right is not muted 2331fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi rightAudibilityFactor = 1; 2341fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2351fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2361fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2371fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi } 2386a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 2396a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // compute amplification as the combination of volume level and stereo position 240172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi // amplification from volume level 241172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi ap->mAmplFromVolLevel = sles_to_android_amplification(ap->mVolume.mLevel); 242ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf) 243172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi leftVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel; 244172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi rightVol *= ap->mAmplFromVolLevel * ap->mAmplFromDirectLevel; 245a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 246f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // amplification from stereo position 2471fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (ap->mVolume.mEnableStereoPosition) { 248f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // panning law depends on number of channels of content: stereo panning vs 2ch. balance 24945d40b8ac4cd8f3f73813a26334c7e5ecc3cb73cJean-Michel Trivi if(1 == channelCount) { 250f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // stereo panning 2511fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi double theta = (1000+ap->mVolume.mStereoPosition)*M_PI_4/1000.0f; // 0 <= theta <= Pi/2 252e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = cos(theta); 253e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = sin(theta); 254f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } else { 255f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // stereo balance 2561fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi if (ap->mVolume.mStereoPosition > 0) { 257e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = (1000-ap->mVolume.mStereoPosition)/1000.0f; 258e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = 1.0f; 2596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } else { 260e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[0] = 1.0f; 261e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap->mAmplFromStereoPos[1] = (1000+ap->mVolume.mStereoPosition)/1000.0f; 2626a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 2636a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 264e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten leftVol *= ap->mAmplFromStereoPos[0]; 265e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten rightVol *= ap->mAmplFromStereoPos[1]; 266f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 267f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 2681fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi ap->mAudioTrack->setVolume(leftVol * leftAudibilityFactor, rightVol * rightAudibilityFactor); 269ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi 270ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // changes in the AudioPlayer volume must be reflected in the send level: 271ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // in SLEffectSendItf or in SLAndroidEffectSendItf? 272ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // FIXME replace interface test by an internal API once we have one. 273ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi if (NULL != ap->mEffectSend.mItf) { 274ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi for (unsigned int i=0 ; i<AUX_MAX ; i++) { 275ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi if (ap->mEffectSend.mEnableLevels[i].mEnable) { 276ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi android_fxSend_setSendLevel(ap, 277ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi ap->mEffectSend.mEnableLevels[i].mSendLevel + ap->mVolume.mLevel); 278ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // there's a single aux bus on Android, so we can stop looking once the first 279ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // aux effect is found. 280ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi break; 281ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 282ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 283ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } else if (NULL != ap->mAndroidEffectSend.mItf) { 284ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi android_fxSend_setSendLevel(ap, ap->mAndroidEffectSend.mSendLevel + ap->mVolume.mLevel); 285ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi } 2864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 2874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 289e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleMarker_lockPlay(CAudioPlayer* ap) { 29049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MARKER from AudioTrack"); 2914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 2924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 2934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 2954614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 2964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 2974614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 2984614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 2994614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL != callback) { 3004614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // getting this event implies SL_PLAYEVENT_HEADATMARKER was set in the event mask 3014614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATMARKER); 3024614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 3034614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 3044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3054614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 306e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap) { 30749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_NEW_POS from AudioTrack"); 3084614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 3094614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 3104614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3114614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 3124614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 3134614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 3144614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 3154614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3164614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL != callback) { 3174614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // getting this event implies SL_PLAYEVENT_HEADATNEWPOS was set in the event mask 3184614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATNEWPOS); 3194614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 3204614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 3214614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3224614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3234614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 324e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivivoid audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap) { 3254614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi slPlayCallback callback = NULL; 3264614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi void* callbackPContext = NULL; 3274614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3284614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_lock_shared(&ap->mPlay); 3294614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callback = ap->mPlay.mCallback; 3304614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi callbackPContext = ap->mPlay.mContext; 3314614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi bool headStalled = (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADSTALLED) != 0; 3324614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi interface_unlock_shared(&ap->mPlay); 3334614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 3344614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if ((NULL != callback) && headStalled) { 3354614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADSTALLED); 336f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 337f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi} 338f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 33924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 340e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi//----------------------------------------------------------------------------- 341e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi/** 342e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * post-condition: play state of AudioPlayer is SL_PLAYSTATE_PAUSED if setPlayStateToPaused is true 343e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * 344e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * note: a conditional flag, setPlayStateToPaused, is used here to specify whether the play state 345e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * needs to be changed when the player reaches the end of the content to play. This is 346e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * relative to what the specification describes for buffer queues vs the 347e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * SL_PLAYEVENT_HEADATEND event. In the OpenSL ES specification 1.0.1: 348e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * - section 8.12 SLBufferQueueItf states "In the case of starvation due to insufficient 349e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * buffers in the queue, the playing of audio data stops. The player remains in the 350e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * SL_PLAYSTATE_PLAYING state." 351e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * - section 9.2.31 SL_PLAYEVENT states "SL_PLAYEVENT_HEADATEND Playback head is at the end 352e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi * of the current content and the player has paused." 353e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi */ 354fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayStateToPaused, 355fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten bool needToLock) { 35625d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi //SL_LOGV("ap=%p, setPlayStateToPaused=%d, needToLock=%d", ap, setPlayStateToPaused, 35725d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi // needToLock); 358e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi slPlayCallback playCallback = NULL; 359e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi void * playContext = NULL; 360e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // SLPlayItf callback or no callback? 361fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 362ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi interface_lock_exclusive(&ap->mPlay); 363fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 364e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) { 365e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi playCallback = ap->mPlay.mCallback; 366e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi playContext = ap->mPlay.mContext; 367e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } 36825d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi if (setPlayStateToPaused) { 369ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi ap->mPlay.mState = SL_PLAYSTATE_PAUSED; 370ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi } 371ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi if (needToLock) { 372ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi interface_unlock_exclusive(&ap->mPlay); 373fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 374e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // callback with no lock held 375e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (NULL != playCallback) { 376e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND); 377e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } 37825d7efb86cd78b868afef12a30ef557f91d97552Jean-Michel Trivi 379e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi} 380e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 381a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 382a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi//----------------------------------------------------------------------------- 383a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi/** 384a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * pre-condition: AudioPlayer has SLPrefetchStatusItf initialized 385a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * post-condition: 386a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * - ap->mPrefetchStatus.mStatus == status 387a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * - the prefetch status callback, if any, has been notified if a change occurred 388a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi * 389a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi */ 390fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kastenvoid audioPlayer_dispatch_prefetchStatus_lockPrefetch(CAudioPlayer *ap, SLuint32 status, 391fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten bool needToLock) { 392a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi slPrefetchCallback prefetchCallback = NULL; 393a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi void * prefetchContext = NULL; 394a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 395fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 396fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten interface_lock_exclusive(&ap->mPrefetchStatus); 397fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 398a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // status change? 399a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (ap->mPrefetchStatus.mStatus != status) { 400a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = status; 401a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // callback or no callback? 402a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) { 403a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi prefetchCallback = ap->mPrefetchStatus.mCallback; 404a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi prefetchContext = ap->mPrefetchStatus.mContext; 405a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 406a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 407fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten if (needToLock) { 408fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten interface_unlock_exclusive(&ap->mPrefetchStatus); 409fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten } 410a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 411a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // callback with no lock held 412a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (NULL != prefetchCallback) { 413a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext, status); 414a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 415a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi} 416a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 417a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 418f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi//----------------------------------------------------------------------------- 41975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_setStreamType(CAudioPlayer* ap, SLint32 type) { 42075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 42175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGV("type %ld", type); 42275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 42375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi int newStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 42475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi switch(type) { 42575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_VOICE: 42675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::VOICE_CALL; 42775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 42875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_SYSTEM: 42975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::SYSTEM; 43075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_RING: 43275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::RING; 43375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_MEDIA: 43575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::MUSIC; 43675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 43775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_ALARM: 43875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::ALARM; 43975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 44075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case SL_ANDROID_STREAM_NOTIFICATION: 44175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi newStreamType = android::AudioSystem::NOTIFICATION; 44275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 44375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi default: 44475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_PLAYERSTREAMTYPE_SET_UNKNOWN_TYPE); 44575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 44675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 44775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 44875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 44975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type needs to be set before the object is realized 45075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // (ap->mAudioTrack is supposed to be NULL until then) 4515f71e35da153d194d805e030ab38935599e065d2Jean-Michel Trivi if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) { 45275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_PLAYERSTREAMTYPE_REALIZED); 45375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PRECONDITIONS_VIOLATED; 45475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 45575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi ap->mStreamType = newStreamType; 45675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 45775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 45875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 45975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 46075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 46375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult audioPlayer_getStreamType(CAudioPlayer* ap, SLint32 *pType) { 46475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 46575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 46675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi switch(ap->mStreamType) { 46775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::VOICE_CALL: 46875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_VOICE; 46975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::SYSTEM: 47175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_SYSTEM; 47275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::RING: 47475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_RING; 47575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 47675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::DEFAULT: 47775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::MUSIC: 47875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_MEDIA; 47975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::ALARM: 48175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_ALARM; 48275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi case android::AudioSystem::NOTIFICATION: 48475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_NOTIFICATION; 48575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 48675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi default: 48775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 48875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pType = SL_ANDROID_STREAM_MEDIA; 48975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi break; 49075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 49175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 49375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 49475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 49675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 497f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivivoid audioPlayer_auxEffectUpdate(CAudioPlayer* ap) { 498f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi if ((NULL != ap->mAudioTrack) && (ap->mAuxEffect != 0)) { 499f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi android_fxSend_attach(ap, true, ap->mAuxEffect, ap->mVolume.mLevel + ap->mAuxSendLevel); 500f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi } 501f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi} 502f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi 503f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi 504f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi//----------------------------------------------------------------------------- 50513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid audioPlayer_setInvalid(CAudioPlayer* ap) { 50613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mAndroidObjType = INVALID_TYPE; 50713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mpLock = NULL; 50813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ap->mPlaybackRate.mCapabilities = 0; 50913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 51013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 51113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 51213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 51313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 51413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * returns true if the given data sink is supported by AudioPlayer that don't 51513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * play to an OutputMix object, false otherwise 51613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 51713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * pre-condition: the locator of the audio sink is not SL_DATALOCATOR_OUTPUTMIX 51813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 51913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivibool audioPlayer_isSupportedNonOutputMixSink(const SLDataSink* pAudioSink) { 52013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool result = true; 52113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSink->pLocator; 52213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSink->pFormat; 52313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 52413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sinkLocatorType) { 52513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 52613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 52713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 52813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (SL_DATAFORMAT_PCM != sinkFormatType) { 52913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Unsupported sink format 0x%x, expected SL_DATAFORMAT_PCM", 53013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sinkFormatType); 53113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = false; 53213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 53313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // it's no use checking the PCM format fields because additional characteristics 53413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // such as the number of channels, or sample size are unknown to the player at this stage 53513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 53613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 53713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 53813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Unsupported sink locator type 0x%x", (unsigned)sinkLocatorType); 53913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi result = false; 54013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 54113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 54213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return result; 54413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 54513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 54813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 54913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * returns the Android object type if the locator type combinations for the source and sinks 55013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * are supported by this implementation, INVALID_TYPE otherwise 55113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 55213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAndroidObject_type audioPlayer_getAndroidObjectTypeForSourceSink(CAudioPlayer *ap) { 55313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 55413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSource *pAudioSrc = &ap->mDataSource.u.mSource; 55513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSink *pAudioSnk = &ap->mDataSink.u.mSink; 55613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator; 55713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 55813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AndroidObject_type type = INVALID_TYPE; 55913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 56013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //-------------------------------------- 56113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Sink / source matching check: 56213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // the following source / sink combinations are supported 56313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_BUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_OUTPUTMIX 56613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_OUTPUTMIX 56713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDBUFFERQUEUE / SL_DATALOCATOR_OUTPUTMIX 56813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_BUFFERQUEUE 56913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_BUFFERQUEUE 57013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_URI / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 57113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // SL_DATALOCATOR_ANDROIDFD / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 57213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sinkLocatorType) { 57313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 57413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_OUTPUTMIX: { 57513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 57613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 57713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Buffer Queue to AudioTrack 57813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 57913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 58013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_PCM_BQ; 58113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 58213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 58313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // URI or FD to MediaPlayer 58413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 58513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 58613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_URIFD; 58713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 58813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 58913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Android BufferQueue to MediaPlayer (shared memory streaming) 59013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: 59113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_TS_ABQ; 59213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 59313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 59413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 59513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_OUTPUTMIX sink", 59613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sourceLocatorType); 59713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 59813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 59913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 60013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 60113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 60213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_BUFFERQUEUE: 60313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 60413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 60513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 60613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // URI or FD decoded to PCM in a buffer queue 60713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 60813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 60913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi type = A_PLR_URIFD_ASQ; 61013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 61213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 61313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_BUFFERQUEUE sink", 61413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned)sourceLocatorType); 61513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 61713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 61813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 61913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 62013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Sink data locator 0x%x not supported", (unsigned)sinkLocatorType); 62113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 62213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 62313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return type; 62513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 62613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//----------------------------------------------------------------------------- 6298a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivistatic void sfplayer_prepare(CAudioPlayer *ap, bool lockAP) { 6308a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 6318a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_exclusive(&ap->mObject); } 6328a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi ap->mAndroidObjState = ANDROID_PREPARING; 6338a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_exclusive(&ap->mObject); } 6348a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 6353ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (ap->mSfPlayer != 0) { 6363ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSfPlayer->prepare(); 6373ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 6383ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi} 6393ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 6403ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi//----------------------------------------------------------------------------- 641de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi// Callback associated with an SfPlayer of an SL ES AudioPlayer that gets its data 6423ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi// from a URI or FD, for prepare and prefetch events 64313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatic void sfplayer_handlePrefetchEvent(int event, int data1, void* user) { 644de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (NULL == user) { 645de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi return; 646de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 647f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 648de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 64924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi //SL_LOGV("received event %d, data %d from SfAudioPlayer", event, data1); 650de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi switch(event) { 651f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 65268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi case android::GenericPlayer::kEventPrepared: { 6533ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 654581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi if (PLAYER_SUCCESS != data1) { 655f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 656f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 6573ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack = NULL; 6583ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mNumChannels = 0; 6593ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSampleRateMilliHz = 0; 6603ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAndroidObjState = ANDROID_UNINITIALIZED; 6613ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 662f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 663f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 664f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // SfPlayer prepare() failed prefetching, there is no event in SLPrefetchStatus to 665f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // indicate a prefetch error, so we signal it by sending simulataneously two events: 666f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // - SL_PREFETCHEVENT_FILLLEVELCHANGE with a level of 0 667f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // - SL_PREFETCHEVENT_STATUSCHANGE with a status of SL_PREFETCHSTATUS_UNDERFLOW 668f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi SL_LOGE(ERROR_PLAYER_PREFETCH_d, data1); 669f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 670f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi break; 671f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 672f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 673f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi slPrefetchCallback callback = NULL; 674f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi void* callbackPContext = NULL; 675f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 676f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi interface_lock_exclusive(&ap->mPrefetchStatus); 677f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 0; 678f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW; 679f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if ((ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) 680f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi && (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE)) { 681f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 682f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 683f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 684f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi interface_unlock_exclusive(&ap->mPrefetchStatus); 685f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 686f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi // callback with no lock held 687f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi if (NULL != callback) { 688f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, 689f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE); 690f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi } 691f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 692f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 6933ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } else { 694f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 695f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 696b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi if (A_PLR_URIFD == ap->mAndroidObjType) { 697581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mAudioTrack = ap->mSfPlayer->getAudioTrack(); 698581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mNumChannels = ap->mSfPlayer->getNumChannels(); 699581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mSampleRateMilliHz = 700581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz()); 701581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ap->mSfPlayer->startPrefetch_async(); 702581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi // update the new track with the current settings 703581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi audioPlayer_auxEffectUpdate(ap); 704581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_useEventMask(ap); 705581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_volumeUpdate(ap); 706581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate, false /*lockAP*/); 70713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (A_PLR_PCM_BQ == ap->mAndroidObjType) { 70813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ((android::AudioToCbRenderer*)ap->mAPlayer.get())->startPrefetch_async(); 70913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (A_PLR_TS_ABQ == ap->mAndroidObjType) { 710581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi SL_LOGI("Received SfPlayer::kEventPrepared from AVPlayer for CAudioPlayer %p", ap); 711581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi } 71224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 7133ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAndroidObjState = ANDROID_READY; 714f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi 715f536948a85be5e3f3731b64b01cfacdf90ed1157Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 7163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 7173ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 71813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 71913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7203ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 72113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventNewAudioTrack: { 7225d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi object_lock_exclusive(&ap->mObject); 72396ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#if 1 72496ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // SfPlayer has a new AudioTrack, update our pointer copy and configure the new one before 72596ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // starting to use it 72696ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#else 7275d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // SfPlayer has a new AudioTrack, delete the old one and configure the new one before 7285d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // starting to use it 7295d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7305d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi if (NULL != ap->mAudioTrack) { 7315d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi delete ap->mAudioTrack; 7325d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mAudioTrack = NULL; 7335d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi } 73496ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten#endif 7355d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mAudioTrack = ap->mSfPlayer->getAudioTrack(); 7365d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mNumChannels = ap->mSfPlayer->getNumChannels(); 7375d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi ap->mSampleRateMilliHz = android_to_sles_sampleRate(ap->mSfPlayer->getSampleRateHz()); 7385d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7395d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi // update the new track with the current settings 7405d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi audioPlayer_auxEffectUpdate(ap); 7415d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_useEventMask(ap); 7425d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_volumeUpdate(ap); 7435d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi android_audioPlayer_setPlayRate(ap, ap->mPlaybackRate.mRate, false /*lockAP*/); 7445d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 7455d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi object_unlock_exclusive(&ap->mObject); 74613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 74713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7485d9a1aa19d218c9e4ed22d4d773471c01362442eJean-Michel Trivi 74913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventPrefetchFillLevelUpdate : { 750a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 751a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi break; 752a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 753ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi slPrefetchCallback callback = NULL; 754ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi void* callbackPContext = NULL; 7558a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 756ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi // SLPrefetchStatusItf callback or no callback? 757ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi interface_lock_exclusive(&ap->mPrefetchStatus); 758ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) { 759ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 760ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 761ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi } 762ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi ap->mPrefetchStatus.mLevel = (SLpermille)data1; 763ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi interface_unlock_exclusive(&ap->mPrefetchStatus); 7648a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 765ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi // callback with no lock held 766ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi if (NULL != callback) { 767ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, 768ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE); 769ff037a1f697a15fb4249e62fe783f22398572cbeJean-Michel Trivi } 77013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 77113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 772de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 77313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventPrefetchStatusChange: { 774a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (!IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 775a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi break; 776a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 77706a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi slPrefetchCallback callback = NULL; 778de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi void* callbackPContext = NULL; 7798a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 780de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // SLPrefetchStatusItf callback or no callback? 7818a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi object_lock_exclusive(&ap->mObject); 782de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) { 783de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi callback = ap->mPrefetchStatus.mCallback; 784de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi callbackPContext = ap->mPrefetchStatus.mContext; 785de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 7864614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (data1 >= android::SfPlayer::kStatusIntermediate) { 787de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA; 7884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME estimate fill level better? 7894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 1000; 7904614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAndroidObjState = ANDROID_READY; 7914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else if (data1 < android::SfPlayer::kStatusIntermediate) { 792de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW; 7934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME estimate fill level better? 7944614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mPrefetchStatus.mLevel = 0; 795de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 7968a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi object_unlock_exclusive(&ap->mObject); 7978a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 798de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // callback with no lock held 79906a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi if (NULL != callback) { 800de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, SL_PREFETCHEVENT_STATUSCHANGE); 80106a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi } 80213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 80313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 804de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 80513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::SfPlayer::kEventEndOfStream: { 806fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_headAtEnd_lockPlay(ap, true /*set state to paused?*/, true); 80724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if ((NULL != ap->mAudioTrack) && (!ap->mSeek.mLoopEnabled)) { 8083ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->stop(); 8093ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 81013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 81113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 812de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 8136a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 8146a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 8156a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 816a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi} 817a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 81875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 819a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 820d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_checkSourceSink(CAudioPlayer *pAudioPlayer) 821c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi{ 82213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // verify that the locator types for the source / sink combination is supported 82313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAndroidObjType = audioPlayer_getAndroidObjectTypeForSourceSink(pAudioPlayer); 82413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (INVALID_TYPE == pAudioPlayer->mAndroidObjType) { 825c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 826c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 827c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 82813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource; 82913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink; 8304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 83113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // format check: 83213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator; 83313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator; 83413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sourceFormatType = *(SLuint32 *)pAudioSrc->pFormat; 83513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSnk->pFormat; 83613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 83713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceLocatorType) { 838c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi //------------------ 839c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Buffer Queues 84001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_BUFFERQUEUE: 84101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 84201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten { 843c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLDataLocator_BufferQueue *dl_bq = (SLDataLocator_BufferQueue *) pAudioSrc->pLocator; 8444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 845c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Buffer format 84613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 847a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // currently only PCM buffer queues are supported, 848c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATAFORMAT_PCM: { 849c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) pAudioSrc->pFormat; 850c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->numChannels) { 851c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 1: 852c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 2: 853c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 854c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 8554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // this should have already been rejected by checkDataFormat 8564b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SL_LOGE("Cannot create audio player: unsupported " \ 8574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten "PCM data source with %u channels", (unsigned) df_pcm->numChannels); 858c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 859c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 860c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->samplesPerSec) { 861c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_8: 862c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_11_025: 863c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_12: 864c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_16: 865c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_22_05: 866c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_24: 867c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_32: 868c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_SAMPLINGRATE_44_1: 8690d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten case SL_SAMPLINGRATE_48: 870c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 8714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_64: 8724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_88_2: 8734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_96: 8744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_SAMPLINGRATE_192: 875c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 87649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten SL_LOGE("Cannot create audio player: unsupported sample rate %u milliHz", 87749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten (unsigned) df_pcm->samplesPerSec); 878c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 879c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 880c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->bitsPerSample) { 881c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_PCMSAMPLEFORMAT_FIXED_8: 882337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten // FIXME We should support this 8830d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten //SL_LOGE("Cannot create audio player: unsupported 8-bit data"); 8840d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten //return SL_RESULT_CONTENT_UNSUPPORTED; 885c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_PCMSAMPLEFORMAT_FIXED_16: 886c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 887c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // others 888c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 8894b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // this should have already been rejected by checkDataFormat 8904b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SL_LOGE("Cannot create audio player: unsupported sample bit depth %lu", 891c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi (SLuint32)df_pcm->bitsPerSample); 892c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 893c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 894c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->containerSize) { 8950d26ec3e2bb632d611ec3c752266aeb90f31bcf9Glenn Kasten case 8: 896c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case 16: 897c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 898c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // others 899c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 900337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported container size %u", 901337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten (unsigned) df_pcm->containerSize); 902c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 903c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 904c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->channelMask) { 905c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // FIXME needs work 906c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 907c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 908c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 909c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi switch (df_pcm->endianness) { 910c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_BYTEORDER_LITTLEENDIAN: 911c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 9124b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case SL_BYTEORDER_BIGENDIAN: 913337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported big-endian byte order"); 9144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten return SL_RESULT_CONTENT_UNSUPPORTED; 9154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // native is proposed but not yet in spec 916c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 917337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player: unsupported byte order %u", 918337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten (unsigned) df_pcm->endianness); 919c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 920c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } 921c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi } //case SL_DATAFORMAT_PCM 922c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 923c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATAFORMAT_MIME: 9248b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 92501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten SL_LOGE("Cannot create audio player with buffer queue data source " 92649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "without SL_DATAFORMAT_PCM format"); 927c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 928c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 9298b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten // invalid data format is detected earlier 9308b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten assert(false); 9318b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten return SL_RESULT_INTERNAL_ERROR; 93213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 93301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten } // case SL_DATALOCATOR_BUFFERQUEUE or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE 934c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi break; 935c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi //------------------ 9366fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi // URI 9376fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi case SL_DATALOCATOR_URI: 9386fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi { 939989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_URI *dl_uri = (SLDataLocator_URI *) pAudioSrc->pLocator; 940989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (NULL == dl_uri->URI) { 941989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 942989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 943989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // URI format 94413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 945989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_MIME: 946989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 947989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_PCM: 9488b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 949337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player with SL_DATALOCATOR_URI data source without " 95049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "SL_DATAFORMAT_MIME format"); 951989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 95213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 95313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoding format check 95413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) && 95513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) { 95613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 95713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 9586fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi } // case SL_DATALOCATOR_URI 9596fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi break; 9606fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi //------------------ 961989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // File Descriptor 962989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: 963989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi { 964989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // fd is already non null 96513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (sourceFormatType) { 966989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_MIME: 967989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 968989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATAFORMAT_PCM: 969989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi // FIXME implement 970a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("[ FIXME implement PCM FD data sources ]"); 971989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 9728b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATAFORMAT_RAWIMAGE: 973337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Cannot create audio player with SL_DATALOCATOR_ANDROIDFD data source " 97449e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "without SL_DATAFORMAT_MIME or SL_DATAFORMAT_PCM format"); 975989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 9768b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten default: 9778b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten // invalid data format is detected earlier 9788b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten assert(false); 9798b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten return SL_RESULT_INTERNAL_ERROR; 98013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } // switch (sourceFormatType) 98113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) && 98213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) { 98313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 98413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 985989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } // case SL_DATALOCATOR_ANDROIDFD 986989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 987989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi //------------------ 988fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi // Stream 989fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDBUFFERQUEUE: 990d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi { 991d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi switch (sourceFormatType) { 992d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi case SL_DATAFORMAT_MIME: 993fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi { 994d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pAudioSrc->pFormat; 995d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi if (SL_CONTAINERTYPE_MPEG_TS != df_mime->containerType) { 996d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SL_LOGE("Cannot create player with SL_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 997d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi "that is not fed MPEG-2 TS data"); 998d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 999d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 1000d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 1001fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi break; 1002d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi default: 1003d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SL_LOGE("Cannot create player with SL_DATALOCATOR_ANDROIDBUFFERQUEUE data source " 1004d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi "without SL_DATAFORMAT_MIME format"); 1005d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 1006d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 1007d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 1008d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi break; // case SL_DATALOCATOR_ANDROIDBUFFERQUEUE 1009fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //------------------ 1010c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi // Address 1011c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_ADDRESS: 1012c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_IODEVICE: 1013c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_OUTPUTMIX: 10148b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten case XA_DATALOCATOR_NATIVEDISPLAY: 1015c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi case SL_DATALOCATOR_MIDIBUFFERQUEUE: 101613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("Cannot create audio player with data locator type 0x%x", 101713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned) sourceLocatorType); 1018c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_CONTENT_UNSUPPORTED; 1019c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi default: 1020fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi SL_LOGE("Cannot create audio player with invalid data locator type 0x%x", 102113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (unsigned) sourceLocatorType); 1022c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 1023c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi }// switch (locatorType) 1024c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 1025c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return SL_RESULT_SUCCESS; 1026c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi} 1027c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 1028773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 10294614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 10304614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi//----------------------------------------------------------------------------- 1031d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void audioTrack_callBack_uri(int event, void* user, void *info) { 10324614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // EVENT_MORE_DATA needs to be handled with priority over the other events 10334614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // because it will be called the most often during playback 10344614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (event == android::AudioTrack::EVENT_MORE_DATA) { 103549e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack"); 10364614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // set size to 0 to signal we're not using the callback to write more data 10374614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info; 10384614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi pBuff->size = 0; 10394614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else if (NULL != user) { 10404614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi switch (event) { 104113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MARKER : 1042e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleMarker_lockPlay((CAudioPlayer *)user); 10434614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 104413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_NEW_POS : 1045e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleNewPos_lockPlay((CAudioPlayer *)user); 10464614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 104713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_UNDERRUN : 1048e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleUnderrun_lockPlay((CAudioPlayer *)user); 1049b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi break; 105013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_BUFFER_END : 105113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_LOOP_END : 105249023a839764adf67f0304e6f622d814b1729bd5Jean-Michel Trivi break; 1053e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi default: 1054e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event, 1055e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (CAudioPlayer *)user); 1056e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi break; 10574614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 10584614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 10594614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi} 10604614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1061a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 10621ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// Callback associated with an AudioTrack of an SL ES AudioPlayer that gets its data 10631ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi// from a buffer queue. 1064a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivistatic void audioTrack_callBack_pullFromBuffQueue(int event, void* user, void *info) { 1065e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)user; 10668f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi void * callbackPContext = NULL; 10676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch(event) { 10686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 106913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MORE_DATA: { 107049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack"); 10713a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten slBufferQueueCallback callback = NULL; 10721ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info; 10731ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // retrieve data from the buffer queue 1074e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi interface_lock_exclusive(&ap->mBufferQueue); 1075e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mBufferQueue.mState.count != 0) { 1076e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi //SL_LOGV("nbBuffers in queue = %lu",ap->mBufferQueue.mState.count); 1077e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear); 10781ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 1079e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi BufferHeader *oldFront = ap->mBufferQueue.mFront; 1080d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *newFront = &oldFront[1]; 10811ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10821ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // FIXME handle 8bit based on buffer format 10831ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi short *pSrc = (short*)((char *)oldFront->mBuffer 1084e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi + ap->mBufferQueue.mSizeConsumed); 1085e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi if (ap->mBufferQueue.mSizeConsumed + pBuff->size < oldFront->mSize) { 10861ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // can't consume the whole or rest of the buffer in one shot 1087e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mSizeConsumed += pBuff->size; 10881ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // leave pBuff->size untouched 10891ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // consume data 10903a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // FIXME can we avoid holding the lock during the copy? 10911ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi memcpy (pBuff->i16, pSrc, pBuff->size); 10921ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } else { 10931ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // finish consuming the buffer or consume the buffer in one shot 1094e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi pBuff->size = oldFront->mSize - ap->mBufferQueue.mSizeConsumed; 1095e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mSizeConsumed = 0; 10961ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 10971ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi if (newFront == 1098e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi &ap->mBufferQueue.mArray 1099e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi [ap->mBufferQueue.mNumBuffers + 1]) 11001ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi { 1101e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi newFront = ap->mBufferQueue.mArray; 11021ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1103e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mFront = newFront; 11041ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 1105e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mState.count--; 1106e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mBufferQueue.mState.playIndex++; 11071ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11081ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // consume data 11093a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // FIXME can we avoid holding the lock during the copy? 11101ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi memcpy (pBuff->i16, pSrc, pBuff->size); 11111ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11121ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi // data has been consumed, and the buffer queue state has been updated 111306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi // we will notify the client if applicable 1114e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi callback = ap->mBufferQueue.mCallback; 11153a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // save callback data 1116e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi callbackPContext = ap->mBufferQueue.mContext; 11171ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1118e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi } else { // empty queue 1119e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // signal no data available 11201ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi pBuff->size = 0; 1121e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 1122e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // signal we're at the end of the content, but don't pause (see note in function) 1123fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_headAtEnd_lockPlay(ap, false /*set state to paused?*/, false); 1124e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi 1125a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // signal underflow to prefetch status itf 1126a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 1127fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_UNDERFLOW, 1128fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten false); 1129a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 1130a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 1131e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // stop the track so it restarts playing faster when new data is enqueued 1132e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi ap->mAudioTrack->stop(); 11331ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 1134e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi interface_unlock_exclusive(&ap->mBufferQueue); 113506a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi // notify client 11368f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi if (NULL != callback) { 1137e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi (*callback)(&ap->mBufferQueue.mItf, callbackPContext); 11388f4f78fd27806e013065e675a7cf056172d9b6dcJean-Michel Trivi } 11396a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 11406a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 11411ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 114213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_MARKER: 1143e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleMarker_lockPlay(ap); 11444614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11456a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 114613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_NEW_POS: 1147e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleNewPos_lockPlay(ap); 11484614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11496a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 115013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case android::AudioTrack::EVENT_UNDERRUN: 1151e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi audioTrack_handleUnderrun_lockPlay(ap); 11524614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi break; 11536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 11546a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 1155e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // FIXME where does the notification of SL_PLAYEVENT_HEADMOVING fit? 1156b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event, 1157b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi (CAudioPlayer *)user); 11586a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 11591ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi } 11601ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi} 11611ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11621ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 11631ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi//----------------------------------------------------------------------------- 116413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviSLresult android_audioPlayer_create(CAudioPlayer *pAudioPlayer) { 1165773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1166c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 116713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // pAudioPlayer->mAndroidObjType has been set in audioPlayer_getAndroidObjectTypeForSourceSink() 116813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (INVALID_TYPE == pAudioPlayer->mAndroidObjType) { 116913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi audioPlayer_setInvalid(pAudioPlayer); 1170c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 117113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 1172c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi 117313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mpLock = new android::Mutex(); 117413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED; 117513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE; 117613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAudioTrack = NULL; 117713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // not needed, as placement new (explicit constructor) already does this 117813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // pAudioPlayer->mSfPlayer.clear(); 1179de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi 118013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mSessionId = android::AudioSystem::newAudioSessionId(); 11813d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi 118213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromVolLevel = 1.0f; 118313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromStereoPos[0] = 1.0f; 118413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromStereoPos[1] = 1.0f; 118513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mDirectLevel = 0; // no attenuation 118613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value 118713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAuxSendLevel = 0; 1188e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 118913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // initialize interface-specific fields that can be used regardless of whether the 119013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // interface is exposed on the AudioPlayer or not 119113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // (empty section, as all initializations are the same as the defaults) 119213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 119324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 1194c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi return result; 1195773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi} 1196773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1197a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1198a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi//----------------------------------------------------------------------------- 119975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_setConfig(CAudioPlayer *ap, const SLchar *configKey, 120075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi const void *pConfigValue, SLuint32 valueSize) { 120175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 120275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 120375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 120475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL == ap) { 120575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 120675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if (NULL == pConfigValue) { 120775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_NULL_PARAM); 120875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 120975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) { 121175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 121275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type 121375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (KEY_STREAM_TYPE_PARAMSIZE > valueSize) { 121475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW); 121575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 121675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 121775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = audioPlayer_setStreamType(ap, *(SLuint32*)pConfigValue); 121875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 121975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 122175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY); 122275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 122375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 122475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 122675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 122775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 122975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 123075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel TriviSLresult android_audioPlayer_getConfig(CAudioPlayer* ap, const SLchar *configKey, 123175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLuint32* pValueSize, void *pConfigValue) { 123275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 123375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 123475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 123575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL == ap) { 123675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return SL_RESULT_INTERNAL_ERROR; 123775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if (NULL == pValueSize) { 123875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_NULL_PARAM); 123975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 124075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 124175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else if(strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) { 124275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 124375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi // stream type 124475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (KEY_STREAM_TYPE_PARAMSIZE > *pValueSize) { 124575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW); 124675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 124775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 124875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi *pValueSize = KEY_STREAM_TYPE_PARAMSIZE; 124975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi if (NULL != pConfigValue) { 125075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = audioPlayer_getStreamType(ap, (SLint32*)pConfigValue); 125175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 125275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 125375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 125475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } else { 125575e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY); 125675e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 125775e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi } 125875e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 125975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi return result; 126075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi} 126175e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 126275e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi 126375e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi//----------------------------------------------------------------------------- 1264d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async) { 1265a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1266a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1267a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGV("Realize pAudioPlayer=%p", pAudioPlayer); 1268b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi 1269a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi switch (pAudioPlayer->mAndroidObjType) { 1270a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi //----------------------------------- 1271a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // AudioTrack 1272f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1273a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi { 12741fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // initialize platform-specific CAudioPlayer fields 12751fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 1276a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLDataLocator_BufferQueue *dl_bq = (SLDataLocator_BufferQueue *) 1277a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi pAudioPlayer->mDynamicSource.mDataSource; 1278a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *) 1279a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi pAudioPlayer->mDynamicSource.mDataSource->pFormat; 1280a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1281a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi uint32_t sampleRate = sles_to_android_sampleRate(df_pcm->samplesPerSec); 1282a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 12834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi pAudioPlayer->mAudioTrack = new android::AudioTrack( 128475e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi pAudioPlayer->mStreamType, // streamType 1285a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi sampleRate, // sampleRate 1286a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi sles_to_android_sampleFormat(df_pcm->bitsPerSample), // format 12871d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten sles_to_android_channelMaskOut(df_pcm->numChannels, df_pcm->channelMask), 12881d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten //channel mask 12891ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi 0, // frameCount (here min) 1290a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 0, // flags 1291a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi audioTrack_callBack_pullFromBuffQueue, // callback 1292a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi (void *) pAudioPlayer, // user 12931bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi 0 // FIXME find appropriate frame count // notificationFrame 12941bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi , pAudioPlayer->mSessionId 12951bdb242fcdff06d4dfbf8a69a54a63e9f843fdb0Jean-Michel Trivi ); 1296337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten android::status_t status = pAudioPlayer->mAudioTrack->initCheck(); 1297337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten if (status != android::NO_ERROR) { 1298337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("AudioTrack::initCheck status %u", status); 12996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi result = SL_RESULT_CONTENT_UNSUPPORTED; 1300a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 13011fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 13021fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // initialize platform-independent CAudioPlayer fields 13031fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 13041fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi pAudioPlayer->mNumChannels = df_pcm->numChannels; 1305a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi pAudioPlayer->mSampleRateMilliHz = df_pcm->samplesPerSec; // Note: bad field name in SL ES 13063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 13073ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_READY; 130813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 130913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1310a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi //----------------------------------- 1311a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi // MediaPlayer 1312b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 131380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 1314f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 13153ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED; 13163ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mNumChannels = 0; 13173ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mSampleRateMilliHz = 0; 13183ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mAudioTrack = NULL; 13193ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 13203ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi AudioPlayback_Parameters app; 13213ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.sessionId = pAudioPlayer->mSessionId; 13223ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.streamType = pAudioPlayer->mStreamType; 13233ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.trackcb = audioTrack_callBack_uri; 13243ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi app.trackcbUser = (void *) pAudioPlayer; 13253ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 13263ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi pAudioPlayer->mSfPlayer = new android::SfPlayer(&app); 1327a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi pAudioPlayer->mSfPlayer->setNotifListener(sfplayer_handlePrefetchEvent, 1328ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi (void*)pAudioPlayer /*notifUSer*/); 1329ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi pAudioPlayer->mSfPlayer->armLooper(); 13308a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 1331de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 13326fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi 1333989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) { 1334989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_URI: 1335989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mSfPlayer->setDataSource( 1336989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI); 1337989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 1338989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: { 1339989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset; 1340989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mSfPlayer->setDataSource( 1341989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (int)pAudioPlayer->mDataSource.mLocator.mFD.fd, 1342989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 134397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 1344989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length); 134513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 134613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1347989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi default: 13483ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR); 1349989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi break; 1350989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 1351f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 135213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 135313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 135413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 135513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // StreamPlayer 135613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_TS_ABQ: { 1357fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 1358fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 1359581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi android_StreamPlayer_realize_l(pAudioPlayer, sfplayer_handlePrefetchEvent, 1360581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi (void*)pAudioPlayer); 1361fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi 1362fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 136313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 136413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 136513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 136613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // AudioToCbRenderer 136713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: { 136813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_lock_exclusive(&pAudioPlayer->mObject); 136913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 137013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioPlayback_Parameters app; 137113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi app.sessionId = pAudioPlayer->mSessionId; 137213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi app.streamType = pAudioPlayer->mStreamType; 137313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 137413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi android::AudioToCbRenderer* decoder = new android::AudioToCbRenderer(&app); 137513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer = decoder; 137613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataPushListener(adecoder_writeToBufferQueue, (void*)pAudioPlayer); 137713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->init(sfplayer_handlePrefetchEvent, (void*)pAudioPlayer); 137813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 137913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) { 138013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_URI: 138113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataSource( 138213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI); 138313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 138413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case SL_DATALOCATOR_ANDROIDFD: { 138513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset; 138613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decoder->setDataSource( 138713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int)pAudioPlayer->mDataSource.mLocator.mFD.fd, 138813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ? 138913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset, 139013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length); 139113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 139213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 139313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 139413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR); 139513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 139613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 139713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 139813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi object_unlock_exclusive(&pAudioPlayer->mObject); 139913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 140013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1401fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 1402a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi default: 140313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERREALIZE_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType); 1404337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1405337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten break; 1406a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi } 1407a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 1408b78fe5f783209fbe1fed42634ca9889052ffcd0bJean-Michel Trivi 1409ca98a6831e18865542985b7cc97da25708b54b9cJean-Michel Trivi // proceed with effect initialization 14104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize EQ 14114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // FIXME use a table of effect descriptors when adding support for more effects 14124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (memcmp(SL_IID_EQUALIZER, &pAudioPlayer->mEqualizer.mEqDescriptor.type, 14134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 14147e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize EQ for AudioPlayer=%p", pAudioPlayer); 14153d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_eq_init(pAudioPlayer->mSessionId, &pAudioPlayer->mEqualizer); 14164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 14174be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize BassBoost 14189cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi if (memcmp(SL_IID_BASSBOOST, &pAudioPlayer->mBassBoost.mBassBoostDescriptor.type, 14199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 14207e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize BassBoost for AudioPlayer=%p", pAudioPlayer); 14213d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_bb_init(pAudioPlayer->mSessionId, &pAudioPlayer->mBassBoost); 14229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi } 14234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize Virtualizer 1424f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (memcmp(SL_IID_VIRTUALIZER, &pAudioPlayer->mVirtualizer.mVirtualizerDescriptor.type, 1425f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi sizeof(effect_uuid_t)) == 0) { 14267e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi SL_LOGV("Need to initialize Virtualizer for AudioPlayer=%p", pAudioPlayer); 14273d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi android_virt_init(pAudioPlayer->mSessionId, &pAudioPlayer->mVirtualizer); 1428f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 14297e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi 14307e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // initialize EffectSend 14317e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // FIXME initialize EffectSend 14324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 1433a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi return result; 1434a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi} 1435a852e9eca77c64fcba11eb590bec7a11aca5fe16Jean-Michel Trivi 143648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi 143748913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi//----------------------------------------------------------------------------- 1438d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) { 14396a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 14409ab6dd04be11483a9e8b58de91228b17b821eca4Jean-Michel Trivi SL_LOGV("android_audioPlayer_destroy(%p)", pAudioPlayer); 14416a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch (pAudioPlayer->mAndroidObjType) { 14426a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi //----------------------------------- 14436a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // AudioTrack 1444f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 144596ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // We own the audio track for PCM buffer queue players 144696ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten if (pAudioPlayer->mAudioTrack != NULL) { 144796ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack->stop(); 144896ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten delete pAudioPlayer->mAudioTrack; 144996ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack = NULL; 145096ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten } 14516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 14526a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi //----------------------------------- 14536a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // MediaPlayer 1454b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 145596ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten // We don't own this audio track, SfPlayer does 145696ad4989121d0119d47e4ff14f5c3341eafd64bdGlenn Kasten pAudioPlayer->mAudioTrack = NULL; 1457a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // FIXME might no longer be needed since we call explicit destructor 145813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mSfPlayer.clear(); 14596a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 1460fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 1461fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi // StreamPlayer 1462d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi case A_PLR_TS_ABQ: // intended fall-through 1463fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi //----------------------------------- 1464d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi // AudioToCbRenderer 146513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: 146613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer.clear(); 146713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 146813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //----------------------------------- 14696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 147013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERDESTROY_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType); 1471337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1472337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten break; 14736a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 14746a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1475a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // FIXME might not be needed 1476989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi pAudioPlayer->mAndroidObjType = INVALID_TYPE; 1477989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 1478a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // explicit destructor 1479a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten pAudioPlayer->mSfPlayer.~sp(); 1480f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi pAudioPlayer->mAuxEffect.~sp(); 148113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi pAudioPlayer->mAPlayer.~sp(); 14824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 14830ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi if (pAudioPlayer->mpLock != NULL) { 14840ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi delete pAudioPlayer->mpLock; 14850ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi pAudioPlayer->mpLock = NULL; 14860ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi } 14870ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi 14886a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 14896a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 14906a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 14916a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 14926a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 14938a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel TriviSLresult android_audioPlayer_setPlayRate(CAudioPlayer *ap, SLpermille rate, bool lockAP) { 1494497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 149524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uint32_t contentRate = 0; 1496497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1497f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1498b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 1499497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi // get the content sample rate 15008a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_shared(&ap->mObject); } 150124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uint32_t contentRate = sles_to_android_sampleRate(ap->mSampleRateMilliHz); 15028a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_shared(&ap->mObject); } 1503497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi // apply the SL ES playback rate on the AudioTrack as a factor of its content sample rate 15044614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (ap->mAudioTrack != NULL) { 15054614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setSampleRate(contentRate * (rate/1000.0f)); 1506497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1507497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1508497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 15094614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 1510497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1511337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Unexpected object type %d", ap->mAndroidObjType); 1512337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1513497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1514497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1515497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return result; 1516497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1517497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1518497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1519497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 1520497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held 152124430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_setPlaybackRateBehavior(CAudioPlayer *ap, 1522497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLuint32 constraints) { 1523497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1524497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1525f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1526b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 1527497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi if (constraints != (constraints & SL_RATEPROP_NOPITCHCORAUDIO)) { 1528497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi result = SL_RESULT_FEATURE_UNSUPPORTED; 1529497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1530497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1531497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1532337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten SL_LOGE("Unexpected object type %d", ap->mAndroidObjType); 1533337aff43154e6f8e2f94e569d33a5b135de70f2bGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 1534497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1535497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1536497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return result; 1537497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1538497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1539497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1540497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 1541497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi// called with no lock held 154224430c9070298f12e68b84c921add38da6ad0490Jean-Michel TriviSLresult android_audioPlayer_getCapabilitiesOfRate(CAudioPlayer *ap, 1543497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi SLuint32 *pCapabilities) { 1544497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi switch(ap->mAndroidObjType) { 1545f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1546b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 15474614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi *pCapabilities = SL_RATEPROP_NOPITCHCORAUDIO; 1548497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1549497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi default: 1550497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi *pCapabilities = 0; 1551497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi break; 1552497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi } 1553497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi return SL_RESULT_SUCCESS; 1554497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi} 1555497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1556497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi 1557497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi//----------------------------------------------------------------------------- 15588a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivivoid android_audioPlayer_setPlayState(CAudioPlayer *ap, bool lockAP) { 15598a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 15608a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_lock_shared(&ap->mObject); } 15618a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi SLuint32 playState = ap->mPlay.mState; 15628a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi AndroidObject_state objState = ap->mAndroidObjState; 15638a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi if (lockAP) { object_unlock_shared(&ap->mObject); } 15648a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi 156548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi switch(ap->mAndroidObjType) { 1566f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 15678a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch (playState) { 156848913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_STOPPED: 15693ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED"); 15703ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15713ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->stop(); 15723ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 157348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 157448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_PAUSED: 15753ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED"); 15763ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15773ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->pause(); 15783ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 157948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 158048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi case SL_PLAYSTATE_PLAYING: 15813ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING"); 15823ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 15833ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->start(); 15843ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 158548913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 158648913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi default: 1587e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // checked by caller, should not happen 1588e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 158948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi } 159048913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 159126043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1592b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 15938a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch (playState) { 15941fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi case SL_PLAYSTATE_STOPPED: { 15953ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED"); 159643e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 159743e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->stop(); 159843e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 159913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 160013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 160180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi case SL_PLAYSTATE_PAUSED: { 16023ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED"); 16038a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch(objState) { 160413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 16058a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi sfplayer_prepare(ap, lockAP); 16063ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 160713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi caseANDROID_PREPARING: 160880ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 160913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 161043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 161143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->pause(); 161243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 161380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 161480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi default: 161580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi break; 161680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi } 161713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 161813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 161980ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi case SL_PLAYSTATE_PLAYING: { 16203ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING"); 16218a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi switch(objState) { 162213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_UNINITIALIZED: 16238a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi sfplayer_prepare(ap, lockAP); 16243ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi // fall through 162513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_PREPARING: 162613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case ANDROID_READY: 16273ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if (ap->mSfPlayer != 0) { 16283ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mSfPlayer->play(); 16293ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi } 16303ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 16313ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi default: 16323ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi break; 163306a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi } 163413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 163513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 16363ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi 16376fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi default: 1638e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // checked by caller, should not happen 1639e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 16406fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi } 164148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 164226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1643d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi case A_PLR_TS_ABQ: // intended fall-through 164413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case A_PLR_URIFD_ASQ: 164513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // FIXME report and use the return code to the lock mechanism, which is where play state 164613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // changes are updated (see object_unlock_exclusive_attributes()) 164713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi aplayer_setPlayState(ap->mAPlayer, playState, &(ap->mAndroidObjState)); 164813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 164948913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi default: 165013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE(ERROR_PLAYERSETPLAYSTATE_UNEXPECTED_OBJECT_TYPE_D, ap->mAndroidObjType); 165148913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi break; 165248913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi } 165348913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi} 165448913d4519d5112319c4277d4966435fec2f551cJean-Michel Trivi 16556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 16566a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 1657d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_useEventMask(CAudioPlayer *ap) { 1658e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IPlay *pPlayItf = &ap->mPlay; 1659e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 eventFlags = pPlayItf->mEventFlags; 16604614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi /*switch(ap->mAndroidObjType) { 1661f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ:*/ 16624614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16634614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (NULL == ap->mAudioTrack) { 1664e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten return; 16654614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16664614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16674614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATMARKER) { 1668a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi ap->mAudioTrack->setMarkerPosition((uint32_t)((((int64_t)pPlayItf->mMarkerPosition 1669a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000)); 16704614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else { 16714614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // clear marker 16724614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setMarkerPosition(0); 16734614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16744614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16754614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATNEWPOS) { 167649e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten ap->mAudioTrack->setPositionUpdatePeriod( 167749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten (uint32_t)((((int64_t)pPlayItf->mPositionUpdatePeriod 167849e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000)); 16794614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } else { 16804614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // clear periodic update 16814614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi ap->mAudioTrack->setPositionUpdatePeriod(0); 16824614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16834614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16844614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADATEND) { 1685e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // nothing to do for SL_PLAYEVENT_HEADATEND, callback event will be checked against mask 16866a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 16874614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16884614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADMOVING) { 16894614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi // FIXME support SL_PLAYEVENT_HEADMOVING 1690a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("[ FIXME: IPlay_SetCallbackEventsMask(SL_PLAYEVENT_HEADMOVING) on an " 169149e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten "SL_OBJECTID_AUDIOPLAYER to be implemented ]"); 16924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16934614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi if (eventFlags & SL_PLAYEVENT_HEADSTALLED) { 1694e8c5f1974de23ca3e0a2a41a8f2bda35b554290fJean-Michel Trivi // nothing to do for SL_PLAYEVENT_HEADSTALLED, callback event will be checked against mask 16954614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi } 16964614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi 16976a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 16986a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 16996a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 17006a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi//----------------------------------------------------------------------------- 1701d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_getDuration(IPlay *pPlayItf, SLmillisecond *pDurMsec) { 1702dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis; 1703dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi switch(ap->mAndroidObjType) { 1704f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1705dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi *pDurMsec = SL_TIME_UNKNOWN; 1706dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi // FIXME if the data source is not a buffer queue, and the audio data is saved in 1707dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi // shared memory with the mixer process, the duration is the size of the buffer 1708a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGD("FIXME: android_audioPlayer_getDuration() verify if duration can be retrieved"); 1709dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi break; 1710b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: { 171143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi int64_t durationUsec = SL_TIME_UNKNOWN; 171243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 171343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi durationUsec = ap->mSfPlayer->getDurationUsec(); 171443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pDurMsec = durationUsec == -1 ? SL_TIME_UNKNOWN : durationUsec / 1000; 171543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 171613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 171713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 1718dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi default: 1719dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi break; 1720dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi } 1721dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi return SL_RESULT_SUCCESS; 1722dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi} 1723dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi 1724dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi 1725dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi//----------------------------------------------------------------------------- 1726d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivivoid android_audioPlayer_getPosition(IPlay *pPlayItf, SLmillisecond *pPosMsec) { 17276a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis; 17286a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi switch(ap->mAndroidObjType) { 1729f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 17303ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi if ((ap->mSampleRateMilliHz == 0) || (NULL == ap->mAudioTrack)) { 1731a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi *pPosMsec = 0; 1732a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi } else { 17333ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi uint32_t positionInFrames; 17343ddf7a34cc617e52a9b9a5593a0d1c5ef8d22bd9Jean-Michel Trivi ap->mAudioTrack->getPosition(&positionInFrames); 1735a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi *pPosMsec = ((int64_t)positionInFrames * 1000) / 1736a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi sles_to_android_sampleRate(ap->mSampleRateMilliHz); 1737a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi } 17386a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 1739b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 174043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 174143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pPosMsec = ap->mSfPlayer->getPositionMsec(); 174243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } else { 174343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi *pPosMsec = 0; 174443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 17456a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 17466a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi default: 17476a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi break; 17486a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 17496a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 17506a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 17516a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi 1752b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten//----------------------------------------------------------------------------- 175343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivivoid android_audioPlayer_seek(CAudioPlayer *ap, SLmillisecond posMsec) { 175443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi 175543e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi switch(ap->mAndroidObjType) { 1756f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 17576f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 1758b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 175943e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi if (ap->mSfPlayer != 0) { 176043e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi ap->mSfPlayer->seek(posMsec); 176143e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi } 17626f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 17636f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi default: 17646f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi break; 17656f0c1c280141bb49828f89c7fd1bd07238a87cb5Jean-Michel Trivi } 17663c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi} 17673c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 17683c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 17693c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi//----------------------------------------------------------------------------- 1770d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivivoid android_audioPlayer_loop(CAudioPlayer *ap, SLboolean loopEnable) { 1771d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1772b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi if ((A_PLR_URIFD == ap->mAndroidObjType) && (ap->mSfPlayer != 0)) { 1773d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi ap->mSfPlayer->loop((bool)loopEnable); 1774d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi } 1775d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi} 1776d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1777d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi 1778d94d32190f845b41f212c9c1918758e33fef6382Jean-Michel Trivi//----------------------------------------------------------------------------- 1779e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/* 1780e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Mutes or unmutes the Android media framework object associated with the CAudioPlayer that carries 1781e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * the IVolume interface. 1782e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Pre-condition: 1783e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * if ap->mMute is SL_BOOLEAN_FALSE, a call to this function was preceded by a call 1784d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi * to android_audioPlayer_volumeUpdate() 1785e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 1786d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivistatic void android_audioPlayer_setMute(CAudioPlayer* ap) { 1787de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::AudioTrack *t = NULL; 1788b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi switch(ap->mAndroidObjType) { 1789f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 1790b2aeb0f1009555181dabb944fe05901cb6e6f632Jean-Michel Trivi case A_PLR_URIFD: 17914614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi t = ap->mAudioTrack; 1792b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi break; 1793b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi default: 1794b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi break; 17956a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 1796de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi // when unmuting: volume levels have already been updated in IVolume_SetMute 1797de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi if (NULL != t) { 1798e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten t->mute(ap->mMute); 1799de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi } 1800e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} 1801e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1802e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1803e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten//----------------------------------------------------------------------------- 1804d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel TriviSLresult android_audioPlayer_volumeUpdate(CAudioPlayer* ap) { 1805d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_updateStereoVolume(ap); 1806d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_setMute(ap); 18076a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return SL_RESULT_SUCCESS; 18086a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi} 18094b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18104b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten//----------------------------------------------------------------------------- 18120ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivivoid android_audioPlayer_bufferQueue_onRefilled(CAudioPlayer *ap) { 1813a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // the AudioTrack associated with the AudioPlayer receiving audio from a PCM buffer 1814a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // queue was stopped when the queue become empty, we restart as soon as a new buffer 1815a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // has been enqueued since we're in playing state 1816b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 1817b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi ap->mAudioTrack->start(); 1818b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi } 1819a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi 1820a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // when the queue became empty, an underflow on the prefetch status itf was sent. Now the queue 1821a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi // has received new data, signal it has sufficient data 1822a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi if (IsInterfaceInitialized(&(ap->mObject), MPH_PREFETCHSTATUS)) { 1823fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten audioPlayer_dispatch_prefetchStatus_lockPrefetch(ap, SL_PREFETCHSTATUS_SUFFICIENTDATA, 1824fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten true); 1825a05622c974763d8ca038f3d39743c926309ab2c2Jean-Michel Trivi } 1826b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi} 1827b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 1828b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 1829b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi//----------------------------------------------------------------------------- 18304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/* 18314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * BufferQueue::Clear 18324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten */ 18330ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel TriviSLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *ap) { 18344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLresult result = SL_RESULT_SUCCESS; 18354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18360ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi switch (ap->mAndroidObjType) { 18374b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten //----------------------------------- 18384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // AudioTrack 1839f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi case A_PLR_PCM_BQ: 18400ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi if (NULL != ap->mAudioTrack) { 18410ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi ap->mAudioTrack->flush(); 18420ac71cb5890738ea93c26a9f567be2b523235c64Jean-Michel Trivi } 18434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 18444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten default: 18454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = SL_RESULT_INTERNAL_ERROR; 18464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 18474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 18484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 18494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten return result; 18504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten} 1851b44084fdb096a2662085af0199b69ccb0dce5c30Jean-Michel Trivi 185226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1853fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi//----------------------------------------------------------------------------- 1854d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi// abqSrc_callBack_pullFromBuffQueue is implemented in AndroidBufferQueueSource.cpp 1855fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_registerCallback_l(CAudioPlayer *ap) { 1856d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi if ((ap->mAndroidObjType == A_PLR_TS_ABQ) && (ap->mAPlayer != 0)) { 1857d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(ap->mAPlayer.get()); 1858d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi splr->registerQueueCallback( 1859eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi ap->mAndroidBufferQueue.mCallback, 1860d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi abqSrc_callBack_pullFromBuffQueue, 1861d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi (const void*)ap, true /*userIsAudioPlayer*/, 1862eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi ap->mAndroidBufferQueue.mContext, 1863eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi (const void*)&(ap->mAndroidBufferQueue.mItf)); 186426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi } 186526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi} 186626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi 1867be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi//----------------------------------------------------------------------------- 1868be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_clear_l(CAudioPlayer *ap) { 1869f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if (ap->mAndroidObjType == A_PLR_TS_ABQ) { 1870be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi android_StreamPlayer_clear_l(ap); 1871be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi } 1872be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi} 1873be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi 1874be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivivoid android_audioPlayer_androidBufferQueue_enqueue_l(CAudioPlayer *ap, 1875d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SLuint32 bufferId, SLuint32 length, SLuint32 event, void *pData) { 1876f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi if (ap->mAndroidObjType == A_PLR_TS_ABQ) { 1877be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi android_StreamPlayer_enqueue_l(ap, bufferId, length, event, pData); 1878be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi } 1879be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi} 1880