From 525eb158643055bd5a652e824ee2db547a323504 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sun, 16 Jan 2022 14:15:22 +0000 Subject: recording: fix mono mode mixdown functions Rewrite copy_buffer_mono_* functions for correctness. Bad pointer arithmetic in copy_buffer_mono_l produced wrong results, or panics on archs which can't handle the unaligned pointer. None of the functions handled zero size copies properly though this probably wasn't an issue in practice. Change-Id: I81c894e1b8a3440cb409092bec07fe3778a78959 --- apps/recorder/pcm_record.c | 48 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 32 deletions(-) (limited to 'apps/recorder/pcm_record.c') diff --git a/apps/recorder/pcm_record.c b/apps/recorder/pcm_record.c index 9b0e779485..ef10f8a433 100644 --- a/apps/recorder/pcm_record.c +++ b/apps/recorder/pcm_record.c @@ -878,53 +878,37 @@ copy_buffer_mono_lr(void *dst, const void *src, size_t src_size) ssize_t copy_size = src_size; /* mono = (L + R) / 2 */ - do - { - *d++ = ((int32_t){s[0]} + s[1] + 1) >> 1; - s+=2; + while(copy_size > 0) { + *d++ = ((int32_t)s[0] + (int32_t)s[1] + 1) >> 1; + s += 2; + copy_size -= PCM_SAMP_SIZE; } - while ((copy_size -= PCM_SAMP_SIZE) > 0); return dst; } -/* Copy with mono conversion - output 1/2 size of input */ static void * ICODE_ATTR -copy_buffer_mono_r(void *dst, const void *src, size_t src_size) +copy_buffer_mono_l(void *dst, const void *src, size_t src_size) { - int16_t *d = (int16_t*)dst; - int16_t const *s = (int16_t const*)src - 1; + int16_t *d = (int16_t*) dst; + int16_t const *s = (int16_t const*) src; ssize_t copy_size = src_size; - /* mono = R */ - do - *d++ = *(s += 2); - while ((copy_size -= PCM_SAMP_SIZE) > 0); + + /* mono = L */ + while(copy_size > 0) { + *d++ = *s; + s += 2; + copy_size -= PCM_SAMP_SIZE; + } return dst; } -#if 1 -static void * ICODE_ATTR -copy_buffer_mono_l(void *dst, const void *src, size_t src_size) -{ - return copy_buffer_mono_r(dst, src -1, src_size); -} -#else -/* Copy with mono conversion - output 1/2 size of input */ static void * ICODE_ATTR -copy_buffer_mono_l(void *dst, const void *src, size_t src_size) +copy_buffer_mono_r(void *dst, const void *src, size_t src_size) { - int16_t *d = (int16_t*)dst; - int16_t const *s = (int16_t const*)src - 2; - ssize_t copy_size = src_size; - /* mono = L */ - do - *d++ = *(s += 2); - while ((copy_size -= PCM_SAMP_SIZE) > 0); - - return dst; + return copy_buffer_mono_l(dst, src + 2, src_size); } -#endif /** pcm_rec_* group **/ -- cgit v1.2.3