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