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