107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber/*
207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * Copyright (C) 2010 The Android Open Source Project
307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber *
407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * you may not use this file except in compliance with the License.
607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * You may obtain a copy of the License at
707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber *
807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber *
1007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * Unless required by applicable law or agreed to in writing, software
1107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * See the License for the specific language governing permissions and
1407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber * limitations under the License.
1507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber */
1607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
1707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/stagefright/AudioSource.h>
1807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
1907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/AudioRecord.h>
2007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/stagefright/MediaBufferGroup.h>
2107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/stagefright/MediaDebug.h>
2207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/stagefright/MediaDefs.h>
2307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber#include <media/stagefright/MetaData.h>
2407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
2507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Hubernamespace android {
2607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
2707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas HuberAudioSource::AudioSource(
2807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        int inputSource, uint32_t sampleRate, uint32_t channels)
2907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    : mRecord(new AudioRecord(
3007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber                inputSource, sampleRate, AudioSystem::PCM_16_BIT, channels)),
3107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber      mInitCheck(mRecord->initCheck()),
3207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber      mStarted(false),
3307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber      mGroup(NULL) {
3407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
3507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
3607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas HuberAudioSource::~AudioSource() {
3707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    if (mStarted) {
3807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        stop();
3907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    }
4007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
4107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    delete mRecord;
4207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    mRecord = NULL;
4307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
4407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
4507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstatus_t AudioSource::initCheck() const {
4607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    return mInitCheck;
4707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
4807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
4907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstatus_t AudioSource::start(MetaData *params) {
5007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    if (mStarted) {
5107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        return UNKNOWN_ERROR;
5207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    }
5307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
5407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    status_t err = mRecord->start();
5507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
5607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    if (err == OK) {
5707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        mGroup = new MediaBufferGroup;
5807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        mGroup->add_buffer(new MediaBuffer(kMaxBufferSize));
5907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
6007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        mStarted = true;
6107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    }
6207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
6307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    return err;
6407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
6507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
6607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstatus_t AudioSource::stop() {
6707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    if (!mStarted) {
6807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        return UNKNOWN_ERROR;
6907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    }
7007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
7107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    mRecord->stop();
7207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
7307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    delete mGroup;
7407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    mGroup = NULL;
7507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
7607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    mStarted = false;
7707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
7807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    return OK;
7907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
8007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
8107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Hubersp<MetaData> AudioSource::getFormat() {
8207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    sp<MetaData> meta = new MetaData;
8307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
8407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    meta->setInt32(kKeySampleRate, mRecord->getSampleRate());
8507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    meta->setInt32(kKeyChannelCount, mRecord->channelCount());
8607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    meta->setInt32(kKeyMaxInputSize, kMaxBufferSize);
8707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
8807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    return meta;
8907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
9007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
9107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huberstatus_t AudioSource::read(
9207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        MediaBuffer **out, const ReadOptions *options) {
9307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    *out = NULL;
9407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
9507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    MediaBuffer *buffer;
9607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    CHECK_EQ(mGroup->acquire_buffer(&buffer), OK);
9707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
9807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    uint32_t numFramesRecorded;
9907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    mRecord->getPosition(&numFramesRecorded);
10007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
10107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    buffer->meta_data()->setInt64(
10207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber            kKeyTime,
10307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber            (1000000ll * numFramesRecorded) / mRecord->getSampleRate()
10407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber            - mRecord->latency() * 1000);
10507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
10607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    ssize_t n = mRecord->read(buffer->data(), buffer->size());
10707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
10807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    if (n < 0) {
10907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        buffer->release();
11007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        buffer = NULL;
11107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
11207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber        return (status_t)n;
11307bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    }
11407bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
11507bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    buffer->set_range(0, n);
11607bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
11707bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    *out = buffer;
11807bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
11907bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber    return OK;
12007bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}
12107bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber
12207bf09da4a365282fc35f800b62a83e0fa5533e2Andreas Huber}  // namespace android
123