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) | |
download | frameworks_av-e49f2b424318aa8e830e7a1338e5e32ab82992f9.zip frameworks_av-e49f2b424318aa8e830e7a1338e5e32ab82992f9.tar.gz frameworks_av-e49f2b424318aa8e830e7a1338e5e32ab82992f9.tar.bz2 |
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 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() { |