blob: edabaf9ec66451d0c16707220179e66b2422bdb9 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <media/stagefright/AudioSource.h>
#include <media/AudioRecord.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
namespace android {
AudioSource::AudioSource(
int inputSource, uint32_t sampleRate, uint32_t channels)
: mRecord(new AudioRecord(
inputSource, sampleRate, AudioSystem::PCM_16_BIT, channels)),
mInitCheck(mRecord->initCheck()),
mStarted(false),
mGroup(NULL) {
}
AudioSource::~AudioSource() {
if (mStarted) {
stop();
}
delete mRecord;
mRecord = NULL;
}
status_t AudioSource::initCheck() const {
return mInitCheck;
}
status_t AudioSource::start(MetaData *params) {
if (mStarted) {
return UNKNOWN_ERROR;
}
status_t err = mRecord->start();
if (err == OK) {
mGroup = new MediaBufferGroup;
mGroup->add_buffer(new MediaBuffer(kMaxBufferSize));
mStarted = true;
}
return err;
}
status_t AudioSource::stop() {
if (!mStarted) {
return UNKNOWN_ERROR;
}
mRecord->stop();
delete mGroup;
mGroup = NULL;
mStarted = false;
return OK;
}
sp<MetaData> AudioSource::getFormat() {
sp<MetaData> meta = new MetaData;
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
meta->setInt32(kKeySampleRate, mRecord->getSampleRate());
meta->setInt32(kKeyChannelCount, mRecord->channelCount());
meta->setInt32(kKeyMaxInputSize, kMaxBufferSize);
return meta;
}
status_t AudioSource::read(
MediaBuffer **out, const ReadOptions *options) {
*out = NULL;
MediaBuffer *buffer;
CHECK_EQ(mGroup->acquire_buffer(&buffer), OK);
uint32_t numFramesRecorded;
mRecord->getPosition(&numFramesRecorded);
buffer->meta_data()->setInt64(
kKeyTime,
(1000000ll * numFramesRecorded) / mRecord->getSampleRate()
- mRecord->latency() * 1000);
ssize_t n = mRecord->read(buffer->data(), buffer->size());
if (n < 0) {
buffer->release();
buffer = NULL;
return (status_t)n;
}
buffer->set_range(0, n);
*out = buffer;
return OK;
}
} // namespace android