1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
4a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * you may not use this file except in compliance with the License.
6a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * You may obtain a copy of the License at
7a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
8a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
10a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * See the License for the specific language governing permissions and
14a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * limitations under the License.
15a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
16a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
17a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk// #define LOG_NDEBUG 0
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk#define LOG_TAG "DummyAudioSource"
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk#include <utils/Log.h>
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk#include <media/stagefright/foundation/ADebug.h>
214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk#include <media/stagefright/MediaErrors.h>
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk#include <media/stagefright/MediaDefs.h>
230c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk#include <media/stagefright/MediaBufferGroup.h>
244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk#include <media/stagefright/MetaData.h>
254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk#include "DummyAudioSource.h"
264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouknamespace android {
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk//static
314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouksp<DummyAudioSource> DummyAudioSource::Create(
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int32_t samplingRate, int32_t channelCount,
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int64_t frameDurationUs, int64_t audioDurationUs) {
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ALOGV("Create ");
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    return new DummyAudioSource(samplingRate,
37dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk                                channelCount,
38dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk                                frameDurationUs,
39dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk                                audioDurationUs);
40dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
41dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk}
42dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
43dd1da451159578d865230ceada3e1f0058e3c18eAlex SakhartchoukDummyAudioSource::DummyAudioSource(
44dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        int32_t samplingRate, int32_t channelCount,
45dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        int64_t frameDurationUs, int64_t audioDurationUs)
46dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    : mSamplingRate(samplingRate),
47dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mChannelCount(channelCount),
48dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mFrameDurationUs(frameDurationUs),
49dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mNumberOfSamplePerFrame(0),
50dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mAudioDurationUs(audioDurationUs),
51dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mTimeStampUs(0),
52dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk      mBufferGroup(NULL) {
535c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk
545c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    mNumberOfSamplePerFrame = (int32_t)
550c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk            ((1L * mSamplingRate * mFrameDurationUs)/1000000);
560c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    mNumberOfSamplePerFrame = mNumberOfSamplePerFrame  * mChannelCount;
57dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ALOGV("Constructor: E");
590c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("samplingRate = %d", samplingRate);
600c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("channelCount = %d", channelCount);
610c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("frameDurationUs = %lld", frameDurationUs);
620c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("audioDurationUs = %lld", audioDurationUs);
630c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("mNumberOfSamplePerFrame = %d", mNumberOfSamplePerFrame);
640c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("Constructor: X");
650c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk}
660c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex SakhartchoukDummyAudioSource::~DummyAudioSource() {
684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    /* Do nothing here? */
694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ALOGV("~DummyAudioSource");
704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk}
714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukvoid DummyAudioSource::setDuration(int64_t audioDurationUs) {
734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ALOGV("setDuration: %lld us added to %lld us",
744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        audioDurationUs, mAudioDurationUs);
754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    Mutex::Autolock autoLock(mLock);
774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    mAudioDurationUs += audioDurationUs;
78c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk}
794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukstatus_t DummyAudioSource::start(MetaData *params) {
814fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ALOGV("start: E");
824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    status_t err = OK;
834fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    mTimeStampUs = 0;
850c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
860c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    mBufferGroup = new MediaBufferGroup;
870c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    mBufferGroup->add_buffer(
885c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk            new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t)));
890c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
905c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    ALOGV("start: X");
915c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk
925c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    return err;
930c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk}
940c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
950c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchoukstatus_t DummyAudioSource::stop() {
960c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("stop");
970c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
980c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    delete mBufferGroup;
990c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    mBufferGroup = NULL;
1000c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1010c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    return OK;
1020c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk}
1030c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1040c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1054fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouksp<MetaData> DummyAudioSource::getFormat() {
1060c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("getFormat");
1074fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1084fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    sp<MetaData> meta = new MetaData;
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    meta->setInt32(kKeyChannelCount, mChannelCount);
1110c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    meta->setInt32(kKeySampleRate, mSamplingRate);
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    meta->setInt64(kKeyDuration, mFrameDurationUs);
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    meta->setCString(kKeyDecoderComponent, "DummyAudioSource");
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    return meta;
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
117dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
1180c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchoukstatus_t DummyAudioSource::read(
1190c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk        MediaBuffer **out, const MediaSource::ReadOptions *options) {
1200c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1210c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("read: E");
1220c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1230c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    int64_t seekTimeUs;
124dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    ReadOptions::SeekMode mode;
125dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
1265c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    if (options && options->getSeekTo(&seekTimeUs, &mode)) {
1275c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk        CHECK(seekTimeUs >= 0);
1285c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk        mTimeStampUs = seekTimeUs;
1295c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    }
1305c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk
1315c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    {
1325c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk        Mutex::Autolock autoLock(mLock);
1335c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk        if (mTimeStampUs >= mAudioDurationUs) {
1340c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk            ALOGI("read: EOS reached %lld > %lld",
135dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk                mTimeStampUs, mAudioDurationUs);
1360c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1370c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk            *out = NULL;
1380c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk            return ERROR_END_OF_STREAM;
139dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        }
140dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    }
1410c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1420c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    MediaBuffer *buffer;
1430c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    status_t err = mBufferGroup->acquire_buffer(&buffer);
144452889a29671e63114dc2ab873597bdc5701f97bAlex Sakhartchouk    if (err != OK) {
1450c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk        ALOGE("Failed to acquire buffer from mBufferGroup: %d", err);
1460c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk        return err;
1470c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    }
1480c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
149452889a29671e63114dc2ab873597bdc5701f97bAlex Sakhartchouk    memset((uint8_t *) buffer->data() + buffer->range_offset(),
150452889a29671e63114dc2ab873597bdc5701f97bAlex Sakhartchouk            0, mNumberOfSamplePerFrame << 1);
1510c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1));
1525c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk    buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs);
1530c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk
1540c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk    ALOGV("read: offset  = %d, size = %d, mTimeStampUs = %lld",
1550c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk             buffer->range_offset(), buffer->size(), mTimeStampUs);
156dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    mTimeStampUs = mTimeStampUs + mFrameDurationUs;
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    *out = buffer;
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    return OK;
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
163}// namespace android
164