android_AudioToCbRenderer.cpp revision 167a2af67dcc0d20e6e3e995a23a0567715e0ee1
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//-------------------------------------------------------------------------------------------------- 27167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenAudioToCbRenderer::AudioToCbRenderer(const AudioPlayback_Parameters* params) : 28167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten AudioSfDecoder(params), 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf(NULL), 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser(NULL) 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 32e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()"); 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() { 38e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::~AudioToCbRenderer()"); 3913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 42f4b45a37248899ae2d27bb172f8387fbf1edff8eGlenn Kastenvoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, CAudioPlayer* pushUser) { 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf = pushCbf; 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser = pushUser; 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onRender() { 5154cad4f35a090a06e655fcc9e072e1d38f9e7689Jean-Michel Trivi SL_LOGV("AudioToCbRenderer::onRender"); 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 53e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi Mutex::Autolock _l(mBufferSourceLock); 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == mDecodeBuffer) { 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // nothing to render, move along 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting"); 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mStateFlags & kFlagPlaying) { 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != mDecodeCbf) { 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t full = mDecodeBuffer->range_length(); 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t consumed = 0; 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t offset = 0; 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi while (offset < full) { 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi consumed = mDecodeCbf( 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const uint8_t *)mDecodeBuffer->data() 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi + offset + mDecodeBuffer->range_offset(), 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->range_length() - offset, 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser); 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset += consumed; 73a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten //SL_LOGV("consumed=%u, offset=%u, full=%u", consumed, offset, full); 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (consumed == 0) { 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoded data is not being consumed, skip this buffer 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (new AMessage(kWhatDecode, id()))->post(); 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->release(); 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer = NULL; 857349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten 867349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten updateOneShot(); 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Audio output 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() { 93b4393ef4ef3edb785746c37fd7b68950e85283aeGlenn Kasten SL_LOGD("AudioToCbRenderer::createAudioSink()"); 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() { 98e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::updateAudioSink()"); 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() { 103e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::startAudioSink()"); 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() { 108e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::pauseAudioSink()"); 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 112