1643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi/*
2643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
4643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * you may not use this file except in compliance with the License.
6643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * You may obtain a copy of the License at
7643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
8643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
10643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * See the License for the specific language governing permissions and
14643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * limitations under the License.
15643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi */
16643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong// #define LOG_NDEBUG 0
18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "DummyAudioSource"
1900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <utils/Log.h>
20c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h>
21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaErrors.h>
22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBufferGroup.h>
24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h>
25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h"
26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android {
29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi//static
3100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongsp<DummyAudioSource> DummyAudioSource::Create(
3200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        int32_t samplingRate, int32_t channelCount,
3300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        int64_t frameDurationUs, int64_t audioDurationUs) {
34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
3500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("Create ");
3600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    return new DummyAudioSource(samplingRate,
3700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong                                channelCount,
3800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong                                frameDurationUs,
3900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong                                audioDurationUs);
40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
4100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong}
42100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru
4300f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyAudioSource::DummyAudioSource(
4400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        int32_t samplingRate, int32_t channelCount,
4500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        int64_t frameDurationUs, int64_t audioDurationUs)
4600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    : mSamplingRate(samplingRate),
4700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mChannelCount(channelCount),
4800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mFrameDurationUs(frameDurationUs),
4900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mNumberOfSamplePerFrame(0),
5000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mAudioDurationUs(audioDurationUs),
5100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mTimeStampUs(0),
5200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong      mBufferGroup(NULL) {
5300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
5400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    mNumberOfSamplePerFrame = (int32_t)
5500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong            ((1L * mSamplingRate * mFrameDurationUs)/1000000);
5600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    mNumberOfSamplePerFrame = mNumberOfSamplePerFrame  * mChannelCount;
57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("Constructor: E");
5900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("samplingRate = %d", samplingRate);
6000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("channelCount = %d", channelCount);
6100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("frameDurationUs = %lld", frameDurationUs);
6200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("audioDurationUs = %lld", audioDurationUs);
6300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("mNumberOfSamplePerFrame = %d", mNumberOfSamplePerFrame);
6400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("Constructor: X");
65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
6700f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyAudioSource::~DummyAudioSource() {
68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    /* Do nothing here? */
6900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("~DummyAudioSource");
70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
7200f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid DummyAudioSource::setDuration(int64_t audioDurationUs) {
7300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("setDuration: %lld us added to %lld us",
7400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        audioDurationUs, mAudioDurationUs);
7500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    Mutex::Autolock autoLock(mLock);
771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mAudioDurationUs += audioDurationUs;
781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury}
79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t DummyAudioSource::start(MetaData *params) {
8100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("start: E");
82643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t err = OK;
83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mTimeStampUs = 0;
85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mBufferGroup = new MediaBufferGroup;
87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mBufferGroup->add_buffer(
88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t)));
89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
9000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("start: X");
91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
92643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return err;
93643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t DummyAudioSource::stop() {
9600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("stop");
97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    delete mBufferGroup;
99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mBufferGroup = NULL;
100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
10100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    return OK;
102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargisp<MetaData> DummyAudioSource::getFormat() {
10600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("getFormat");
107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    sp<MetaData> meta = new MetaData;
109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    meta->setInt32(kKeyChannelCount, mChannelCount);
111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    meta->setInt32(kKeySampleRate, mSamplingRate);
112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    meta->setInt64(kKeyDuration, mFrameDurationUs);
1131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    meta->setCString(kKeyDecoderComponent, "DummyAudioSource");
114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return meta;
116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
11800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t DummyAudioSource::read(
11900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        MediaBuffer **out, const MediaSource::ReadOptions *options) {
12000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
12100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("read: E");
12200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t seekTimeUs;
124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    ReadOptions::SeekMode mode;
125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (options && options->getSeekTo(&seekTimeUs, &mode)) {
127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        CHECK(seekTimeUs >= 0);
128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mTimeStampUs = seekTimeUs;
1291c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
13000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
1311c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    {
1321c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        Mutex::Autolock autoLock(mLock);
1331c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        if (mTimeStampUs >= mAudioDurationUs) {
13400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong            ALOGI("read: EOS reached %lld > %lld",
13500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong                mTimeStampUs, mAudioDurationUs);
13600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
1371c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            *out = NULL;
1381c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            return ERROR_END_OF_STREAM;
1391c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        }
140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
14200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    MediaBuffer *buffer;
14300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    status_t err = mBufferGroup->acquire_buffer(&buffer);
144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (err != OK) {
14500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        ALOGE("Failed to acquire buffer from mBufferGroup: %d", err);
146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return err;
147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1492dbef65fea1115c53edda5bd4b40c4f49c0d06ddJames Dong    memset((uint8_t *) buffer->data() + buffer->range_offset(),
1502dbef65fea1115c53edda5bd4b40c4f49c0d06ddJames Dong            0, mNumberOfSamplePerFrame << 1);
151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1));
152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs);
15300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
15400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ALOGV("read: offset  = %d, size = %d, mTimeStampUs = %lld",
15500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong             buffer->range_offset(), buffer->size(), mTimeStampUs);
15600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mTimeStampUs = mTimeStampUs + mFrameDurationUs;
158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    *out = buffer;
15900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong
16000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    return OK;
161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}// namespace android
164