From 1508022b3ae07ae5cba7bcc77d4fa967fe70f5ac Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Thu, 4 Jul 2024 17:03:56 +0200 Subject: [PATCH 1/3] copier: Remove update source buffer format A data producing component is responsible for setting a sink buffer parameters. It is not necessary for the copier to override source buffer parameters. Remove the code responsible for it. Signed-off-by: Adrian Warecki --- src/audio/copier/copier_generic.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/audio/copier/copier_generic.c b/src/audio/copier/copier_generic.c index b270e55461a6..ed31fb7414e7 100644 --- a/src/audio/copier/copier_generic.c +++ b/src/audio/copier/copier_generic.c @@ -61,7 +61,7 @@ int apply_attenuation(struct comp_dev *dev, struct copier_data *cd, void copier_update_params(struct copier_data *cd, struct comp_dev *dev, struct sof_ipc_stream_params *params) { - struct comp_buffer *sink, *source; + struct comp_buffer *sink; struct list_item *sink_list; memset(params, 0, sizeof(*params)); @@ -90,19 +90,6 @@ void copier_update_params(struct copier_data *cd, struct comp_dev *dev, ipc4_update_buffer_format(sink, &cd->out_fmt[j]); } - /* - * force update the source buffer format to cover cases where the source module - * fails to set the sink buffer params - */ - if (!list_is_empty(&dev->bsource_list)) { - struct ipc4_audio_format *in_fmt; - - source = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); - - in_fmt = &cd->config.base.audio_fmt; - ipc4_update_buffer_format(source, in_fmt); - } - /* update params for the DMA buffer */ switch (dev->ipc_config.type) { case SOF_COMP_HOST: From 7f839bbbcf859de44118ef84c0f543232c9de644 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Thu, 4 Jul 2024 17:05:00 +0200 Subject: [PATCH 2/3] copier: Remove update of sink buffer format in copier_set_sink_fmt Sink format can only be set when the sink buffer is not binded. Sink buffer parameters will be set on binding. Remove redundant code. Signed-off-by: Adrian Warecki --- src/audio/copier/copier.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index 2c564ed57f38..4275e37d51ca 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -662,8 +662,6 @@ static int copier_set_sink_fmt(struct comp_dev *dev, const void *data, const struct ipc4_copier_config_set_sink_format *sink_fmt = data; struct processing_module *mod = comp_mod(dev); struct copier_data *cd = module_get_private_data(mod); - struct list_item *sink_list; - struct comp_buffer *sink; if (max_data_size < sizeof(*sink_fmt)) { comp_err(dev, "error: max_data_size %d should be bigger than %d", max_data_size, @@ -693,19 +691,6 @@ static int copier_set_sink_fmt(struct comp_dev *dev, const void *data, &sink_fmt->sink_fmt, ipc4_gtw_none, ipc4_bidirection); - /* update corresponding sink format */ - list_for_item(sink_list, &dev->bsink_list) { - int sink_id; - - sink = container_of(sink_list, struct comp_buffer, source_list); - - sink_id = IPC4_SINK_QUEUE_ID(buf_get_id(sink)); - if (sink_id == sink_fmt->sink_id) { - ipc4_update_buffer_format(sink, &sink_fmt->sink_fmt); - break; - } - } - return 0; } From fd7570c76937e01119d4e82bba293c1e39f6b827 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Mon, 8 Jul 2024 16:31:35 +0200 Subject: [PATCH 3/3] copier: Add bind function to configure sink buffers params Setting the sink buffers parameters in the copier_update_params function is not sufficient. If a sink buffer is attached during copier operation, the module will not set buffers parameters. Add bind function to configure sink buffers parameters. There is no need to configure sink buffers parameters on each copy. We are assured that they were configured at the time of bind. Remove ipc4_update_buffer_format from the copier_module_copy function. Fixes: #9123 Signed-off-by: Adrian Warecki --- src/audio/copier/copier.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index 4275e37d51ca..347ee95563d7 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -518,9 +518,6 @@ static int copier_module_copy(struct processing_module *mod, if (sink_queue_id >= IPC4_COPIER_MODULE_OUTPUT_PINS_COUNT) return -EINVAL; - /* update corresponding sink format in case it isn't updated */ - ipc4_update_buffer_format(sink_c, &cd->out_fmt[sink_queue_id]); - comp_get_copy_limits(src_c, sink_c, &processed_data); samples = processed_data.frames * @@ -975,6 +972,33 @@ static int copier_get_hw_params(struct comp_dev *dev, struct sof_ipc_stream_para return dai_common_get_hw_params(dd, dev, params, dir); } +static int copier_bind(struct processing_module *mod, void *data) +{ + const struct ipc4_module_bind_unbind *const bu = (struct ipc4_module_bind_unbind *)data; + const uint32_t src_id = IPC4_COMP_ID(bu->primary.r.module_id, bu->primary.r.instance_id); + const uint32_t src_queue_id = bu->extension.r.src_queue; + struct copier_data *cd = module_get_private_data(mod); + struct comp_dev *dev = mod->dev; + struct list_item *list; + + if (dev->ipc_config.id != src_id) + return 0; /* Another component is a data producer */ + + /* update sink format */ + list_for_item(list, &dev->bsink_list) { + struct comp_buffer *buffer = container_of(list, struct comp_buffer, source_list); + uint32_t id = IPC4_SRC_QUEUE_ID(buf_get_id(buffer)); + + if (src_queue_id == id) { + ipc4_update_buffer_format(buffer, &cd->out_fmt[id]); + return 0; + } + } + + comp_err(dev, "No sink buffer found for src_queue = %u", src_queue_id); + return -ENODEV; +} + static int copier_unbind(struct processing_module *mod, void *data) { struct copier_data *cd = module_get_private_data(mod); @@ -1008,6 +1032,7 @@ static const struct module_interface copier_interface = { .free = copier_free, .set_configuration = copier_set_configuration, .get_configuration = copier_get_configuration, + .bind = copier_bind, .unbind = copier_unbind, .endpoint_ops = &copier_endpoint_ops, };