Home | History | Annotate | Download | only in lvpp
      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 
     28 namespace android {
     29 
     30 //static
     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 
     41 }
     42 
     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) {
     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 
     67 DummyAudioSource::~DummyAudioSource() {
     68     /* Do nothing here? */
     69     ALOGV("~DummyAudioSource");
     70 }
     71 
     72 void 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 
     80 status_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 
     95 status_t DummyAudioSource::stop() {
     96     ALOGV("stop");
     97 
     98     delete mBufferGroup;
     99     mBufferGroup = NULL;
    100 
    101     return OK;
    102 }
    103 
    104 
    105 sp<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 
    118 status_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