android_AudioToCbRenderer.cpp revision a8179ea15c4ff78db589d742b135649f0eda7ef2
113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * you may not use this file except in compliance with the License. 613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * You may obtain a copy of the License at 713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 1013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * See the License for the specific language governing permissions and 1413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * limitations under the License. 1513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 1613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 17e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 1813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "sles_allinclusive.h" 202b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android/android_AudioToCbRenderer.h" 2113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h> 234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::AudioToCbRenderer(AudioPlayback_Parameters* params) : AudioSfDecoder(params), 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf(NULL), 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser(NULL) 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 31e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()"); 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() { 37e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::~AudioToCbRenderer()"); 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, void* pushUser) { 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf = pushCbf; 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser = pushUser; 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onPrepare() { 49e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::onPrepare()"); 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioSfDecoder::onPrepare(); 51e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onRender() { 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("AudioToCbRenderer::onRender"); 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi Mutex::Autolock _l(mDecodeBufferLock); 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == mDecodeBuffer) { 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // nothing to render, move along 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting"); 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mStateFlags & kFlagPlaying) { 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != mDecodeCbf) { 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t full = mDecodeBuffer->range_length(); 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t consumed = 0; 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t offset = 0; 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi while (offset < full) { 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi consumed = mDecodeCbf( 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const uint8_t *)mDecodeBuffer->data() 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi + offset + mDecodeBuffer->range_offset(), 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->range_length() - offset, 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser); 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset += consumed; 78a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten //SL_LOGV("consumed=%u, offset=%u, full=%u", consumed, offset, full); 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (consumed == 0) { 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoded data is not being consumed, skip this buffer 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (new AMessage(kWhatDecode, id()))->post(); 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->release(); 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer = NULL; 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Audio output 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() { 96e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::createAudioSink()"); 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("sample rate = %d nb channels = %d", mSampleRateHz, mNumChannels); 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() { 102e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::updateAudioSink()"); 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mAudioSource != 0) { 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<MetaData> meta = mAudioSource->getFormat(); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("old sample rate = %d", mSampleRateHz); 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CHECK(meta->findInt32(kKeyChannelCount, &mNumChannels)); 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CHECK(meta->findInt32(kKeySampleRate, &mSampleRateHz)); 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("new sample rate = %d", mSampleRateHz); 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() { 116e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::startAudioSink()"); 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() { 121e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::pauseAudioSink()"); 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 125