Merge "stagefright: fix AudioRecord callback buffer size" into jb-dev
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 @@
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() {