1dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/* 2dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 3dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * 4dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * you may not use this file except in compliance with the License. 6dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * You may obtain a copy of the License at 7dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * 8dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * 10dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * See the License for the specific language governing permissions and 14dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * limitations under the License. 15dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */ 16dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 1730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 18dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 19dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi#include "sles_allinclusive.h" 20d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#include "android/android_AudioToCbRenderer.h" 21dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 228ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h> 238ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi 24dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivinamespace android { 25dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 26dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 27dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviAudioToCbRenderer::AudioToCbRenderer(AudioPlayback_Parameters* params) : AudioSfDecoder(params), 28dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeCbf(NULL), 29dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeUser(NULL) 30dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{ 3130ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()"); 32dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 33dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 34dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 35dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 36dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() { 3730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("AudioToCbRenderer::~AudioToCbRenderer()"); 38dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 39dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 40dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 41819ab3a683b0a94471fcb32b4cf9977d8a5086e8Glenn Kastenvoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, CAudioPlayer* pushUser) { 42dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeCbf = pushCbf; 43dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeUser = pushUser; 44dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 45dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 46dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//-------------------------------------------------- 47dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Event handlers 48dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 49dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::onRender() { 50347285f59e4aa7a062f67c4ae3a854cbdacb6378Jean-Michel Trivi SL_LOGV("AudioToCbRenderer::onRender"); 51dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 521209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi Mutex::Autolock _l(mBufferSourceLock); 53dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 54dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi if (NULL == mDecodeBuffer) { 55dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi // nothing to render, move along 56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting"); 57dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi return; 58dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi } 59dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 60dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi if (mStateFlags & kFlagPlaying) { 61dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi if (NULL != mDecodeCbf) { 62dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi size_t full = mDecodeBuffer->range_length(); 63dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi size_t consumed = 0; 64dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi size_t offset = 0; 65dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi while (offset < full) { 66dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi consumed = mDecodeCbf( 67dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi (const uint8_t *)mDecodeBuffer->data() 68dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi + offset + mDecodeBuffer->range_offset(), 69dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeBuffer->range_length() - offset, 70dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeUser); 71dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi offset += consumed; 721c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten //SL_LOGV("consumed=%u, offset=%u, full=%u", consumed, offset, full); 73dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi if (consumed == 0) { 74dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi // decoded data is not being consumed, skip this buffer 75dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi break; 76dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi } 77dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi } 78dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi } 79dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi (new AMessage(kWhatDecode, id()))->post(); 80dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi } 81dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 82dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeBuffer->release(); 83dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi mDecodeBuffer = NULL; 84becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten 85becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten updateOneShot(); 86dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 87dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 88dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 89dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//-------------------------------------------------- 90dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Audio output 91dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() { 92e851581e7a62192f69626b9a0d2e5380a4d3979cGlenn Kasten SL_LOGD("AudioToCbRenderer::createAudioSink()"); 93dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 94dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 95dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 96dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() { 9730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("AudioToCbRenderer::updateAudioSink()"); 98dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 99dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 100dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 101dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() { 10230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("AudioToCbRenderer::startAudioSink()"); 103dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 104dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 105dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 106dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() { 10730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("AudioToCbRenderer::pauseAudioSink()"); 108dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} 109dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi 110dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android 111