diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2017-01-19 10:28:06 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2017-01-26 18:16:12 +0100 |
commit | 31c275d6f486edbf4cc40c8dde6b7d8fbe23aa2f (patch) | |
tree | 91a9b039b3a2ef5791ae2a24e0365011ce30acd9 | |
parent | 839047a74ad0a6e99f8973fd4c1a5437a2089eca (diff) | |
download | android_device_samsung_sltexx-31c275d6f486edbf4cc40c8dde6b7d8fbe23aa2f.tar.gz android_device_samsung_sltexx-31c275d6f486edbf4cc40c8dde6b7d8fbe23aa2f.tar.xz android_device_samsung_sltexx-31c275d6f486edbf4cc40c8dde6b7d8fbe23aa2f.zip |
audio: Allocate at least period_size if buffer size is too small
-rw-r--r-- | hal/audio/audio_hw.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/hal/audio/audio_hw.c b/hal/audio/audio_hw.c index ca09b29..5ccac64 100644 --- a/hal/audio/audio_hw.c +++ b/hal/audio/audio_hw.c @@ -264,6 +264,7 @@ struct stream_in { struct resampler_itfe *resampler; struct resampler_buffer_provider buf_provider; int16_t *buffer; + size_t buffer_size; size_t frames_in; int64_t frames_read; /* total frames read, not cleared when entering standby */ int64_t last_read_time_us; @@ -1217,6 +1218,8 @@ static int start_input_stream(struct stream_in *in) } in->frames_in = 0; + in->buffer_size = 0; + /* in call routing must go through set_parameters */ if (!adev->in_call) { adev->input_source = in->input_source; @@ -1255,7 +1258,7 @@ static size_t get_input_buffer_size(unsigned int sample_rate, } static int get_next_buffer(struct resampler_buffer_provider *buffer_provider, - struct resampler_buffer* buffer) + struct resampler_buffer* buffer) { struct stream_in *in; size_t i; @@ -1275,11 +1278,19 @@ static int get_next_buffer(struct resampler_buffer_provider *buffer_provider, } if (in->frames_in == 0) { + size_t size_in_bytes = pcm_frames_to_bytes(in->pcm, + in->config->period_size); + if (in->buffer_size < in->config->period_size) { + in->buffer_size = in->config->period_size; + in->buffer = (int16_t *)realloc(in->buffer, size_in_bytes); + ALOG_ASSERT((in->buffer != NULL), + "%s: failed to reallocate read_buf", __func__); + } in->read_status = pcm_read(in->pcm, - (void*)in->buffer, - pcm_frames_to_bytes(in->pcm, in->config->period_size)); + (void *)in->buffer, + size_in_bytes); if (in->read_status != 0) { - ALOGE("get_next_buffer() pcm_read error %d", in->read_status); + ALOGE("%s: pcm_read error %d", __func__, in->read_status); buffer->raw = NULL; buffer->frame_count = 0; return in->read_status; |