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> 23d67d2393c62827a91f84b1eed83a789387cff032Lajos Molnar#include <media/stagefright/MediaBuffer.h> 244ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 28167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenAudioToCbRenderer::AudioToCbRenderer(const AudioPlayback_Parameters* params) : 29167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten AudioSfDecoder(params), 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf(NULL), 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser(NULL) 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 33e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()"); 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() { 39e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::~AudioToCbRenderer()"); 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 43f4b45a37248899ae2d27bb172f8387fbf1edff8eGlenn Kastenvoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, CAudioPlayer* pushUser) { 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeCbf = pushCbf; 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser = pushUser; 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::onRender() { 5254cad4f35a090a06e655fcc9e072e1d38f9e7689Jean-Michel Trivi SL_LOGV("AudioToCbRenderer::onRender"); 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 54e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi Mutex::Autolock _l(mBufferSourceLock); 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == mDecodeBuffer) { 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // nothing to render, move along 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting"); 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mStateFlags & kFlagPlaying) { 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL != mDecodeCbf) { 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t full = mDecodeBuffer->range_length(); 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t consumed = 0; 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t offset = 0; 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi while (offset < full) { 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi consumed = mDecodeCbf( 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (const uint8_t *)mDecodeBuffer->data() 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi + offset + mDecodeBuffer->range_offset(), 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->range_length() - offset, 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeUser); 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi offset += consumed; 74a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten //SL_LOGV("consumed=%u, offset=%u, full=%u", consumed, offset, full); 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (consumed == 0) { 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // decoded data is not being consumed, skip this buffer 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8152e35b2c9f25450452ab422c46737a7fb5b67380Lajos Molnar (new AMessage(kWhatDecode, this))->post(); 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer->release(); 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDecodeBuffer = NULL; 867349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten 877349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten updateOneShot(); 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Audio output 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() { 94b4393ef4ef3edb785746c37fd7b68950e85283aeGlenn Kasten SL_LOGD("AudioToCbRenderer::createAudioSink()"); 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() { 99e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::updateAudioSink()"); 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() { 104e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::startAudioSink()"); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() { 109e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("AudioToCbRenderer::pauseAudioSink()"); 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 113