summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2017-01-19 10:28:06 +0100
committerAndreas Schneider <asn@cryptomilk.org>2017-01-26 18:16:12 +0100
commit31c275d6f486edbf4cc40c8dde6b7d8fbe23aa2f (patch)
tree91a9b039b3a2ef5791ae2a24e0365011ce30acd9
parent839047a74ad0a6e99f8973fd4c1a5437a2089eca (diff)
downloadandroid_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.c19
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;