Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 1 | /* |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 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 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 17 | // #define LOG_NDEBUG 0 |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 18 | #define LOG_TAG "DummyAudioSource" |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 19 | #include <utils/Log.h> |
James Dong | c4689fa | 2012-02-08 13:51:46 -0800 | [diff] [blame] | 20 | #include <media/stagefright/foundation/ADebug.h> |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 21 | #include <media/stagefright/MediaErrors.h> |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 22 | #include <media/stagefright/MediaDefs.h> |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 23 | #include <media/stagefright/MediaBufferGroup.h> |
| 24 | #include <media/stagefright/MetaData.h> |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 25 | #include "DummyAudioSource.h" |
| 26 | |
| 27 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 28 | namespace android { |
| 29 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 30 | //static |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 31 | sp<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 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 41 | } |
| 42 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 43 | DummyAudioSource::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) { |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 53 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 54 | mNumberOfSamplePerFrame = (int32_t) |
| 55 | ((1L * mSamplingRate * mFrameDurationUs)/1000000); |
| 56 | mNumberOfSamplePerFrame = mNumberOfSamplePerFrame * mChannelCount; |
Basavapatna Dattaguru | 100d018 | 2011-03-04 09:48:24 -0800 | [diff] [blame] | 57 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 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 | |
| 67 | DummyAudioSource::~DummyAudioSource() { |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 68 | /* Do nothing here? */ |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 69 | ALOGV("~DummyAudioSource"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 70 | } |
| 71 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 72 | void DummyAudioSource::setDuration(int64_t audioDurationUs) { |
| 73 | ALOGV("setDuration: %lld us added to %lld us", |
| 74 | audioDurationUs, mAudioDurationUs); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 75 | |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 76 | Mutex::Autolock autoLock(mLock); |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 77 | mAudioDurationUs += audioDurationUs; |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 78 | } |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 79 | |
| 80 | status_t DummyAudioSource::start(MetaData *params) { |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 81 | ALOGV("start: E"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 82 | status_t err = OK; |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 83 | |
| 84 | mTimeStampUs = 0; |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 85 | |
| 86 | mBufferGroup = new MediaBufferGroup; |
| 87 | mBufferGroup->add_buffer( |
| 88 | new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t))); |
| 89 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 90 | ALOGV("start: X"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 91 | |
| 92 | return err; |
| 93 | } |
| 94 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 95 | status_t DummyAudioSource::stop() { |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 96 | ALOGV("stop"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 97 | |
| 98 | delete mBufferGroup; |
| 99 | mBufferGroup = NULL; |
| 100 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 101 | return OK; |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 102 | } |
| 103 | |
| 104 | |
| 105 | sp<MetaData> DummyAudioSource::getFormat() { |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 106 | ALOGV("getFormat"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 107 | |
| 108 | sp<MetaData> meta = new MetaData; |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 109 | meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); |
| 110 | meta->setInt32(kKeyChannelCount, mChannelCount); |
| 111 | meta->setInt32(kKeySampleRate, mSamplingRate); |
| 112 | meta->setInt64(kKeyDuration, mFrameDurationUs); |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 113 | meta->setCString(kKeyDecoderComponent, "DummyAudioSource"); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 114 | |
| 115 | return meta; |
| 116 | } |
| 117 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 118 | status_t DummyAudioSource::read( |
| 119 | MediaBuffer **out, const MediaSource::ReadOptions *options) { |
| 120 | |
| 121 | ALOGV("read: E"); |
| 122 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 123 | int64_t seekTimeUs; |
| 124 | ReadOptions::SeekMode mode; |
| 125 | |
| 126 | if (options && options->getSeekTo(&seekTimeUs, &mode)) { |
| 127 | CHECK(seekTimeUs >= 0); |
| 128 | mTimeStampUs = seekTimeUs; |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 129 | } |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 130 | |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 131 | { |
| 132 | Mutex::Autolock autoLock(mLock); |
| 133 | if (mTimeStampUs >= mAudioDurationUs) { |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 134 | ALOGI("read: EOS reached %lld > %lld", |
| 135 | mTimeStampUs, mAudioDurationUs); |
| 136 | |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 137 | *out = NULL; |
Rajneesh Chowdury | 1c97d9a | 2011-02-21 15:43:33 -0800 | [diff] [blame] | 138 | return ERROR_END_OF_STREAM; |
| 139 | } |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 140 | } |
| 141 | |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 142 | MediaBuffer *buffer; |
| 143 | status_t err = mBufferGroup->acquire_buffer(&buffer); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 144 | if (err != OK) { |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 145 | ALOGE("Failed to acquire buffer from mBufferGroup: %d", err); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 146 | return err; |
| 147 | } |
| 148 | |
James Dong | 2dbef65 | 2011-05-02 18:12:22 -0700 | [diff] [blame] | 149 | memset((uint8_t *) buffer->data() + buffer->range_offset(), |
| 150 | 0, mNumberOfSamplePerFrame << 1); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 151 | buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1)); |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 152 | buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs); |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 153 | |
| 154 | ALOGV("read: offset = %d, size = %d, mTimeStampUs = %lld", |
| 155 | buffer->range_offset(), buffer->size(), mTimeStampUs); |
| 156 | |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 157 | mTimeStampUs = mTimeStampUs + mFrameDurationUs; |
| 158 | *out = buffer; |
James Dong | 00f742c | 2012-01-13 17:34:42 -0800 | [diff] [blame] | 159 | |
| 160 | return OK; |
Dharmaray Kundargi | 643290d | 2011-01-16 16:02:42 -0800 | [diff] [blame] | 161 | } |
| 162 | |
| 163 | }// namespace android |