diff options
author | Eric Laurent <elaurent@google.com> | 2012-06-12 17:09:30 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2012-06-12 17:09:30 -0700 |
commit | e49f2b424318aa8e830e7a1338e5e32ab82992f9 (patch) | |
tree | 7c524902e7e604941ffdb902d212b143c978cef2 | |
parent | 10cf121f7285e23c37264dab3bad7cffefd754b1 (diff) |
stagefright: fix AudioRecord callback buffer size
Make sure that the maximum number of frames passed to
AudioSource by the AudioRecord callback always fits within
the maximum buffer size defined by kMaxBufferSize.
Also make sure that the total AudioRecord buffer size is more
than the minimum required.
Change-Id: I26a1f998e0cf75ac88b02e67ec9d8db3c0cca193
-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 0f1d8419..72d797eb 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() { |