diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt index 0475766b1..d7842aa8a 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 9f883f11d..a433b0629 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 59a746df2..a7ef67309 100644 --- a/src/audio/dcblock/dcblock.c +++ b/src/audio/dcblock/dcblock.c @@ -144,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); } /** @@ -167,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); } /** @@ -218,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. @@ -253,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/audio/dcblock/dcblock.h b/src/audio/dcblock/dcblock.h index 2d0d46317..bc2bec3f3 100644 --- a/src/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_ipc3.c b/src/audio/dcblock/dcblock_ipc3.c new file mode 100644 index 000000000..3c41eb83a --- /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 000000000..e89dc0a22 --- /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 9c822cde2..1ae14efc2 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