diff options
-rw-r--r-- | media/libstagefright/AudioSource.cpp | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp index 0f1d841..72d797e 100644 --- a/media/libstagefright/AudioSource.cpp +++ b/media/libstagefright/AudioSource.cpp @@ -56,19 +56,39 @@ AudioSource::AudioSource( ALOGV("sampleRate: %d, channelCount: %d", sampleRate, channelCount); CHECK(channelCount == 1 || channelCount == 2); - AudioRecord::record_flags flags = (AudioRecord::record_flags) - (AudioRecord::RECORD_AGC_ENABLE | - AudioRecord::RECORD_NS_ENABLE | - AudioRecord::RECORD_IIR_ENABLE); - mRecord = new AudioRecord( - inputSource, sampleRate, AUDIO_FORMAT_PCM_16_BIT, - audio_channel_in_mask_from_count(channelCount), - 4 * kMaxBufferSize / sizeof(int16_t), /* Enable ping-pong buffers */ - flags, - AudioRecordCallbackFunction, - this); - - mInitCheck = mRecord->initCheck(); + + int minFrameCount; + status_t status = AudioRecord::getMinFrameCount(&minFrameCount, + sampleRate, + AUDIO_FORMAT_PCM_16_BIT, + channelCount); + if (status == OK) { + // make sure that the AudioRecord callback never returns more than the maximum + // buffer size + int frameCount = kMaxBufferSize / sizeof(int16_t) / channelCount; + + // make sure that the AudioRecord total buffer size is large enough + int bufCount = 2; + while ((bufCount * frameCount) < minFrameCount) { + bufCount++; + } + + AudioRecord::record_flags flags = (AudioRecord::record_flags) + (AudioRecord::RECORD_AGC_ENABLE | + AudioRecord::RECORD_NS_ENABLE | + AudioRecord::RECORD_IIR_ENABLE); + mRecord = new AudioRecord( + inputSource, sampleRate, AUDIO_FORMAT_PCM_16_BIT, + audio_channel_in_mask_from_count(channelCount), + bufCount * frameCount, + flags, + AudioRecordCallbackFunction, + this, + frameCount); + mInitCheck = mRecord->initCheck(); + } else { + mInitCheck = status; + } } AudioSource::~AudioSource() { |