diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt index 0475766b1e76..d7842aa8a86d 100644 --- a/src/audio/CMakeLists.txt +++ b/src/audio/CMakeLists.txt @@ -182,6 +182,7 @@ if(CONFIG_IPC_MAJOR_3) set(eq-fir_sources eq_fir/eq_fir_ipc3.c) set(tdfb_sources tdfb/tdfb_ipc3.c) set(tdfb_sources multiband_drc/multiband_drc_ipc3.c) + set(dcblock_sources dcblock/dcblock_ipc3.c) elseif(CONFIG_IPC_MAJOR_4) set(volume_sources volume/volume.c volume/volume_generic.c volume/volume_ipc4.c) set(src_sources src/src.c src/src_ipc4.c src/src_generic.c) @@ -189,6 +190,7 @@ elseif(CONFIG_IPC_MAJOR_4) set(eq-fir_sources eq_fir/eq_fir_ipc4.c) set(tdfb_sources tdfb/tdfb_ipc4.c) set(tdfb_sources multiband_drc/multiband_drc_ipc4.c) + set(dcblock_sources dcblock/dcblock_ipc4.c) endif() set(mixer_sources ${mixer_src}) set(asrc_sources asrc/asrc.c asrc/asrc_farrow.c asrc/asrc_farrow_generic.c) diff --git a/src/audio/dcblock/CMakeLists.txt b/src/audio/dcblock/CMakeLists.txt index 9f883f11daaf..a433b0629eeb 100644 --- a/src/audio/dcblock/CMakeLists.txt +++ b/src/audio/dcblock/CMakeLists.txt @@ -2,3 +2,9 @@ add_local_sources(sof dcblock.c) add_local_sources(sof dcblock_generic.c) add_local_sources(sof dcblock_hifi3.c) add_local_sources(sof dcblock_hifi4.c) + +if(CONFIG_IPC_MAJOR_3) + add_local_sources(sof dcblock_ipc3.c) +elseif(CONFIG_IPC_MAJOR_4) + add_local_sources(sof dcblock_ipc4.c) +endif() diff --git a/src/audio/dcblock/dcblock.c b/src/audio/dcblock/dcblock.c index 8e52820341ba..a7ef67309c6a 100644 --- a/src/audio/dcblock/dcblock.c +++ b/src/audio/dcblock/dcblock.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -32,6 +31,8 @@ #include #include +#include "dcblock.h" + LOG_MODULE_REGISTER(dcblock, CONFIG_SOF_LOG_LEVEL); /* b809efaf-5681-42b1-9ed6-04bb012dd384 */ @@ -143,19 +144,7 @@ static int dcblock_get_config(struct processing_module *mod, uint32_t config_id, uint32_t *data_offset_size, uint8_t *fragment, size_t fragment_size) { - struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; - struct comp_data *cd = module_get_private_data(mod); - - comp_info(mod->dev, "dcblock_get_config()"); - -#if CONFIG_IPC_MAJOR_3 - if (cdata->cmd != SOF_CTRL_CMD_BINARY) { - comp_err(mod->dev, "dcblock_get_config(), invalid command"); - return -EINVAL; - } -#endif - - return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size); + return dcblock_get_ipc_config(mod, fragment, fragment_size); } /** @@ -166,20 +155,8 @@ static int dcblock_set_config(struct processing_module *mod, uint32_t config_id, const uint8_t *fragment, size_t fragment_size, uint8_t *response, size_t response_size) { - struct comp_data *cd = module_get_private_data(mod); - - comp_info(mod->dev, "dcblock_set_config()"); -#if CONFIG_IPC_MAJOR_3 - struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; - - if (cdata->cmd != SOF_CTRL_CMD_BINARY) { - comp_err(mod->dev, "dcblock_set_config(), invalid command %i", cdata->cmd); - return -EINVAL; - } -#endif - return comp_data_blob_set(cd->model_handler, pos, data_offset_size, fragment, - fragment_size); + return dcblock_set_ipc_config(mod, pos, data_offset_size, fragment, fragment_size); } /** @@ -217,26 +194,6 @@ static inline void dcblock_set_frame_alignment(struct audio_stream *source, audio_stream_init_alignment_constants(byte_align, frame_align_req, sink); } -#if CONFIG_IPC_MAJOR_4 -static void dcblock_params(struct processing_module *mod) -{ - struct sof_ipc_stream_params *params = mod->stream_params; - struct comp_buffer *sinkb, *sourceb; - struct comp_dev *dev = mod->dev; - - comp_dbg(dev, "dcblock_params()"); - - ipc4_base_module_cfg_to_stream_params(&mod->priv.cfg.base_cfg, params); - component_set_nearest_period_frames(dev, params->rate); - - sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); - ipc4_update_buffer_format(sinkb, &mod->priv.cfg.base_cfg.audio_fmt); - - sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); - ipc4_update_buffer_format(sourceb, &mod->priv.cfg.base_cfg.audio_fmt); -} -#endif /* CONFIG_IPC_MAJOR_4 */ - /** * \brief Prepares DC Blocking Filter component for processing. * \param[in,out] dev DC Blocking Filter base component device. @@ -252,9 +209,7 @@ static int dcblock_prepare(struct processing_module *mod, comp_info(dev, "dcblock_prepare()"); -#if CONFIG_IPC_MAJOR_4 dcblock_params(mod); -#endif /* DC Filter component will only ever have one source and sink buffer */ sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); diff --git a/src/include/sof/audio/dcblock/dcblock.h b/src/audio/dcblock/dcblock.h similarity index 85% rename from src/include/sof/audio/dcblock/dcblock.h rename to src/audio/dcblock/dcblock.h index 2d0d46317e5c..bc2bec3f339a 100644 --- a/src/include/sof/audio/dcblock/dcblock.h +++ b/src/audio/dcblock/dcblock.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include /* __XCC__ is both for xt_xcc and xt_clang */ #if defined(__XCC__) @@ -93,4 +95,11 @@ static inline dcblock_func dcblock_find_func(enum sof_ipc_frame src_fmt) return NULL; } +int dcblock_get_ipc_config(struct processing_module *mod, + uint8_t *fragment, size_t fragment_size); +int dcblock_set_ipc_config(struct processing_module *mod, + enum module_cfg_fragment_position pos, uint32_t data_offset_size, + const uint8_t *fragment, size_t fragment_size); +void dcblock_params(struct processing_module *mod); + #endif /* __SOF_AUDIO_DCBLOCK_DCBLOCK_H__ */ diff --git a/src/audio/dcblock/dcblock_generic.c b/src/audio/dcblock/dcblock_generic.c index 459d51993f09..2ca1d0a70f10 100644 --- a/src/audio/dcblock/dcblock_generic.c +++ b/src/audio/dcblock/dcblock_generic.c @@ -7,7 +7,8 @@ #include #include #include -#include + +#include "dcblock.h" #ifdef DCBLOCK_GENERIC diff --git a/src/audio/dcblock/dcblock_hifi3.c b/src/audio/dcblock/dcblock_hifi3.c index 30d8aa4d32a8..f731bdbdbb18 100644 --- a/src/audio/dcblock/dcblock_hifi3.c +++ b/src/audio/dcblock/dcblock_hifi3.c @@ -7,7 +7,8 @@ #include #include #include -#include + +#include "dcblock.h" #ifdef DCBLOCK_HIFI3 diff --git a/src/audio/dcblock/dcblock_hifi4.c b/src/audio/dcblock/dcblock_hifi4.c index 98d8edf6345e..dc8090efa7b8 100644 --- a/src/audio/dcblock/dcblock_hifi4.c +++ b/src/audio/dcblock/dcblock_hifi4.c @@ -7,7 +7,8 @@ #include #include #include -#include + +#include "dcblock.h" #ifdef DCBLOCK_HIFI4 diff --git a/src/audio/dcblock/dcblock_ipc3.c b/src/audio/dcblock/dcblock_ipc3.c new file mode 100644 index 000000000000..3c41eb83afad --- /dev/null +++ b/src/audio/dcblock/dcblock_ipc3.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: BSD-3-Clause +// +// Copyright(c) 2020 Google LLC. All rights reserved. +// +// Author: Sebastiano Carlucci + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dcblock.h" + +LOG_MODULE_DECLARE(dcblock, CONFIG_SOF_LOG_LEVEL); + +/** + * \brief Handles incoming get commands for DC Blocking Filter component. + */ +int dcblock_get_ipc_config(struct processing_module *mod, + uint8_t *fragment, size_t fragment_size) +{ + struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; + struct comp_data *cd = module_get_private_data(mod); + + comp_info(mod->dev, "dcblock_get_config()"); + + if (cdata->cmd != SOF_CTRL_CMD_BINARY) { + comp_err(mod->dev, "dcblock_get_config(), invalid command"); + return -EINVAL; + } + + return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size); +} + +/** + * \brief Handles incoming set commands for DC Blocking Filter component. + */ +int dcblock_set_ipc_config(struct processing_module *mod, + enum module_cfg_fragment_position pos, uint32_t data_offset_size, + const uint8_t *fragment, size_t fragment_size) +{ + struct comp_data *cd = module_get_private_data(mod); + + comp_info(mod->dev, "dcblock_set_config()"); + + struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; + + if (cdata->cmd != SOF_CTRL_CMD_BINARY) { + comp_err(mod->dev, "dcblock_set_config(), invalid command %i", cdata->cmd); + return -EINVAL; + } + + return comp_data_blob_set(cd->model_handler, pos, data_offset_size, fragment, + fragment_size); +} + +void dcblock_params(struct processing_module *mod) +{ +} + diff --git a/src/audio/dcblock/dcblock_ipc4.c b/src/audio/dcblock/dcblock_ipc4.c new file mode 100644 index 000000000000..e89dc0a22415 --- /dev/null +++ b/src/audio/dcblock/dcblock_ipc4.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BSD-3-Clause +// +// Copyright(c) 2020 Google LLC. All rights reserved. +// +// Author: Sebastiano Carlucci + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dcblock.h" + +LOG_MODULE_DECLARE(dcblock, CONFIG_SOF_LOG_LEVEL); + +/** + * \brief Handles incoming get commands for DC Blocking Filter component. + */ +int dcblock_get_ipc_config(struct processing_module *mod, + uint8_t *fragment, size_t fragment_size) +{ + struct sof_ipc_ctrl_data *cdata = (struct sof_ipc_ctrl_data *)fragment; + struct comp_data *cd = module_get_private_data(mod); + + comp_info(mod->dev, "dcblock_get_ipc_config()"); + + return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size); +} + +/** + * \brief Handles incoming set commands for DC Blocking Filter component. + */ +int dcblock_set_ipc_config(struct processing_module *mod, + enum module_cfg_fragment_position pos, uint32_t data_offset_size, + const uint8_t *fragment, size_t fragment_size) +{ + struct comp_data *cd = module_get_private_data(mod); + + comp_info(mod->dev, "dcblock_set_ipc_config()"); + + return comp_data_blob_set(cd->model_handler, pos, data_offset_size, fragment, + fragment_size); +} + +void dcblock_params(struct processing_module *mod) +{ + struct sof_ipc_stream_params *params = mod->stream_params; + struct comp_buffer *sinkb, *sourceb; + struct comp_dev *dev = mod->dev; + + comp_dbg(dev, "dcblock_params()"); + + ipc4_base_module_cfg_to_stream_params(&mod->priv.cfg.base_cfg, params); + component_set_nearest_period_frames(dev, params->rate); + + sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); + ipc4_update_buffer_format(sinkb, &mod->priv.cfg.base_cfg.audio_fmt); + + sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); + ipc4_update_buffer_format(sourceb, &mod->priv.cfg.base_cfg.audio_fmt); +} + diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index 9c822cde2a3a..1ae14efc29a2 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -514,6 +514,16 @@ zephyr_library_sources_ifdef(CONFIG_COMP_DCBLOCK ${SOF_AUDIO_PATH}/dcblock/dcblock_hifi4.c ) +if(CONFIG_IPC_MAJOR_3) + zephyr_library_sources_ifdef(CONFIG_COMP_DCBLOCK + ${SOF_AUDIO_PATH}/dcblock/dcblock_ipc3.c + ) +elseif(CONFIG_IPC_MAJOR_4) + zephyr_library_sources_ifdef(CONFIG_COMP_DCBLOCK + ${SOF_AUDIO_PATH}/dcblock/dcblock_ipc4.c + ) +endif() + zephyr_library_sources_ifdef(CONFIG_COMP_SEL ${SOF_AUDIO_PATH}/selector/selector_generic.c ${SOF_AUDIO_PATH}/selector/selector.c