From de81c52353eaaa659669345eaa958b12c35c9ecc Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Mon, 22 May 2023 15:59:16 +0300 Subject: [PATCH 1/2] Audio: Multiband-DRC: Convert to module adapter This patch replaces legacy component API with new module adapter API. There are no changes to functionality. Signed-off-by: Seppo Ingalsuo --- src/audio/multiband_drc/multiband_drc.c | 519 ++++++++---------- .../multiband_drc/multiband_drc_generic.c | 14 +- src/include/sof/audio/component.h | 2 +- .../sof/audio/multiband_drc/multiband_drc.h | 15 +- tools/testbench/common_test.c | 2 +- 5 files changed, 237 insertions(+), 315 deletions(-) diff --git a/src/audio/multiband_drc/multiband_drc.c b/src/audio/multiband_drc/multiband_drc.c index a84a55de94b1..a23a6eebc830 100644 --- a/src/audio/multiband_drc/multiband_drc.c +++ b/src/audio/multiband_drc/multiband_drc.c @@ -4,36 +4,37 @@ // // Author: Pin-chih Lin -#include +#include #include #include #include +#include #include -#include #include -#include -#include +#include #include -#include -#include #include #include -#include #include -#include -#include -#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include #include -static const struct comp_driver comp_multiband_drc; +LOG_MODULE_REGISTER(multiband_drc, CONFIG_SOF_LOG_LEVEL); /* 0d9f2256-8e4f-47b3-8448-239a334f1191 */ DECLARE_SOF_RT_UUID("multiband_drc", multiband_drc_uuid, 0x0d9f2256, 0x8e4f, 0x47b3, @@ -101,8 +102,10 @@ static int multiband_drc_eq_init_coef_ch(struct sof_eq_iir_biquad *coef, return 0; } -static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t nch, uint32_t rate) +static int multiband_drc_init_coef(struct processing_module *mod, int16_t nch, uint32_t rate) { + struct comp_dev *dev = mod->dev; + struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct sof_eq_iir_biquad *crossover; struct sof_eq_iir_biquad *emphasis; struct sof_eq_iir_biquad *deemphasis; @@ -112,7 +115,7 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n int i, ch, ret, num_bands; if (!config) { - comp_cl_err(&comp_multiband_drc, "multiband_drc_init_coef(), no config is set"); + comp_err(dev, "multiband_drc_init_coef(), no config is set"); return -EINVAL; } @@ -120,21 +123,18 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n /* Sanity checks */ if (nch > PLATFORM_MAX_CHANNELS) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), invalid channels count(%i)", - nch); + comp_err(dev, + "multiband_drc_init_coef(), invalid channels count(%i)", nch); return -EINVAL; } if (config->num_bands > SOF_MULTIBAND_DRC_MAX_BANDS) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), invalid bands count(%i)", - config->num_bands); + comp_err(dev, "multiband_drc_init_coef(), invalid bands count(%i)", + config->num_bands); return -EINVAL; } - comp_cl_info(&comp_multiband_drc, - "multiband_drc_init_coef(), initializing %i-way crossover", - config->num_bands); + comp_info(dev, "multiband_drc_init_coef(), initializing %i-way crossover", + config->num_bands); /* Crossover: collect the coef array and assign it to every channel */ crossover = config->crossover_coef; @@ -143,14 +143,13 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n config->num_bands); /* Free all previously allocated blocks in case of an error */ if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), could not assign coeffs to ch %d", - ch); + comp_err(dev, + "multiband_drc_init_coef(), could not assign coeffs to ch %d", ch); goto err; } } - comp_cl_info(&comp_multiband_drc, "multiband_drc_init_coef(), initializing emphasis_eq"); + comp_info(dev, "multiband_drc_init_coef(), initializing emphasis_eq"); /* Emphasis: collect the coef array and assign it to every channel */ emphasis = config->emp_coef; @@ -158,14 +157,13 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n ret = multiband_drc_eq_init_coef_ch(emphasis, &state->emphasis[ch]); /* Free all previously allocated blocks in case of an error */ if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), could not assign coeffs to ch %d", - ch); + comp_err(dev, "multiband_drc_init_coef(), could not assign coeffs to ch %d", + ch); goto err; } } - comp_cl_info(&comp_multiband_drc, "multiband_drc_init_coef(), initializing deemphasis_eq"); + comp_info(dev, "multiband_drc_init_coef(), initializing deemphasis_eq"); /* Deemphasis: collect the coef array and assign it to every channel */ deemphasis = config->deemp_coef; @@ -173,30 +171,27 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n ret = multiband_drc_eq_init_coef_ch(deemphasis, &state->deemphasis[ch]); /* Free all previously allocated blocks in case of an error */ if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), could not assign coeffs to ch %d", - ch); + comp_err(dev, "multiband_drc_init_coef(), could not assign coeffs to ch %d", + ch); goto err; } } /* Allocate all DRC pre-delay buffers and set delay time with band number */ for (i = 0; i < num_bands; i++) { - comp_cl_info(&comp_multiband_drc, - "multiband_drc_init_coef(), initializing drc band %d", i); + comp_info(dev, "multiband_drc_init_coef(), initializing drc band %d", i); ret = drc_init_pre_delay_buffers(&state->drc[i], (size_t)sample_bytes, (int)nch); if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), could not init pre delay buffers"); + comp_err(dev, + "multiband_drc_init_coef(), could not init pre delay buffers"); goto err; } ret = drc_set_pre_delay_time(&state->drc[i], cd->config->drc_coef[i].pre_delay_time, rate); if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_init_coef(), could not set pre delay time"); + comp_err(dev, "multiband_drc_init_coef(), could not set pre delay time"); goto err; } } @@ -208,15 +203,16 @@ static int multiband_drc_init_coef(struct multiband_drc_comp_data *cd, int16_t n return ret; } -static int multiband_drc_setup(struct multiband_drc_comp_data *cd, int16_t channels, uint32_t rate) +static int multiband_drc_setup(struct processing_module *mod, int16_t channels, uint32_t rate) { + struct multiband_drc_comp_data *cd = module_get_private_data(mod); int ret; /* Reset any previous state */ multiband_drc_reset_state(&cd->state); /* Setup Crossover, Emphasis EQ, Deemphasis EQ, and DRC */ - ret = multiband_drc_init_coef(cd, channels, rate); + ret = multiband_drc_init_coef(mod, channels, rate); if (ret < 0) return ret; @@ -227,124 +223,133 @@ static int multiband_drc_setup(struct multiband_drc_comp_data *cd, int16_t chann * End of Multiband DRC setup code. Next the standard component methods. */ -static struct comp_dev *multiband_drc_new(const struct comp_driver *drv, - const struct comp_ipc_config *config, - const void *spec) +static int multiband_drc_init(struct processing_module *mod) { - struct comp_dev *dev = NULL; - struct multiband_drc_comp_data *cd = NULL; - const struct ipc_config_process *ipc_multiband_drc = spec; - size_t bs = ipc_multiband_drc->size; + struct module_data *md = &mod->priv; + struct comp_dev *dev = mod->dev; + struct module_config *cfg = &md->cfg; + struct multiband_drc_comp_data *cd; + size_t bs = cfg->size; int ret; - comp_cl_info(&comp_multiband_drc, "multiband_drc_new()"); + comp_info(dev, "multiband_drc_init()"); /* Check first before proceeding with dev and cd that coefficients * blob size is sane. */ if (bs > SOF_MULTIBAND_DRC_MAX_BLOB_SIZE) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_new(), error: configuration blob size = %u > %d", - bs, SOF_MULTIBAND_DRC_MAX_BLOB_SIZE); - return NULL; + comp_err(dev, "multiband_drc_init(), error: configuration blob size = %u > %d", + bs, SOF_MULTIBAND_DRC_MAX_BLOB_SIZE); + return -EINVAL; } - dev = comp_alloc(drv, sizeof(*dev)); - if (!dev) - return NULL; - dev->ipc_config = *config; - cd = rzalloc(SOF_MEM_ZONE_RUNTIME, 0, SOF_MEM_CAPS_RAM, sizeof(*cd)); if (!cd) - goto fail; - - comp_set_drvdata(dev, cd); + return -ENOMEM; - cd->process_enabled = false; + md->private = cd; cd->multiband_drc_func = NULL; cd->crossover_split = NULL; +#if CONFIG_IPC_MAJOR_4 + /* Note: Currently there is no ALSA switch control in IPC4 to control + * processing on/off. This workaround can be removed after is available. + * Binary control for configuration blob can be used instead. There is + * no processing bypass control in the blob but all processing can be + * switched to neutral with supported min. 2-band mode. + */ + cd->process_enabled = true; +#else + cd->process_enabled = false; +#endif /* Handler for configuration data */ cd->model_handler = comp_data_blob_handler_new(dev); if (!cd->model_handler) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_new(): comp_data_blob_handler_new() failed."); + comp_err(dev, "multiband_drc_init(): comp_data_blob_handler_new() failed."); + ret = -ENOMEM; goto cd_fail; } /* Get configuration data and reset DRC state */ - ret = comp_init_data_blob(cd->model_handler, bs, ipc_multiband_drc->data); + ret = comp_init_data_blob(cd->model_handler, bs, cfg->data); if (ret < 0) { - comp_cl_err(&comp_multiband_drc, - "multiband_drc_new(): comp_init_data_blob() failed."); + comp_err(dev, "multiband_drc_init(): comp_init_data_blob() failed."); goto cd_fail; } multiband_drc_reset_state(&cd->state); - dev->state = COMP_STATE_READY; - return dev; + return 0; cd_fail: comp_data_blob_handler_free(cd->model_handler); rfree(cd); -fail: - rfree(dev); - return NULL; + return ret; } -static void multiband_drc_free(struct comp_dev *dev) +static int multiband_drc_free(struct processing_module *mod) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); - comp_info(dev, "multiband_drc_free()"); + comp_info(mod->dev, "multiband_drc_free()"); comp_data_blob_handler_free(cd->model_handler); rfree(cd); - rfree(dev); + return 0; } -static int multiband_drc_params(struct comp_dev *dev, struct sof_ipc_stream_params *params) +#if CONFIG_IPC_MAJOR_3 +static int multiband_drc_cmd_set_value(struct processing_module *mod, + struct sof_ipc_ctrl_data *cdata) { - int ret; + struct comp_dev *dev = mod->dev; + struct multiband_drc_comp_data *cd = module_get_private_data(mod); - comp_dbg(dev, "multiband_drc_params()"); - - comp_dbg(dev, "multiband_drc_verify_params()"); - ret = comp_verify_params(dev, 0, params); - if (ret < 0) { - comp_err(dev, "multiband_drc_params(): comp_verify_params() failed."); - return -EINVAL; + switch (cdata->cmd) { + case SOF_CTRL_CMD_SWITCH: + comp_dbg(dev, "multiband_drc_multiband_drc_cmd_set_value(), SOF_CTRL_CMD_SWITCH"); + if (cdata->num_elems == 1) { + cd->process_enabled = cdata->chanv[0].value; + comp_info(dev, "multiband_drc_cmd_set_value(), process_enabled = %d", + cd->process_enabled); + return 0; + } } - /* All configuration work is postponed to prepare(). */ - return 0; + comp_err(mod->dev, "cmd_set_value() error: invalid cdata->cmd"); + return -EINVAL; } +#endif -static int multiband_drc_cmd_get_data(struct comp_dev *dev, - struct sof_ipc_ctrl_data *cdata, - int max_size) +static int multiband_drc_set_config(struct processing_module *mod, uint32_t config_id, + enum module_cfg_fragment_position pos, + uint32_t data_offset_size, const uint8_t *fragment, + size_t fragment_size, uint8_t *response, + size_t response_size) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); - int ret = 0; + struct multiband_drc_comp_data *cd = module_get_private_data(mod); - switch (cdata->cmd) { - case SOF_CTRL_CMD_BINARY: - comp_dbg(dev, "multiband_drc_cmd_get_data(), SOF_CTRL_CMD_BINARY"); - ret = comp_data_blob_get_cmd(cd->model_handler, cdata, max_size); - break; - default: - comp_err(dev, "multiband_drc_cmd_get_data() error: invalid cdata->cmd"); - ret = -EINVAL; - break; - } - return ret; + comp_dbg(mod->dev, "multiband_drc_set_config()"); + +#if CONFIG_IPC_MAJOR_3 + /* Other control types are possible only with IPC3 */ + struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; + + if (cdata->cmd != SOF_CTRL_CMD_BINARY) + return multiband_drc_cmd_set_value(mod, cdata); +#endif + + comp_dbg(mod->dev, "multiband_drc_set_config(), SOF_CTRL_CMD_BINARY"); + return comp_data_blob_set(cd->model_handler, pos, data_offset_size, fragment, + fragment_size); } -static int multiband_drc_cmd_get_value(struct comp_dev *dev, +#if CONFIG_IPC_MAJOR_3 +static int multiband_drc_cmd_get_value(struct processing_module *mod, struct sof_ipc_ctrl_data *cdata) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct comp_dev *dev = mod->dev; + struct multiband_drc_comp_data *cd = module_get_private_data(mod); int j; switch (cdata->cmd) { @@ -358,256 +363,184 @@ static int multiband_drc_cmd_get_value(struct comp_dev *dev, comp_warn(dev, "multiband_drc_cmd_get_value() warn: num_elems should be 1, got %d", cdata->num_elems); return 0; - default: - comp_err(dev, "multiband_drc_cmd_get_value() error: invalid cdata->cmd"); - return -EINVAL; } -} -static int multiband_drc_cmd_set_data(struct comp_dev *dev, - struct sof_ipc_ctrl_data *cdata) -{ - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); - int ret = 0; - - switch (cdata->cmd) { - case SOF_CTRL_CMD_BINARY: - comp_dbg(dev, "multiband_drc_cmd_set_data(), SOF_CTRL_CMD_BINARY"); - ret = comp_data_blob_set_cmd(cd->model_handler, cdata); - break; - default: - comp_err(dev, "multiband_drc_cmd_set_data() error: invalid cdata->cmd"); - ret = -EINVAL; - break; - } - - return ret; + comp_err(dev, "tdfb_cmd_get_value() error: invalid cdata->cmd"); + return -EINVAL; } +#endif -static int multiband_drc_cmd_set_value(struct comp_dev *dev, - struct sof_ipc_ctrl_data *cdata) +static int multiband_drc_get_config(struct processing_module *mod, + uint32_t config_id, uint32_t *data_offset_size, + uint8_t *fragment, size_t fragment_size) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); + struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; - switch (cdata->cmd) { - case SOF_CTRL_CMD_SWITCH: - comp_dbg(dev, "multiband_drc_cmd_set_value(), SOF_CTRL_CMD_SWITCH"); - if (cdata->num_elems == 1) { - cd->process_enabled = cdata->chanv[0].value; - comp_info(dev, "multiband_drc_cmd_set_value(), process_enabled = %d", - cd->process_enabled); - return 0; - } + comp_dbg(mod->dev, "multiband_drc_get_config()"); - comp_err(dev, "multiband_drc_cmd_set_value() error: num_elems should be 1, got %d", - cdata->num_elems); - return -EINVAL; - default: - comp_err(dev, "multiband_drc_cmd_set_value() error: invalid cdata->cmd"); - return -EINVAL; - } -} +#if CONFIG_IPC_MAJOR_3 + if (cdata->cmd != SOF_CTRL_CMD_BINARY) + return multiband_drc_cmd_get_value(mod, cdata); +#endif -static int multiband_drc_cmd(struct comp_dev *dev, int cmd, void *data, int max_data_size) -{ - struct sof_ipc_ctrl_data *cdata = ASSUME_ALIGNED(data, 4); - int ret = 0; - - comp_dbg(dev, "multiband_drc_cmd()"); - - switch (cmd) { - case COMP_CMD_SET_DATA: - ret = multiband_drc_cmd_set_data(dev, cdata); - break; - case COMP_CMD_GET_DATA: - ret = multiband_drc_cmd_get_data(dev, cdata, max_data_size); - break; - case COMP_CMD_SET_VALUE: - ret = multiband_drc_cmd_set_value(dev, cdata); - break; - case COMP_CMD_GET_VALUE: - ret = multiband_drc_cmd_get_value(dev, cdata); - break; - default: - comp_err(dev, "multiband_drc_cmd(), invalid command"); - ret = -EINVAL; - } - - return ret; + comp_dbg(mod->dev, "multiband_drc_get_config(), SOF_CTRL_CMD_BINARY"); + return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size); } -static int multiband_drc_trigger(struct comp_dev *dev, int cmd) +static void multiband_drc_set_alignment(struct audio_stream __sparse_cache *source, + struct audio_stream __sparse_cache *sink) { - int ret; - - comp_dbg(dev, "multiband_drc_trigger()"); - - ret = comp_set_state(dev, cmd); - if (ret == COMP_STATUS_STATE_ALREADY_SET) - ret = PPL_STATUS_PATH_STOP; - - return ret; + /* Currently no optimizations those would use wider loads and stores */ + audio_stream_init_alignment_constants(1, 1, source); + audio_stream_init_alignment_constants(1, 1, sink); } -static void multiband_drc_process(struct comp_dev *dev, struct comp_buffer __sparse_cache *source, - struct comp_buffer __sparse_cache *sink, int frames, - uint32_t source_bytes, uint32_t sink_bytes) +static int multiband_drc_process(struct processing_module *mod, + struct input_stream_buffer *input_buffers, int num_input_buffers, + struct output_stream_buffer *output_buffers, + int num_output_buffers) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); + struct comp_dev *dev = mod->dev; + struct audio_stream __sparse_cache *source = input_buffers[0].data; + struct audio_stream __sparse_cache *sink = output_buffers[0].data; + int frames = input_buffers[0].size; + int ret; - buffer_stream_invalidate(source, source_bytes); + comp_dbg(dev, "multiband_drc_process()"); - cd->multiband_drc_func(dev, &source->stream, &sink->stream, frames); + /* Check for changed configuration */ + if (comp_is_new_data_blob_available(cd->model_handler)) { + cd->config = comp_get_data_blob(cd->model_handler, NULL, NULL); + ret = multiband_drc_setup(mod, (int16_t)audio_stream_get_channels(sink), + audio_stream_get_rate(sink)); + if (ret < 0) { + comp_err(dev, "multiband_drc_process(), failed DRC setup"); + return ret; + } + } - buffer_stream_writeback(sink, sink_bytes); + cd->multiband_drc_func(mod, source, sink, frames); /* calc new free and available */ - comp_update_buffer_consume(source, source_bytes); - comp_update_buffer_produce(sink, sink_bytes); + module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); + return 0; } -static int multiband_drc_copy(struct comp_dev *dev) +#if CONFIG_IPC_MAJOR_4 +static int multiband_drc_params(struct processing_module *mod) { - struct comp_copy_limits cl; - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); - struct comp_buffer *sourceb, *sinkb; - struct comp_buffer __sparse_cache *source_c, *sink_c; - int ret = 0; - - comp_dbg(dev, "multiband_drc_copy()"); + struct sof_ipc_stream_params *params = mod->stream_params; + struct sof_ipc_stream_params comp_params; + struct comp_dev *dev = mod->dev; + struct comp_buffer *sinkb; + struct comp_buffer __sparse_cache *sink_c; + enum sof_ipc_frame valid_fmt, frame_fmt; + int i, ret; - sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, - sink_list); - sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, - source_list); + comp_dbg(dev, "multiband_drc_params()"); - source_c = buffer_acquire(sourceb); - sink_c = buffer_acquire(sinkb); + comp_params = *params; + comp_params.channels = mod->priv.cfg.base_cfg.audio_fmt.channels_count; + comp_params.rate = mod->priv.cfg.base_cfg.audio_fmt.sampling_frequency; + comp_params.buffer_fmt = mod->priv.cfg.base_cfg.audio_fmt.interleaving_style; - /* Check for changed configuration */ - if (comp_is_new_data_blob_available(cd->model_handler)) { - cd->config = comp_get_data_blob(cd->model_handler, NULL, NULL); - ret = multiband_drc_setup(cd, (int16_t)audio_stream_get_channels(&source_c->stream), - audio_stream_get_rate(&source_c->stream)); - if (ret < 0) { - comp_err(dev, "multiband_drc_copy(), failed DRC setup"); - goto out; - } - } + audio_stream_fmt_conversion(mod->priv.cfg.base_cfg.audio_fmt.depth, + mod->priv.cfg.base_cfg.audio_fmt.valid_bit_depth, + &frame_fmt, &valid_fmt, + mod->priv.cfg.base_cfg.audio_fmt.s_type); - /* Get source, sink, number of frames etc. to process. */ - comp_get_copy_limits(source_c, sink_c, &cl); + comp_params.frame_fmt = frame_fmt; - /* Run Multiband DRC function */ - multiband_drc_process(dev, source_c, sink_c, cl.frames, cl.source_bytes, cl.sink_bytes); + for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) + comp_params.chmap[i] = (mod->priv.cfg.base_cfg.audio_fmt.ch_map >> i * 4) & 0xf; -out: + component_set_nearest_period_frames(dev, comp_params.rate); + sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); + sink_c = buffer_acquire(sinkb); + ret = buffer_set_params(sink_c, &comp_params, true); buffer_release(sink_c); - buffer_release(source_c); - return ret; } +#endif /* CONFIG_IPC_MAJOR_4 */ -static int multiband_drc_prepare(struct comp_dev *dev) +static int multiband_drc_prepare(struct processing_module *mod, + struct sof_source __sparse_cache **sources, int num_of_sources, + struct sof_sink __sparse_cache **sinks, int num_of_sinks) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); + struct comp_dev *dev = mod->dev; struct comp_buffer *sourceb, *sinkb; struct comp_buffer __sparse_cache *source_c, *sink_c; - uint32_t sink_period_bytes; - int ret; + int channels; + int rate; + int ret = 0; comp_info(dev, "multiband_drc_prepare()"); - ret = comp_set_state(dev, COMP_TRIGGER_PREPARE); +#if CONFIG_IPC_MAJOR_4 + ret = multiband_drc_params(mod); if (ret < 0) return ret; - - if (ret == COMP_STATUS_STATE_ALREADY_SET) - return PPL_STATUS_PATH_STOP; +#endif /* DRC component will only ever have 1 source and 1 sink buffer */ - sourceb = list_first_item(&dev->bsource_list, - struct comp_buffer, sink_list); - sinkb = list_first_item(&dev->bsink_list, - struct comp_buffer, source_list); + sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); + sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); source_c = buffer_acquire(sourceb); + sink_c = buffer_acquire(sinkb); + multiband_drc_set_alignment(&source_c->stream, &sink_c->stream); /* get source data format */ cd->source_format = audio_stream_get_frm_fmt(&source_c->stream); + channels = audio_stream_get_channels(&source_c->stream); + rate = audio_stream_get_rate(&source_c->stream); + + buffer_release(sink_c); + buffer_release(source_c); /* Initialize DRC */ 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) { - ret = multiband_drc_setup(cd, audio_stream_get_channels(&source_c->stream), - audio_stream_get_rate(&source_c->stream)); + ret = multiband_drc_setup(mod, channels, rate); if (ret < 0) { comp_err(dev, "multiband_drc_prepare() error: multiband_drc_setup failed."); - goto out_source; + 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"); - ret = -EINVAL; - goto out_source; + 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); - ret = -EINVAL; - goto out_source; + 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"); - ret = -EINVAL; - goto out_source; + return -EINVAL; } } - sink_c = buffer_acquire(sinkb); - - /* validate sink data format and period bytes */ - if (cd->source_format != audio_stream_get_frm_fmt(&sink_c->stream)) { - comp_err(dev, - "multiband_drc_prepare(): Source fmt %d and sink fmt %d are different.", - cd->source_format, audio_stream_get_frm_fmt(&sink_c->stream)); - ret = -EINVAL; - goto out_sink; - } - - sink_period_bytes = audio_stream_period_bytes(&sink_c->stream, - dev->frames); - - if (audio_stream_get_size(&sink_c->stream) < sink_period_bytes) { - comp_err(dev, "multiband_drc_prepare(), sink buffer size %d is insufficient", - audio_stream_get_size(&sink_c->stream)); - ret = -ENOMEM; - } - -out_sink: - buffer_release(sink_c); -out_source: - buffer_release(source_c); - - if (ret < 0) - comp_set_state(dev, COMP_TRIGGER_RESET); - return ret; } -static int multiband_drc_reset(struct comp_dev *dev) +static int multiband_drc_reset(struct processing_module *mod) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); - comp_info(dev, "multiband_drc_reset()"); + comp_info(mod->dev, "multiband_drc_reset()"); multiband_drc_reset_state(&cd->state); @@ -615,34 +548,18 @@ static int multiband_drc_reset(struct comp_dev *dev) cd->multiband_drc_func = NULL; cd->crossover_split = NULL; - comp_set_state(dev, COMP_TRIGGER_RESET); return 0; } -static const struct comp_driver comp_multiband_drc = { - .uid = SOF_RT_UUID(multiband_drc_uuid), - .tctx = &multiband_drc_tr, - .ops = { - .create = multiband_drc_new, - .free = multiband_drc_free, - .params = multiband_drc_params, - .cmd = multiband_drc_cmd, - .trigger = multiband_drc_trigger, - .copy = multiband_drc_copy, - .prepare = multiband_drc_prepare, - .reset = multiband_drc_reset, - }, -}; - -static SHARED_DATA struct comp_driver_info comp_multiband_drc_info = { - .drv = &comp_multiband_drc, +static struct module_interface multiband_drc_interface = { + .init = multiband_drc_init, + .prepare = multiband_drc_prepare, + .process_audio_stream = multiband_drc_process, + .set_configuration = multiband_drc_set_config, + .get_configuration = multiband_drc_get_config, + .reset = multiband_drc_reset, + .free = multiband_drc_free }; -UT_STATIC void sys_comp_multiband_drc_init(void) -{ - comp_register(platform_shared_get(&comp_multiband_drc_info, - sizeof(comp_multiband_drc_info))); -} - -DECLARE_MODULE(sys_comp_multiband_drc_init); -SOF_MODULE_INIT(multiband_drc, sys_comp_multiband_drc_init); +DECLARE_MODULE_ADAPTER(multiband_drc_interface, multiband_drc_uuid, multiband_drc_tr); +SOF_MODULE_INIT(multiband_drc, sys_comp_module_multiband_drc_interface_init); diff --git a/src/audio/multiband_drc/multiband_drc_generic.c b/src/audio/multiband_drc/multiband_drc_generic.c index ece83afc8458..e4d3014c9270 100644 --- a/src/audio/multiband_drc/multiband_drc_generic.c +++ b/src/audio/multiband_drc/multiband_drc_generic.c @@ -10,7 +10,7 @@ #include #include -static void multiband_drc_default_pass(const struct comp_dev *dev, +static void multiband_drc_default_pass(const struct processing_module *mod, const struct audio_stream __sparse_cache *source, struct audio_stream __sparse_cache *sink, uint32_t frames) @@ -202,12 +202,12 @@ static void multiband_drc_process_deemp(struct multiband_drc_state *state, * :buf_drc_src[nch*nband] :buf_sink[nch] */ #if CONFIG_FORMAT_S16LE -static void multiband_drc_s16_default(const struct comp_dev *dev, +static void multiband_drc_s16_default(const struct processing_module *mod, const struct audio_stream __sparse_cache *source, struct audio_stream __sparse_cache *sink, uint32_t frames) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; int32_t buf_src[PLATFORM_MAX_CHANNELS]; int32_t buf_sink[PLATFORM_MAX_CHANNELS]; @@ -269,12 +269,12 @@ static void multiband_drc_s16_default(const struct comp_dev *dev, #endif /* CONFIG_FORMAT_S16LE */ #if CONFIG_FORMAT_S24LE -static void multiband_drc_s24_default(const struct comp_dev *dev, +static void multiband_drc_s24_default(const struct processing_module *mod, const struct audio_stream __sparse_cache *source, struct audio_stream __sparse_cache *sink, uint32_t frames) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; int32_t buf_src[PLATFORM_MAX_CHANNELS]; int32_t buf_sink[PLATFORM_MAX_CHANNELS]; @@ -336,12 +336,12 @@ static void multiband_drc_s24_default(const struct comp_dev *dev, #endif /* CONFIG_FORMAT_S24LE */ #if CONFIG_FORMAT_S32LE -static void multiband_drc_s32_default(const struct comp_dev *dev, +static void multiband_drc_s32_default(const struct processing_module *mod, const struct audio_stream __sparse_cache *source, struct audio_stream __sparse_cache *sink, uint32_t frames) { - struct multiband_drc_comp_data *cd = comp_get_drvdata(dev); + struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; int32_t buf_src[PLATFORM_MAX_CHANNELS]; int32_t buf_sink[PLATFORM_MAX_CHANNELS]; diff --git a/src/include/sof/audio/component.h b/src/include/sof/audio/component.h index 3f8821eaac24..e51fa2abb967 100644 --- a/src/include/sof/audio/component.h +++ b/src/include/sof/audio/component.h @@ -705,7 +705,6 @@ void sys_comp_dai_init(void); void sys_comp_dcblock_init(void); void sys_comp_host_init(void); void sys_comp_kpb_init(void); -void sys_comp_multiband_drc_init(void); void sys_comp_selector_init(void); void sys_comp_module_crossover_interface_init(void); @@ -715,6 +714,7 @@ void sys_comp_module_eq_fir_interface_init(void); void sys_comp_module_eq_iir_interface_init(void); void sys_comp_module_mfcc_interface_init(void); void sys_comp_module_mixer_interface_init(void); +void sys_comp_module_multiband_drc_interface_init(void); void sys_comp_module_mux_interface_init(void); void sys_comp_module_src_interface_init(void); void sys_comp_module_tdfb_interface_init(void); diff --git a/src/include/sof/audio/multiband_drc/multiband_drc.h b/src/include/sof/audio/multiband_drc/multiband_drc.h index 6b34cc58ddfd..a5058bd158dc 100644 --- a/src/include/sof/audio/multiband_drc/multiband_drc.h +++ b/src/include/sof/audio/multiband_drc/multiband_drc.h @@ -7,14 +7,15 @@ #ifndef __SOF_AUDIO_MULTIBAND_DRC_MULTIBAND_DRC_H__ #define __SOF_AUDIO_MULTIBAND_DRC_MULTIBAND_DRC_H__ -#include -#include -#include +#include #include #include -#include #include +#include +#include +#include #include +#include /** * Stores the state of the sub-components in Multiband DRC @@ -26,7 +27,7 @@ struct multiband_drc_state { struct iir_state_df2t deemphasis[PLATFORM_MAX_CHANNELS]; }; -typedef void (*multiband_drc_func)(const struct comp_dev *dev, +typedef void (*multiband_drc_func)(const struct processing_module *mod, const struct audio_stream __sparse_cache *source, struct audio_stream __sparse_cache *sink, uint32_t frames); @@ -82,4 +83,8 @@ static inline multiband_drc_func multiband_drc_find_proc_func_pass(enum sof_ipc_ return NULL; } +#ifdef UNIT_TEST +void sys_comp_module_multiband_drc_interface_init(void); +#endif + #endif // __SOF_AUDIO_MULTIBAND_DRC_MULTIBAND_DRC_H__ diff --git a/tools/testbench/common_test.c b/tools/testbench/common_test.c index c8e21241cfda..c42ae4cd470e 100644 --- a/tools/testbench/common_test.c +++ b/tools/testbench/common_test.c @@ -46,7 +46,6 @@ int tb_setup(struct sof *sof, struct testbench_prm *tp) sys_comp_file_init(); sys_comp_asrc_init(); sys_comp_dcblock_init(); - sys_comp_multiband_drc_init(); sys_comp_selector_init(); /* Module adapter components */ @@ -55,6 +54,7 @@ int tb_setup(struct sof *sof, struct testbench_prm *tp) sys_comp_module_drc_interface_init(); sys_comp_module_eq_fir_interface_init(); sys_comp_module_eq_iir_interface_init(); + sys_comp_module_multiband_drc_interface_init(); sys_comp_module_mux_interface_init(); sys_comp_module_src_interface_init(); sys_comp_module_tdfb_interface_init(); From 63d8f3985f300f17d23ffd9300a992127e2eece0 Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Wed, 16 Aug 2023 17:37:25 +0300 Subject: [PATCH 2/2] Kconfig: Enable crossover and multiband-DRC by default This patch enables for TGL and MTL platforms as default to enable CI build tests, etc. Signed-off-by: Seppo Ingalsuo --- app/boards/intel_adsp_ace15_mtpm.conf | 2 ++ app/boards/intel_adsp_cavs25.conf | 2 ++ app/boards/intel_adsp_cavs25_tgph.conf | 2 ++ 3 files changed, 6 insertions(+) diff --git a/app/boards/intel_adsp_ace15_mtpm.conf b/app/boards/intel_adsp_ace15_mtpm.conf index d52ecb755e5e..8bbcc0278c58 100644 --- a/app/boards/intel_adsp_ace15_mtpm.conf +++ b/app/boards/intel_adsp_ace15_mtpm.conf @@ -4,6 +4,8 @@ CONFIG_IPC_MAJOR_4=y CONFIG_COMP_SRC=y CONFIG_COMP_SRC_IPC4_FULL_MATRIX=y CONFIG_COMP_DRC=y +CONFIG_COMP_CROSSOVER=y +CONFIG_COMP_MULTIBAND_DRC=y # power settings CONFIG_PM=y diff --git a/app/boards/intel_adsp_cavs25.conf b/app/boards/intel_adsp_cavs25.conf index cf4b852dd5b8..196726580e6a 100644 --- a/app/boards/intel_adsp_cavs25.conf +++ b/app/boards/intel_adsp_cavs25.conf @@ -28,6 +28,8 @@ CONFIG_PCM_CONVERTER_FORMAT_S16_C32_AND_S24_C32=y CONFIG_PCM_CONVERTER_FORMAT_S16_C32_AND_S16_C32=y CONFIG_COMP_VOLUME_WINDOWS_FADE=y CONFIG_COMP_DRC=y +CONFIG_COMP_CROSSOVER=y +CONFIG_COMP_MULTIBAND_DRC=y # route SOF logs to Zephyr logging subsystem CONFIG_SOF_LOG_LEVEL_INF=y diff --git a/app/boards/intel_adsp_cavs25_tgph.conf b/app/boards/intel_adsp_cavs25_tgph.conf index 06c2dd553d0a..47523b196375 100644 --- a/app/boards/intel_adsp_cavs25_tgph.conf +++ b/app/boards/intel_adsp_cavs25_tgph.conf @@ -27,6 +27,8 @@ CONFIG_PCM_CONVERTER_FORMAT_S16_C32_AND_S24_C32=y CONFIG_PCM_CONVERTER_FORMAT_S16_C32_AND_S16_C32=y CONFIG_COMP_VOLUME_WINDOWS_FADE=y CONFIG_COMP_DRC=y +CONFIG_COMP_CROSSOVER=y +CONFIG_COMP_MULTIBAND_DRC=y # route SOF logs to Zephyr logging subsystem CONFIG_SOF_LOG_LEVEL_INF=y