1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17// #define LOG_NDEBUG 0 18#define LOG_TAG "DummyAudioSource" 19#include <utils/Log.h> 20#include <media/stagefright/foundation/ADebug.h> 21#include <media/stagefright/MediaErrors.h> 22#include <media/stagefright/MediaDefs.h> 23#include <media/stagefright/MediaBufferGroup.h> 24#include <media/stagefright/MetaData.h> 25#include "DummyAudioSource.h" 26 27 28namespace android { 29 30//static 31sp<DummyAudioSource> DummyAudioSource::Create( 32 int32_t samplingRate, int32_t channelCount, 33 int64_t frameDurationUs, int64_t audioDurationUs) { 34 35 ALOGV("Create "); 36 return new DummyAudioSource(samplingRate, 37 channelCount, 38 frameDurationUs, 39 audioDurationUs); 40 41} 42 43DummyAudioSource::DummyAudioSource( 44 int32_t samplingRate, int32_t channelCount, 45 int64_t frameDurationUs, int64_t audioDurationUs) 46 : mSamplingRate(samplingRate), 47 mChannelCount(channelCount), 48 mFrameDurationUs(frameDurationUs), 49 mNumberOfSamplePerFrame(0), 50 mAudioDurationUs(audioDurationUs), 51 mTimeStampUs(0), 52 mBufferGroup(NULL) { 53 54 mNumberOfSamplePerFrame = (int32_t) 55 ((1L * mSamplingRate * mFrameDurationUs)/1000000); 56 mNumberOfSamplePerFrame = mNumberOfSamplePerFrame * mChannelCount; 57 58 ALOGV("Constructor: E"); 59 ALOGV("samplingRate = %d", samplingRate); 60 ALOGV("channelCount = %d", channelCount); 61 ALOGV("frameDurationUs = %lld", frameDurationUs); 62 ALOGV("audioDurationUs = %lld", audioDurationUs); 63 ALOGV("mNumberOfSamplePerFrame = %d", mNumberOfSamplePerFrame); 64 ALOGV("Constructor: X"); 65} 66 67DummyAudioSource::~DummyAudioSource() { 68 /* Do nothing here? */ 69 ALOGV("~DummyAudioSource"); 70} 71 72void DummyAudioSource::setDuration(int64_t audioDurationUs) { 73 ALOGV("setDuration: %lld us added to %lld us", 74 audioDurationUs, mAudioDurationUs); 75 76 Mutex::Autolock autoLock(mLock); 77 mAudioDurationUs += audioDurationUs; 78} 79 80status_t DummyAudioSource::start(MetaData *params) { 81 ALOGV("start: E"); 82 status_t err = OK; 83 84 mTimeStampUs = 0; 85 86 mBufferGroup = new MediaBufferGroup; 87 mBufferGroup->add_buffer( 88 new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t))); 89 90 ALOGV("start: X"); 91 92 return err; 93} 94 95status_t DummyAudioSource::stop() { 96 ALOGV("stop"); 97 98 delete mBufferGroup; 99 mBufferGroup = NULL; 100 101 return OK; 102} 103 104 105sp<MetaData> DummyAudioSource::getFormat() { 106 ALOGV("getFormat"); 107 108 sp<MetaData> meta = new MetaData; 109 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); 110 meta->setInt32(kKeyChannelCount, mChannelCount); 111 meta->setInt32(kKeySampleRate, mSamplingRate); 112 meta->setInt64(kKeyDuration, mFrameDurationUs); 113 meta->setCString(kKeyDecoderComponent, "DummyAudioSource"); 114 115 return meta; 116} 117 118status_t DummyAudioSource::read( 119 MediaBuffer **out, const MediaSource::ReadOptions *options) { 120 121 ALOGV("read: E"); 122 123 int64_t seekTimeUs; 124 ReadOptions::SeekMode mode; 125 126 if (options && options->getSeekTo(&seekTimeUs, &mode)) { 127 CHECK(seekTimeUs >= 0); 128 mTimeStampUs = seekTimeUs; 129 } 130 131 { 132 Mutex::Autolock autoLock(mLock); 133 if (mTimeStampUs >= mAudioDurationUs) { 134 ALOGI("read: EOS reached %lld > %lld", 135 mTimeStampUs, mAudioDurationUs); 136 137 *out = NULL; 138 return ERROR_END_OF_STREAM; 139 } 140 } 141 142 MediaBuffer *buffer; 143 status_t err = mBufferGroup->acquire_buffer(&buffer); 144 if (err != OK) { 145 ALOGE("Failed to acquire buffer from mBufferGroup: %d", err); 146 return err; 147 } 148 149 memset((uint8_t *) buffer->data() + buffer->range_offset(), 150 0, mNumberOfSamplePerFrame << 1); 151 buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1)); 152 buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs); 153 154 ALOGV("read: offset = %d, size = %d, mTimeStampUs = %lld", 155 buffer->range_offset(), buffer->size(), mTimeStampUs); 156 157 mTimeStampUs = mTimeStampUs + mFrameDurationUs; 158 *out = buffer; 159 160 return OK; 161} 162 163}// namespace android 164