From dfa871a94f5da49a85786507b44aaeb8f743f17e Mon Sep 17 00:00:00 2001 From: Johny Lin Date: Fri, 8 Mar 2024 09:50:04 +0000 Subject: [PATCH] multiband_drc: instantaneous enabled state switch on processing In present multiband_drc design, the enabled state is determined by the switch control while multiband_drc starts to process. If the switch control toggles while processing, it will take effects on the next time multiband_drc starts to process. This commit makes change to let the enabled state update instantaneously by the switch control toggle when multiband_drc is processing. Signed-off-by: Pin-chih Lin (cherry picked from commit 8e8ff75a7669c5bb1abb281c98557e42ab1aef67) --- src/audio/multiband_drc/multiband_drc.c | 39 +++++++++---------- src/audio/multiband_drc/multiband_drc.h | 5 +++ .../multiband_drc/multiband_drc_generic.c | 8 ++-- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/audio/multiband_drc/multiband_drc.c b/src/audio/multiband_drc/multiband_drc.c index 9f95f5b888f0..47c2343912c6 100644 --- a/src/audio/multiband_drc/multiband_drc.c +++ b/src/audio/multiband_drc/multiband_drc.c @@ -126,6 +126,14 @@ static int multiband_drc_init_coef(struct processing_module *mod, int16_t nch, u comp_info(dev, "multiband_drc_init_coef(), initializing %i-way crossover", config->num_bands); + /* Crossover: determine the split function */ + cd->crossover_split = crossover_find_split_func(config->num_bands); + if (!cd->crossover_split) { + comp_err(dev, "multiband_drc_init_coef(), No crossover_split for band count(%i)", + config->num_bands); + return -EINVAL; + } + /* Crossover: collect the coef array and assign it to every channel */ crossover = config->crossover_coef; for (ch = 0; ch < nch; ch++) { @@ -328,7 +336,10 @@ static int multiband_drc_process(struct processing_module *mod, } } - cd->multiband_drc_func(mod, source, sink, frames); + if (cd->process_enabled) + cd->multiband_drc_func(mod, source, sink, frames); + else + multiband_drc_default_pass(mod, source, sink, frames); /* calc new free and available */ module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); @@ -364,32 +375,18 @@ static int multiband_drc_prepare(struct processing_module *mod, comp_dbg(dev, "multiband_drc_prepare(), source_format=%d, sink_format=%d", cd->source_format, cd->source_format); cd->config = comp_get_data_blob(cd->model_handler, NULL, NULL); - if (cd->config && cd->process_enabled) { + if (cd->config) { ret = multiband_drc_setup(mod, channels, rate); if (ret < 0) { comp_err(dev, "multiband_drc_prepare() error: multiband_drc_setup failed."); return ret; } + } - cd->multiband_drc_func = multiband_drc_find_proc_func(cd->source_format); - if (!cd->multiband_drc_func) { - comp_err(dev, "multiband_drc_prepare(), No proc func"); - return -EINVAL; - } - - cd->crossover_split = crossover_find_split_func(cd->config->num_bands); - if (!cd->crossover_split) { - comp_err(dev, "multiband_drc_prepare(), No crossover_split for band num %i", - cd->config->num_bands); - return -EINVAL; - } - } else { - comp_info(dev, "multiband_drc_prepare(), DRC is in passthrough mode"); - cd->multiband_drc_func = multiband_drc_find_proc_func_pass(cd->source_format); - if (!cd->multiband_drc_func) { - comp_err(dev, "multiband_drc_prepare(), No proc func passthrough"); - return -EINVAL; - } + cd->multiband_drc_func = multiband_drc_find_proc_func(cd->source_format); + if (!cd->multiband_drc_func) { + comp_err(dev, "multiband_drc_prepare(), No proc func"); + return -EINVAL; } return ret; diff --git a/src/audio/multiband_drc/multiband_drc.h b/src/audio/multiband_drc/multiband_drc.h index a1801f27ab6c..26ba6dcf33ae 100644 --- a/src/audio/multiband_drc/multiband_drc.h +++ b/src/audio/multiband_drc/multiband_drc.h @@ -54,6 +54,11 @@ extern const struct multiband_drc_proc_fnmap multiband_drc_proc_fnmap[]; extern const struct multiband_drc_proc_fnmap multiband_drc_proc_fnmap_pass[]; extern const size_t multiband_drc_proc_fncount; +void multiband_drc_default_pass(const struct processing_module *mod, + const struct audio_stream *source, + struct audio_stream *sink, + uint32_t frames); + /** * \brief Returns Multiband DRC processing function. */ diff --git a/src/audio/multiband_drc/multiband_drc_generic.c b/src/audio/multiband_drc/multiband_drc_generic.c index 739fd432d5f0..2a26f12f03eb 100644 --- a/src/audio/multiband_drc/multiband_drc_generic.c +++ b/src/audio/multiband_drc/multiband_drc_generic.c @@ -11,10 +11,10 @@ #include "multiband_drc.h" #include "../drc/drc_algorithm.h" -static void multiband_drc_default_pass(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames) +void multiband_drc_default_pass(const struct processing_module *mod, + const struct audio_stream *source, + struct audio_stream *sink, + uint32_t frames) { audio_stream_copy(source, 0, sink, 0, audio_stream_get_channels(source) * frames); }