1dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi/*
2dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
3dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
4dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * you may not use this file except in compliance with the License.
6dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * You may obtain a copy of the License at
7dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
8dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi *
10dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * See the License for the specific language governing permissions and
14dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi * limitations under the License.
15dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi */
16dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
1730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose
18dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
19dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi#include "sles_allinclusive.h"
20d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#include "android/android_AudioToCbRenderer.h"
21dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
228ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h>
238ad101d5bcaca289da3d820e2b87b5da55e560f9Jean-Michel Trivi
24dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivinamespace android {
25dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
26dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
27dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviAudioToCbRenderer::AudioToCbRenderer(AudioPlayback_Parameters* params) : AudioSfDecoder(params),
28dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDecodeCbf(NULL),
29dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        mDecodeUser(NULL)
30dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi{
3130ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("AudioToCbRenderer::AudioToCbRenderer()");
32dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
33dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
34dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
35dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
36dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel TriviAudioToCbRenderer::~AudioToCbRenderer() {
3730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("AudioToCbRenderer::~AudioToCbRenderer()");
38dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
39dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
40dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
41819ab3a683b0a94471fcb32b4cf9977d8a5086e8Glenn Kastenvoid AudioToCbRenderer::setDataPushListener(const data_push_cbf_t pushCbf, CAudioPlayer* pushUser) {
42dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDecodeCbf = pushCbf;
43dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDecodeUser = pushUser;
44dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
45dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
46dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
47dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Event handlers
48dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
49dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::onRender() {
50347285f59e4aa7a062f67c4ae3a854cbdacb6378Jean-Michel Trivi    SL_LOGV("AudioToCbRenderer::onRender");
51dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
521209c173a13a62d0f7d9f1d605e3665a5818fa90Jean-Michel Trivi    Mutex::Autolock _l(mBufferSourceLock);
53dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
54dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (NULL == mDecodeBuffer) {
55dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        // nothing to render, move along
56dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        //SL_LOGV("AudioToCbRenderer::onRender NULL buffer, exiting");
57dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        return;
58dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
59dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
60dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    if (mStateFlags & kFlagPlaying) {
61dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        if (NULL != mDecodeCbf) {
62dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            size_t full = mDecodeBuffer->range_length();
63dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            size_t consumed = 0;
64dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            size_t offset = 0;
65dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            while (offset < full) {
66dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                consumed = mDecodeCbf(
67dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                        (const uint8_t *)mDecodeBuffer->data()
68dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                                + offset + mDecodeBuffer->range_offset(),
69dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                        mDecodeBuffer->range_length() - offset,
70dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                        mDecodeUser);
71dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                offset += consumed;
721c17ec55f629fdab909ab16d94e014f098369110Glenn Kasten                //SL_LOGV("consumed=%u, offset=%u, full=%u", consumed, offset, full);
73dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                if (consumed == 0) {
74dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                    // decoded data is not being consumed, skip this buffer
75dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                    break;
76dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi                }
77dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi            }
78dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        }
79dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi        (new AMessage(kWhatDecode, id()))->post();
80dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    }
81dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
82dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDecodeBuffer->release();
83dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi    mDecodeBuffer = NULL;
84becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten
85becfe88080f47bce3206836abf738ffddeb5cc47Glenn Kasten    updateOneShot();
86dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
87dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
88dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
89dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi//--------------------------------------------------
90dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi// Audio output
91dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::createAudioSink() {
92e851581e7a62192f69626b9a0d2e5380a4d3979cGlenn Kasten    SL_LOGD("AudioToCbRenderer::createAudioSink()");
93dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
94dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
95dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
96dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::updateAudioSink() {
9730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("AudioToCbRenderer::updateAudioSink()");
98dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
99dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
100dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
101dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::startAudioSink() {
10230ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("AudioToCbRenderer::startAudioSink()");
103dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
104dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
105dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
106dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivivoid AudioToCbRenderer::pauseAudioSink() {
10730ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi    SL_LOGD("AudioToCbRenderer::pauseAudioSink()");
108dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi}
109dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi
110dff1b1fc1f687c544e19df56bef225c45f7256a9Jean-Michel Trivi} // namespace android
111