blob: 4eca3aaadde461a408fe27f95eab790273794806 [file] [log] [blame]
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001/*
2 * Copyright (C) 2011 NXP Software
3 * Copyright (C) 2011 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#define LOG_NDEBUG 1
19#define LOG_TAG "DummyAudioSource"
20#include "utils/Log.h"
21
22#include <media/stagefright/MediaErrors.h>
23#include <media/stagefright/MediaDebug.h>
24#include <media/stagefright/MediaDefs.h>
25#include <media/stagefright/MediaBuffer.h>
26#include <media/stagefright/MediaBufferGroup.h>
27#include <media/stagefright/MetaData.h>
28
29
30#include "DummyAudioSource.h"
31
32
33
34/* Android includes*/
35#include <utils/Log.h>
36#include <memory.h>
37
38
39/*---------------------*/
40/* DEBUG LEVEL SETUP */
41/*---------------------*/
42#define LOG1 LOGE /*ERRORS Logging*/
43#define LOG2 LOGV /*WARNING Logging*/
44#define LOG3 //LOGV /*COMMENTS Logging*/
45
46/*---------------------*/
47/* CONSTANTS */
48/*---------------------*/
49
50
51namespace android {
52
53
54/*---------------------*/
55/* SEEK SOURCE */
56/*---------------------*/
57
58//static
59sp<DummyAudioSource> DummyAudioSource::Create(int32_t samplingRate,
60 int32_t channelCount,
61 int64_t frameDurationUs,
62 int64_t audioDurationUs) {
63 LOG2("DummyAudioSource::Create ");
64 sp<DummyAudioSource> aSource = new DummyAudioSource (samplingRate,
65 channelCount,
66 frameDurationUs,
67 audioDurationUs);
68 return aSource;
69}
70
71
72DummyAudioSource::DummyAudioSource (int32_t samplingRate,
73 int32_t channelCount,
74 int64_t frameDurationUs,
75 int64_t audioDurationUs):
76 mSamplingRate(samplingRate),
77 mChannelCount(channelCount),
78 mFrameDurationUs(frameDurationUs),
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -080079 mNumberOfSamplePerFrame(0),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080080 mAudioDurationUs(audioDurationUs),
81 mTimeStampUs(0) ,
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -080082
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080083 mBufferGroup(NULL){
84 LOG2("DummyAudioSource::DummyAudioSource constructor START");
85 /* Do nothing here? */
86 LOG2("DummyAudioSource::DummyAudioSource");
87 LOG2("DummyAudioSource:: mSamplingRate = %d",samplingRate);
88 LOG2("DummyAudioSource:: mChannelCount = %d",channelCount);
89 LOG2("DummyAudioSource:: frameDurationUs = %lld",frameDurationUs);
90 LOG2("DummyAudioSource:: mAudioDurationUs = %lld",mAudioDurationUs);
91
92 LOG2("DummyAudioSource::DummyAudioSource constructor END");
93}
94
95
96DummyAudioSource::~DummyAudioSource () {
97 /* Do nothing here? */
98 LOG2("DummyAudioSource::~DummyAudioSource");
99}
100
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800101void DummyAudioSource::setDuration (int64_t audioDurationUs) {
102 Mutex::Autolock autoLock(mLock);
103 LOG2("SetDuration %lld", mAudioDurationUs);
104 mAudioDurationUs += audioDurationUs;
105 LOG2("SetDuration %lld", mAudioDurationUs);
106}
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800107
108status_t DummyAudioSource::start(MetaData *params) {
109 status_t err = OK;
110 LOG2("DummyAudioSource::start START");
111
112 mTimeStampUs = 0;
113 mNumberOfSamplePerFrame = (int32_t) ((1L * mSamplingRate * mFrameDurationUs)/1000000);
114 mNumberOfSamplePerFrame = mNumberOfSamplePerFrame * mChannelCount;
115
116 mBufferGroup = new MediaBufferGroup;
117 mBufferGroup->add_buffer(
118 new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t)));
119
120 LOG2("DummyAudioSource:: mNumberOfSamplePerFrame = %d",mNumberOfSamplePerFrame);
121 LOG2("DummyAudioSource::start END");
122
123 return err;
124}
125
126
127status_t DummyAudioSource::stop() {
128 status_t err = OK;
129
130 LOG2("DummyAudioSource::stop START");
131
132 delete mBufferGroup;
133 mBufferGroup = NULL;
134
135
136 LOG2("DummyAudioSource::stop END");
137
138 return err;
139}
140
141
142sp<MetaData> DummyAudioSource::getFormat() {
143 LOG2("DummyAudioSource::getFormat");
144
145 sp<MetaData> meta = new MetaData;
146
147 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
148 meta->setInt32(kKeyChannelCount, mChannelCount);
149 meta->setInt32(kKeySampleRate, mSamplingRate);
150 meta->setInt64(kKeyDuration, mFrameDurationUs);
151
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800152 meta->setCString(kKeyDecoderComponent, "DummyAudioSource");
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800153
154 return meta;
155}
156
157status_t DummyAudioSource::read( MediaBuffer **out, const MediaSource::ReadOptions *options) {
158 status_t err = OK;
159 //LOG2("DummyAudioSource::read START");
160 MediaBuffer *buffer;
161 int32_t byteCount;
162 int64_t seekTimeUs;
163 ReadOptions::SeekMode mode;
164
165 if (options && options->getSeekTo(&seekTimeUs, &mode)) {
166 CHECK(seekTimeUs >= 0);
167 mTimeStampUs = seekTimeUs;
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800168 }
169 {
170 Mutex::Autolock autoLock(mLock);
171 if (mTimeStampUs >= mAudioDurationUs) {
172 *out = NULL;
173 LOGI("EOS reached");
174 return ERROR_END_OF_STREAM;
175 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800176 }
177
178 err = mBufferGroup->acquire_buffer(&buffer);
179 if (err != OK) {
180 return err;
181 }
182
183 uint8_t *inputPtr =
184 ( uint8_t *)buffer->data() + buffer->range_offset();
185
186 //TODO: replace with memset
187 for (byteCount = 0; byteCount < (mNumberOfSamplePerFrame << 1); byteCount++) {
188 inputPtr[byteCount] = 0;
189 }
190
191 buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1));
192
193 buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs);
194 LOG2("DummyAudioSource::read Buffer_offset = %d,"
195 "Buffer_Size = %d, mTimeStampUs = %lld",
196 buffer->range_offset(),buffer->size(),mTimeStampUs);
197 mTimeStampUs = mTimeStampUs + mFrameDurationUs;
198 *out = buffer;
199 return err;
200}
201
202}// namespace android