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