From 5c725697d8b4a076acc91d364963800aaf7af308 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Mon, 8 Jul 2024 16:31:35 +0200 Subject: [PATCH] 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 1502721942de..178f7cb25846 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -516,9 +516,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 * @@ -973,6 +970,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); @@ -1006,6 +1030,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, };