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