1643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi/* 2643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 3643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 4643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 5643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * you may not use this file except in compliance with the License. 6643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * You may obtain a copy of the License at 7643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 8643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 9643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 10643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 11643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 12643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * See the License for the specific language governing permissions and 14643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * limitations under the License. 15643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi */ 16643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong// #define LOG_NDEBUG 0 18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "DummyAudioSource" 1900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <utils/Log.h> 20c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h> 21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaErrors.h> 22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBufferGroup.h> 24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h> 25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h" 26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android { 29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi//static 3100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongsp<DummyAudioSource> DummyAudioSource::Create( 3200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t samplingRate, int32_t channelCount, 3300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int64_t frameDurationUs, int64_t audioDurationUs) { 34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 3500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Create "); 3600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return new DummyAudioSource(samplingRate, 3700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong channelCount, 3800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong frameDurationUs, 3900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong audioDurationUs); 40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 4100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 42100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru 4300f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyAudioSource::DummyAudioSource( 4400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t samplingRate, int32_t channelCount, 4500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int64_t frameDurationUs, int64_t audioDurationUs) 4600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong : mSamplingRate(samplingRate), 4700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mChannelCount(channelCount), 4800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFrameDurationUs(frameDurationUs), 4900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mNumberOfSamplePerFrame(0), 5000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioDurationUs(audioDurationUs), 5100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mTimeStampUs(0), 5200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mBufferGroup(NULL) { 5300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 5400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mNumberOfSamplePerFrame = (int32_t) 5500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ((1L * mSamplingRate * mFrameDurationUs)/1000000); 5600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mNumberOfSamplePerFrame = mNumberOfSamplePerFrame * mChannelCount; 57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Constructor: E"); 5900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("samplingRate = %d", samplingRate); 6000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("channelCount = %d", channelCount); 6100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("frameDurationUs = %lld", frameDurationUs); 6200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("audioDurationUs = %lld", audioDurationUs); 6300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("mNumberOfSamplePerFrame = %d", mNumberOfSamplePerFrame); 6400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Constructor: X"); 65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6700f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyAudioSource::~DummyAudioSource() { 68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* Do nothing here? */ 6900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("~DummyAudioSource"); 70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 7200f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid DummyAudioSource::setDuration(int64_t audioDurationUs) { 7300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("setDuration: %lld us added to %lld us", 7400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong audioDurationUs, mAudioDurationUs); 7500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioDurationUs += audioDurationUs; 781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t DummyAudioSource::start(MetaData *params) { 8100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("start: E"); 82643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = OK; 83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeStampUs = 0; 85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mBufferGroup = new MediaBufferGroup; 87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mBufferGroup->add_buffer( 88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi new MediaBuffer(mNumberOfSamplePerFrame * sizeof(int16_t))); 89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("start: X"); 91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 92643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 93643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t DummyAudioSource::stop() { 9600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("stop"); 97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mBufferGroup; 99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mBufferGroup = NULL; 100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 10100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargisp<MetaData> DummyAudioSource::getFormat() { 10600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("getFormat"); 107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = new MetaData; 109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); 110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi meta->setInt32(kKeyChannelCount, mChannelCount); 111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi meta->setInt32(kKeySampleRate, mSamplingRate); 112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi meta->setInt64(kKeyDuration, mFrameDurationUs); 1131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury meta->setCString(kKeyDecoderComponent, "DummyAudioSource"); 114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return meta; 116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 11800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t DummyAudioSource::read( 11900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MediaBuffer **out, const MediaSource::ReadOptions *options) { 12000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 12100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: E"); 12200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t seekTimeUs; 124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ReadOptions::SeekMode mode; 125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (options && options->getSeekTo(&seekTimeUs, &mode)) { 127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(seekTimeUs >= 0); 128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeStampUs = seekTimeUs; 1291c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 13000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1311c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury { 1321c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 1331c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mTimeStampUs >= mAudioDurationUs) { 13400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGI("read: EOS reached %lld > %lld", 13500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mTimeStampUs, mAudioDurationUs); 13600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1371c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury *out = NULL; 1381c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return ERROR_END_OF_STREAM; 1391c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 14200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MediaBuffer *buffer; 14300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t err = mBufferGroup->acquire_buffer(&buffer); 144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 14500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGE("Failed to acquire buffer from mBufferGroup: %d", err); 146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1492dbef65fea1115c53edda5bd4b40c4f49c0d06ddJames Dong memset((uint8_t *) buffer->data() + buffer->range_offset(), 1502dbef65fea1115c53edda5bd4b40c4f49c0d06ddJames Dong 0, mNumberOfSamplePerFrame << 1); 151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi buffer->set_range(buffer->range_offset(), (mNumberOfSamplePerFrame << 1)); 152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi buffer->meta_data()->setInt64(kKeyTime, mTimeStampUs); 15300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 15400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: offset = %d, size = %d, mTimeStampUs = %lld", 15500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong buffer->range_offset(), buffer->size(), mTimeStampUs); 15600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeStampUs = mTimeStampUs + mFrameDurationUs; 158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *out = buffer; 15900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 16000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}// namespace android 164