android_AudioToCbRenderer.cpp revision 13837cf3f7be0eb8b1a9552bd99a89f98c987720
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 1713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#define USE_LOG SLAndroidLogLevel_Verbose 1813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "sles_allinclusive.h" 2013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 2213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::AudioToCbRenderer(AudioPlayback_Parameters* params) : AudioSfDecoder(params), 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf(NULL), 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser(NULL) 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::AudioToCbRenderer()"); 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() { 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::~AudioToCbRenderer()"); 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, void* pushUser) { 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf = pushCbf; 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser = pushUser; 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onPrepare() { 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::onPrepare()"); 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AudioSfDecoder::onPrepare(); 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onRender() { 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("AudioToCbRenderer::onRender"); 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi Mutex::Autolock _l(mDecodeBufferLock); 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == mDecodeBuffer) { 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // nothing to render, move along 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting"); 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mStateFlags & kFlagPlaying) { 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != mDecodeCbf) { 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t full = mDecodeBuffer->range_length(); 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t consumed = 0; 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t offset = 0; 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi while (offset < full) { 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi consumed = mDecodeCbf( 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const uint8_t *)mDecodeBuffer->data() 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi + offset + mDecodeBuffer->range_offset(), 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->range_length() - offset, 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser); 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset += consumed; 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //SL_LOGV("consumed=%lu, offset=%lu, full=%lu", consumed, offset, full); 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (consumed == 0) { 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoded data is not being consumed, skip this buffer 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (new AMessage(kWhatDecode, id()))->post(); 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->release(); 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer = NULL; 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Audio output 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() { 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::createAudioSink()"); 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("sample rate = %d nb channels = %d", mSampleRateHz, mNumChannels); 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() { 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::updateAudioSink()"); 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mAudioSource != 0) { 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<MetaData> meta = mAudioSource->getFormat(); 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("old sample rate = %d", mSampleRateHz); 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CHECK(meta->findInt32(kKeyChannelCount, &mNumChannels)); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CHECK(meta->findInt32(kKeySampleRate, &mSampleRateHz)); 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("new sample rate = %d", mSampleRateHz); 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() { 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::startAudioSink()"); 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() { 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("AudioToCbRenderer::pauseAudioSink()"); 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 122