From f2dbad7cc5ece77c5fa98e32febdc879c2de6af7 Mon Sep 17 00:00:00 2001 From: Rander Wang Date: Fri, 8 Dec 2023 11:19:24 +0800 Subject: [PATCH] module: prepare sink & source in bind & unbind function Module will update source & sink information when bind & unbind event happen. Remove duplicate source & sink prepare in prepare function. Signed-off-by: Marcin Szkudlinski Signed-off-by: Rander Wang --- src/audio/module_adapter/module_adapter.c | 42 +++---------------- .../module_adapter/module_adapter_ipc4.c | 35 +++++++++++----- .../sof/audio/module_adapter/module/modules.h | 2 + 3 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/audio/module_adapter/module_adapter.c b/src/audio/module_adapter/module_adapter.c index e30c6cbc51cb..a7753f9776c6 100644 --- a/src/audio/module_adapter/module_adapter.c +++ b/src/audio/module_adapter/module_adapter.c @@ -119,39 +119,6 @@ struct comp_dev *module_adapter_new(const struct comp_driver *drv, return NULL; } -static int module_adapter_sink_src_prepare(struct comp_dev *dev) -{ - struct processing_module *mod = comp_get_drvdata(dev); - struct list_item *blist; - int ret; - int i; - - /* acquire all sink and source buffers, get handlers to sink/source API */ - i = 0; - list_for_item(blist, &dev->bsink_list) { - struct comp_buffer *sink_buffer = - container_of(blist, struct comp_buffer, source_list); - mod->sinks[i] = audio_stream_get_sink(&sink_buffer->stream); - i++; - } - mod->num_of_sinks = i; - - i = 0; - list_for_item(blist, &dev->bsource_list) { - struct comp_buffer *source_buffer = - container_of(blist, struct comp_buffer, sink_list); - - mod->sources[i] = audio_stream_get_source(&source_buffer->stream); - i++; - } - mod->num_of_sources = i; - - /* Prepare module */ - ret = module_prepare(mod, mod->sources, mod->num_of_sources, mod->sinks, mod->num_of_sinks); - - return ret; -} - #if CONFIG_ZEPHYR_DP_SCHEDULER static int module_adapter_dp_queue_prepare(struct comp_dev *dev) { @@ -171,7 +138,7 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev) list_init(&mod->dp_queue_ll_to_dp_list); list_init(&mod->dp_queue_dp_to_ll_list); - ret = module_adapter_sink_src_prepare(dev); + ret = module_prepare(mod, mod->sources, mod->num_of_sources, mod->sinks, mod->num_of_sinks); if (ret) return ret; @@ -198,7 +165,7 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev) goto err; dp_queue_append_to_list(dp_queue, &mod->dp_queue_ll_to_dp_list); - /* it will override source pointers set by module_adapter_sink_src_prepare + /* it will override source pointers set before * module will use shadow dpQueue for processing */ mod->sources[i] = dp_queue_get_source(dp_queue); @@ -232,7 +199,7 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev) goto err; dp_queue_append_to_list(dp_queue, &mod->dp_queue_dp_to_ll_list); - /* it will override sink pointers set by module_adapter_sink_src_prepare + /* it will override sink pointers set before * module will use shadow dpQueue for processing */ mod->sinks[i] = dp_queue_get_sink(dp_queue); @@ -328,7 +295,8 @@ int module_adapter_prepare(struct comp_dev *dev) else if (IS_PROCESSING_MODE_SINK_SOURCE(mod) && mod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_LL) - ret = module_adapter_sink_src_prepare(dev); + ret = module_prepare(mod, mod->sources, mod->num_of_sources, + mod->sinks, mod->num_of_sinks); else if ((IS_PROCESSING_MODE_RAW_DATA(mod) || IS_PROCESSING_MODE_AUDIO_STREAM(mod)) && mod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_LL) diff --git a/src/audio/module_adapter/module_adapter_ipc4.c b/src/audio/module_adapter/module_adapter_ipc4.c index 65ca8e806e3f..ad3617b1ca23 100644 --- a/src/audio/module_adapter/module_adapter_ipc4.c +++ b/src/audio/module_adapter/module_adapter_ipc4.c @@ -155,22 +155,35 @@ int module_adapter_get_attribute(struct comp_dev *dev, uint32_t type, void *valu return 0; } -static bool module_adapter_multi_sink_source_check(struct comp_dev *dev) +static bool module_adapter_multi_sink_source_prepare(struct comp_dev *dev) { struct processing_module *mod = comp_get_drvdata(dev); struct list_item *blist; - int num_sources = 0; - int num_sinks = 0; + int i; + + /* acquire all sink and source buffers, get handlers to sink/source API */ + i = 0; + list_for_item(blist, &dev->bsink_list) { + struct comp_buffer *sink_buffer = + container_of(blist, struct comp_buffer, source_list); + mod->sinks[i] = audio_stream_get_sink(&sink_buffer->stream); + i++; + } + mod->num_of_sinks = i; - list_for_item(blist, &dev->bsource_list) - num_sources++; + i = 0; + list_for_item(blist, &dev->bsource_list) { + struct comp_buffer *source_buffer = + container_of(blist, struct comp_buffer, sink_list); - list_for_item(blist, &dev->bsink_list) - num_sinks++; + mod->sources[i] = audio_stream_get_source(&source_buffer->stream); + i++; + } + mod->num_of_sources = i; - comp_dbg(dev, "num_sources=%d num_sinks=%d", num_sources, num_sinks); + comp_dbg(dev, "num_sources=%d num_sinks=%d", mod->num_of_sinks, mod->num_of_sinks); - if (num_sources != 1 || num_sinks != 1) + if (mod->num_of_sinks != 1 || mod->num_of_sinks != 1) return true; /* re-assign the source/sink modules */ @@ -190,7 +203,7 @@ int module_adapter_bind(struct comp_dev *dev, void *data) if (ret < 0) return ret; - mod->stream_copy_single_to_single = !module_adapter_multi_sink_source_check(dev); + mod->stream_copy_single_to_single = !module_adapter_multi_sink_source_prepare(dev); return 0; } @@ -204,7 +217,7 @@ int module_adapter_unbind(struct comp_dev *dev, void *data) if (ret < 0) return ret; - mod->stream_copy_single_to_single = !module_adapter_multi_sink_source_check(dev); + mod->stream_copy_single_to_single = !module_adapter_multi_sink_source_prepare(dev); return 0; } diff --git a/src/include/sof/audio/module_adapter/module/modules.h b/src/include/sof/audio/module_adapter/module/modules.h index ae514bcbf09e..bcfe2a6ae795 100644 --- a/src/include/sof/audio/module_adapter/module/modules.h +++ b/src/include/sof/audio/module_adapter/module/modules.h @@ -66,6 +66,8 @@ static inline void declare_dynamic_module_adapter(struct comp_driver *drv, drv->ops.set_large_config = module_set_large_config; drv->ops.get_large_config = module_get_large_config; drv->ops.get_attribute = module_adapter_get_attribute; + drv->ops.bind = module_adapter_bind; + drv->ops.unbind = module_adapter_unbind; } #endif /* __SOF_AUDIO_MODULES__ */