From d7f024206b42ae70f6dba782748f48c959a55fa9 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 3a9c7dac280f..aefd56675c8a 100644 --- a/src/audio/src/src_common.c +++ b/src/audio/src/src_common.c @@ -522,12 +522,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 71f7fc1ffa91e2c00527379e007c901f30635002 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 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/audio/src/src_common.c b/src/audio/src/src_common.c index aefd56675c8a..36847afd4491 100644 --- a/src/audio/src/src_common.c +++ b/src/audio/src/src_common.c @@ -480,6 +480,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; @@ -510,6 +511,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) { @@ -529,14 +532,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 -ENOMEM; + 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 -ENOMEM; + } } /* Clear all delay lines here */