From 2c33b4d76ab340107760ab931e34c22d08f8b3e2 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Mon, 16 Mar 2026 11:44:41 +0100 Subject: [PATCH 1/2] src: cosmetic: simplify an invalid configuration check The condition delay_lines_size == 0 in src_params_general() can trigger if cd->param.total == 0 or if cd->param.total == -1. However, the latter is supposedly invalid and should be checked in a more generic non-negativity test, so here it suffices to just check cd->param.total != 0 before delay_lines_size is calculated. Signed-off-by: Guennadi Liakhovetski --- src/audio/src/src_common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/audio/src/src_common.c b/src/audio/src/src_common.c index a8f91c11e100..9ef6140194a0 100644 --- a/src/audio/src/src_common.c +++ b/src/audio/src/src_common.c @@ -523,12 +523,12 @@ int src_params_general(struct processing_module *mod, * be aligned to 8 bytes as required by some Xtensa * instructions (e.g AE_L32X2F24_XC) */ - delay_lines_size = ALIGN_UP(sizeof(int32_t) * cd->param.total, 8); - if (delay_lines_size == 0) { - comp_err(dev, "delay_lines_size = 0"); + if (cd->param.total == 0) { + comp_err(dev, "configuration failed: total size = 0"); return -EINVAL; } + delay_lines_size = ALIGN_UP(sizeof(int32_t) * cd->param.total, 8); /* free any existing delay lines. TODO reuse if same size */ mod_free(mod, cd->delay_lines); From cb8bbf9bd096bafa6e90bc96c29fae1b05318323 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Tue, 17 Mar 2026 17:28:52 +0100 Subject: [PATCH 2/2] audio: src: only allocate delay lines if size changes If the delay line size hasn't changed no need to re-allocate the buffer. Also use size_t for some byte-size variables and structure members. Signed-off-by: Guennadi Liakhovetski --- src/audio/src/src_common.c | 19 ++++++++++++------- src/audio/src/src_common.h | 26 +++++++++++++------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/audio/src/src_common.c b/src/audio/src/src_common.c index 9ef6140194a0..66ddaaa466d6 100644 --- a/src/audio/src/src_common.c +++ b/src/audio/src/src_common.c @@ -481,6 +481,7 @@ int src_params_general(struct processing_module *mod, struct comp_data *cd = module_get_private_data(mod); struct comp_dev *dev = mod->dev; size_t delay_lines_size; + size_t old_total; int32_t *buffer_start; int n; int err; @@ -511,6 +512,8 @@ int src_params_general(struct processing_module *mod, cd->source_frames = dev->frames * cd->source_rate / cd->sink_rate; cd->sink_frames = dev->frames; + old_total = cd->param.total; + /* Allocate needed memory for delay lines */ err = src_buffer_lengths(dev, cd, cd->channels_count); if (err < 0) { @@ -530,14 +533,16 @@ int src_params_general(struct processing_module *mod, } delay_lines_size = ALIGN_UP(sizeof(int32_t) * cd->param.total, 8); - /* free any existing delay lines. TODO reuse if same size */ - mod_free(mod, cd->delay_lines); + if (!cd->delay_lines || old_total != cd->param.total) { + /* free any existing delay lines */ + mod_free(mod, cd->delay_lines); - cd->delay_lines = mod_alloc(mod, delay_lines_size); - if (!cd->delay_lines) { - comp_err(dev, "failed to alloc cd->delay_lines, delay_lines_size = %zu", - delay_lines_size); - return -EINVAL; + cd->delay_lines = mod_alloc(mod, delay_lines_size); + if (!cd->delay_lines) { + comp_err(dev, "failed to alloc cd->delay_lines, delay_lines_size = %zu", + delay_lines_size); + return -EINVAL; + } } /* Clear all delay lines here */ diff --git a/src/audio/src/src_common.h b/src/audio/src/src_common.h index ae3c60574eec..09fcb7e7cc74 100644 --- a/src/audio/src/src_common.h +++ b/src/audio/src/src_common.h @@ -21,25 +21,25 @@ struct src_stage { int idm; int odm; int num_of_subfilters; - int subfilter_length; - int filter_length; - int blk_in; - int blk_out; + size_t subfilter_length; + size_t filter_length; + size_t blk_in; + size_t blk_out; int halfband; int shift; const void *coefs; /* Can be int16_t or int32_t depending on config */ }; struct src_param { - int fir_s1; - int fir_s2; - int out_s1; - int out_s2; - int sbuf_length; - int src_multich; - int total; - int blk_in; - int blk_out; + size_t fir_s1; + size_t fir_s2; + size_t out_s1; + size_t out_s2; + size_t sbuf_length; + size_t src_multich; + size_t total; + size_t blk_in; + size_t blk_out; int stage1_times; int stage2_times; int idx_in;