android_AudioToCbRenderer.cpp revision e9236d046fdb5cac0696c42e03443a2439188146
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"
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{
28e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()");
2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}
3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() {
34e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("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() {
46e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("AudioToCbRenderer::onPrepare()");
4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    AudioSfDecoder::onPrepare();
48e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("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() {
93e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("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() {
99e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("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() {
113e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("AudioToCbRenderer::startAudioSink()");
11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}
11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() {
118e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("AudioToCbRenderer::pauseAudioSink()");
11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}
12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android
122