From 9b1855c22b71087fac1c73bf38977342f74c4c15 Mon Sep 17 00:00:00 2001 From: "Dobrowolski, PawelX" Date: Thu, 25 Jan 2024 14:20:05 +0100 Subject: [PATCH 1/2] lmdk: undefining unnecessary code Not all headers and funtions are used in loadable modules that is why we need for smaller header packs reduce it to what is truely need. Signed-off-by: Dobrowolski, PawelX --- src/audio/up_down_mixer/up_down_mixer.c | 9 ++++++++- src/audio/up_down_mixer/up_down_mixer_coef.h | 2 +- src/include/module/module/base.h | 1 + .../sof/audio/module_adapter/iadk/adsp_stddef.h | 3 ++- .../module_adapter/library/native_system_service.h | 3 ++- .../sof/audio/module_adapter/module/generic.h | 12 ++++++++---- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/audio/up_down_mixer/up_down_mixer.c b/src/audio/up_down_mixer/up_down_mixer.c index 4c8660b83fcc..326568ca0681 100644 --- a/src/audio/up_down_mixer/up_down_mixer.c +++ b/src/audio/up_down_mixer/up_down_mixer.c @@ -5,9 +5,9 @@ // Author: Bartosz Kokoszko // Author: Adrian Bonislawski +#ifndef MODULE_PRIVAT #include #include -#include #include #include #include @@ -25,6 +25,13 @@ #include #include #include +#endif +#include +#include +#include +#include +#include +#include #include "up_down_mixer_coef.h" #include "up_down_mixer.h" diff --git a/src/audio/up_down_mixer/up_down_mixer_coef.h b/src/audio/up_down_mixer/up_down_mixer_coef.h index 2085b8e33720..5cd1023836c5 100644 --- a/src/audio/up_down_mixer/up_down_mixer_coef.h +++ b/src/audio/up_down_mixer/up_down_mixer_coef.h @@ -8,7 +8,7 @@ #include "up_down_mixer_ipc4.h" #include -#if CONFIG_COMP_UP_DOWN_MIXER +#if CONFIG_COMP_UP_DOWN_MIXER || MODULE_PRIVAT #define COMPUTE_COEFF_32BIT(counter, denominator) ((0x7fffffffULL * (counter)) / (denominator)) #define COMPUTE_COEFF_16BIT(counter, denominator) ((0x7fffULL * (counter)) / (denominator)) diff --git a/src/include/module/module/base.h b/src/include/module/module/base.h index 323599b055f2..0b87f1861976 100644 --- a/src/include/module/module/base.h +++ b/src/include/module/module/base.h @@ -15,6 +15,7 @@ #include "interface.h" #include "../ipc4/base-config.h" +#include #define module_get_private_data(mod) ((mod)->priv.private) #define module_set_private_data(mod, data) ((mod)->priv.private = data) diff --git a/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h b/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h index 759a60b988de..7a3c5c2d487b 100644 --- a/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h +++ b/src/include/sof/audio/module_adapter/iadk/adsp_stddef.h @@ -9,8 +9,9 @@ #include #include #include +#ifndef MODULE_PRIVAT #include - +#endif /* MODULE_PRIVAT */ #ifdef __ZEPHYR__ #include #endif /* __ZEPHYR__ */ diff --git a/src/include/sof/audio/module_adapter/library/native_system_service.h b/src/include/sof/audio/module_adapter/library/native_system_service.h index 74f6a823192b..9fa6cdddbc17 100644 --- a/src/include/sof/audio/module_adapter/library/native_system_service.h +++ b/src/include/sof/audio/module_adapter/library/native_system_service.h @@ -7,8 +7,9 @@ #define NATIVE_SYSTEM_SERVICE_H #include - +#ifndef MODULE_PRIVAT #include "logger.h" +#endif #include "adsp_stddef.h" #include diff --git a/src/include/sof/audio/module_adapter/module/generic.h b/src/include/sof/audio/module_adapter/module/generic.h index 3e587117210c..cf3f5df5c965 100644 --- a/src/include/sof/audio/module_adapter/module/generic.h +++ b/src/include/sof/audio/module_adapter/module/generic.h @@ -12,7 +12,9 @@ #ifndef __SOF_AUDIO_MODULE_GENERIC__ #define __SOF_AUDIO_MODULE_GENERIC__ - +#include +#include +#ifndef MODULE_PRIVAT #include #include #include @@ -30,8 +32,9 @@ #define IS_PROCESSING_MODE_SINK_SOURCE(mod) ((mod)->proc_type == MODULE_PROCESS_TYPE_SOURCE_SINK) #define MAX_BLOB_SIZE 8192 +#endif /* MODULE_PRIVAT */ #define MODULE_MAX_SOURCES 8 - +#ifndef MODULE_PRIVAT #define API_CALL(cd, cmd, sub_cmd, value, ret) \ do { \ ret = (cd)->api((cd)->self, \ @@ -93,7 +96,7 @@ UT_STATIC void sys_comp_module_##adapter##_init(void) \ } \ \ DECLARE_MODULE(sys_comp_module_##adapter##_init) - +#endif /* MODULE_PRIVAT */ /** * \enum module_state * \brief Module-specific states @@ -146,7 +149,7 @@ struct module_processing_data { void *in_buff; /**< A pointer to module input buffer. */ void *out_buff; /**< A pointer to module output buffer. */ }; - +#ifndef MODULE_PRIVAT /* * Definition used to extend structure definitions to include fields for exclusive use by SOF. * This is a temporary solution used until work on separating a common interface for loadable @@ -328,4 +331,5 @@ void module_adapter_set_params(struct processing_module *mod, struct sof_ipc_str int module_adapter_set_state(struct processing_module *mod, struct comp_dev *dev, int cmd); int module_adapter_sink_src_prepare(struct comp_dev *dev); +#endif /* MODULE_PRIVAT */ #endif /* __SOF_AUDIO_MODULE_GENERIC__ */ From 651dea1909c6f846e500b7ecb3e57f1c15411a01 Mon Sep 17 00:00:00 2001 From: "Dobrowolski, PawelX" Date: Fri, 16 Feb 2024 12:10:46 +0100 Subject: [PATCH 2/2] loadable_module: up_down_mixer loadable example Example of loadable module build using lmdk Signed-off-by: Dobrowolski, PawelX --- lmdk/libraries/module_example/CMakeLists.txt | 18 +++ .../module_example/module_example_mtl.toml | 85 ++++++++++++++ lmdk/modules/up_down_mixer/CMakeLists.txt | 30 +++++ src/audio/up_down_mixer/up_down_mixer.c | 80 ++++++------- src/audio/up_down_mixer/up_down_mixer.h | 5 - src/audio/up_down_mixer/up_down_mixer.toml | 105 ++++++++++++------ src/audio/up_down_mixer/up_down_mixer_ipc4.h | 2 +- 7 files changed, 247 insertions(+), 78 deletions(-) create mode 100644 lmdk/libraries/module_example/CMakeLists.txt create mode 100644 lmdk/libraries/module_example/module_example_mtl.toml create mode 100644 lmdk/modules/up_down_mixer/CMakeLists.txt diff --git a/lmdk/libraries/module_example/CMakeLists.txt b/lmdk/libraries/module_example/CMakeLists.txt new file mode 100644 index 000000000000..cc917847ecd0 --- /dev/null +++ b/lmdk/libraries/module_example/CMakeLists.txt @@ -0,0 +1,18 @@ + +cmake_minimum_required(VERSION 3.20) +set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../../cmake/xtensa-toolchain.cmake") + +project(example_up_down_mixer) + +# list of modules to be built and included into this loadable library +set(MODULES_LIST up_down_mixer) + +# toml file for rimage to generate manifets +set(TOML "${CMAKE_CURRENT_LIST_DIR}/module_example_mtl.toml") + +# TODO: Move it somewhere??? +add_definitions(-DMAJOR_IADSP_API_VERSION=5) +add_definitions(-DMIDDLE_IADSP_API_VERSION=0) +add_definitions(-DMINOR_IADSP_API_VERSION=0) + +include(../../cmake/build.cmake) diff --git a/lmdk/libraries/module_example/module_example_mtl.toml b/lmdk/libraries/module_example/module_example_mtl.toml new file mode 100644 index 000000000000..b2f2af470454 --- /dev/null +++ b/lmdk/libraries/module_example/module_example_mtl.toml @@ -0,0 +1,85 @@ +version = [3, 0] + +[adsp] +name = "mtl" +image_size = "0x2C0000" # (22) bank * 128KB +alias_mask = "0xE0000000" + +[[adsp.mem_zone]] +type = "ROM" +base = "0x1FF80000" +size = "0x400" +[[adsp.mem_zone]] +type = "IMR" +base = "0xA104A000" +size = "0x2000" +[[adsp.mem_zone]] +type = "SRAM" +base = "0xa00f0000" +size = "0x100000" + +[[adsp.mem_alias]] +type = "uncached" +base = "0x40000000" +[[adsp.mem_alias]] +type = "cached" +base = "0xA0000000" + +[cse] +partition_name = "ADSP" +[[cse.entry]] +name = "ADSP.man" +offset = "0x5c" +length = "0x464" +[[cse.entry]] +name = "ADSP.met" +offset = "0x4c0" +length = "0x70" +[[cse.entry]] +name = "ADSP" +offset = "0x540" +length = "0x0" # calculated by rimage + +[css] + +[signed_pkg] +name = "ADSP" +[[signed_pkg.module]] +name = "ADSP.met" + +[adsp_file] +[[adsp_file.comp]] +base_offset = "0x2000" + +[fw_desc.header] +name = "ADSPFW" +load_offset = "0x40000" + +[module] +count = 1 + + [[module.entry]] + name = "UPDWMIX" + uuid = "ffffffff-832F-4DBF-B247-51E961997B34" + affinity_mask = "0x1" + instance_count = "15" + domain_types = "0" + load_type = "0" + module_type = "5" + auto_start = "0" + sched_caps = [1, 0x00008000] + + # pin = [dir, type, sample rate, size, container, channel-cfg] + pin = [0, 0, 0xffff, 0xc, 0x8, 0x05ff, + 1, 0, 0xffff, 0xc, 0x8, 0x45ff] + + # mod_cfg [PAR_0 PAR_1 PAR_2 PAR_3 IS_BYTES CPS IBS OBS MOD_FLAGS CPC OBLS] + mod_cfg = [0, 0, 0, 0, 216, 706000, 12, 16, 0, 0, 0, + 1, 0, 0, 0, 216, 1271000, 8, 8, 0, 0, 0, + 2, 0, 0, 0, 216, 1839000, 89, 118, 0, 0, 0, + 3, 0, 0, 0, 216, 2435000, 48, 64, 0, 0, 0, + 4, 0, 0, 0, 216, 3343000, 192, 192, 0, 0, 0, + 5, 0, 0, 0, 216, 3961000, 177, 177, 0, 0, 0, + 6, 0, 0, 0, 216, 4238000, 192, 256, 0, 0, 0, + 7, 0, 0, 0, 216, 6691000, 192, 256, 0, 0, 0] + diff --git a/lmdk/modules/up_down_mixer/CMakeLists.txt b/lmdk/modules/up_down_mixer/CMakeLists.txt new file mode 100644 index 000000000000..0028e503106d --- /dev/null +++ b/lmdk/modules/up_down_mixer/CMakeLists.txt @@ -0,0 +1,30 @@ +set(LMDK_BUILD 0) +set(SOF_SRC_DIR ../../../src) +set(LMDK_DIR_INCLUDE ../../../lmdk/include) +target_sources(up_down_mixer PRIVATE ${SOF_SRC_DIR}/audio/up_down_mixer/up_down_mixer.c ${SOF_SRC_DIR}/audio/up_down_mixer/up_down_mixer_hifi3.c) + +set_target_properties(up_down_mixer PROPERTIES + HPSRAM_ADDR "0xa06b1000" +) + +target_compile_definitions(up_down_mixer PRIVATE CONFIG_XTENSA=1 + CONFIG_IPC_MAJOR_4=1 + CONFIG_LIBRARY=1 + MODULE_PRIVAT=1 + XCHAL_HAVE_HIFI3=1 + SOF_MODULE_API_PRIVATE=1) + +if(LMDK_BUILD) +target_include_directories(up_down_mixer PRIVATE "${LMDK_DIR_INCLUDE}" + "${LMDK_DIR_INCLUDE}/sof" + "${LMDK_DIR_INCLUDE}/sof/audio" + "${LMDK_DIR_INCLUDE}/module/audio") +else() +target_include_directories(up_down_mixer PRIVATE "${SOF_SRC_DIR}/include" + "${SOF_SRC_DIR}/include/ipc" + "${SOF_SRC_DIR}/include/ipc4" + "${SOF_SRC_DIR}/include/sof/audio/module_adapter/iadk" + "${SOF_SRC_DIR}/../posix/include" + "${SOF_SRC_DIR}/../posix/include/sof" +) +endif() \ No newline at end of file diff --git a/src/audio/up_down_mixer/up_down_mixer.c b/src/audio/up_down_mixer/up_down_mixer.c index 326568ca0681..711ca42471c8 100644 --- a/src/audio/up_down_mixer/up_down_mixer.c +++ b/src/audio/up_down_mixer/up_down_mixer.c @@ -5,27 +5,6 @@ // Author: Bartosz Kokoszko // Author: Adrian Bonislawski -#ifndef MODULE_PRIVAT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif #include #include #include @@ -36,15 +15,17 @@ #include "up_down_mixer_coef.h" #include "up_down_mixer.h" -LOG_MODULE_REGISTER(up_down_mixer, CONFIG_SOF_LOG_LEVEL); +#include +#include +#include +#include -/* these ids aligns windows driver requirement to support windows driver */ -/* 42f8060c-832f-4dbf-b247-51e961997b34 */ -DECLARE_SOF_RT_UUID("up_down_mixer", up_down_mixer_comp_uuid, 0x42f8060c, 0x832f, - 0x4dbf, 0xb2, 0x47, 0x51, 0xe9, 0x61, 0x99, 0x7b, 0x34); +/* Logging is temporary disabled */ +#define comp_err(...) +#define comp_dbg(...) -DECLARE_TR_CTX(up_down_mixer_comp_tr, SOF_UUID(up_down_mixer_comp_uuid), - LOG_LEVEL_INFO); +static struct native_system_service_api* system_service; +uint32_t heap_mem[2048] __attribute__((section(".heap_mem"))) __attribute__((aligned(4096))); int32_t custom_coeffs[UP_DOWN_MIX_COEFFS_LENGTH]; @@ -58,7 +39,7 @@ static int set_downmix_coefficients(struct processing_module *mod, int ret; if (cd->downmix_coefficients) { - ret = memcpy_s(&custom_coeffs, sizeof(custom_coeffs), downmix_coefficients, + ret = system_service->safe_memcpy(&custom_coeffs, sizeof(custom_coeffs), downmix_coefficients, sizeof(int32_t) * UP_DOWN_MIX_COEFFS_LENGTH); if (ret < 0) @@ -336,9 +317,9 @@ static int up_down_mixer_free(struct processing_module *mod) { struct up_down_mixer_data *cd = module_get_private_data(mod); - rfree(cd->buf_in); - rfree(cd->buf_out); - rfree(cd); + free(cd->buf_in); + free(cd->buf_out); + free(cd); return 0; } @@ -352,16 +333,16 @@ static int up_down_mixer_init(struct processing_module *mod) struct up_down_mixer_data *cd; int ret; - cd = rzalloc(SOF_MEM_ZONE_RUNTIME, 0, SOF_MEM_CAPS_RAM, sizeof(*cd)); + cd = malloc(sizeof(struct up_down_mixer_data)); if (!cd) { - comp_free(dev); + free(dev); return -ENOMEM; } mod_data->private = cd; - cd->buf_in = rballoc(0, SOF_MEM_CAPS_RAM, mod->priv.cfg.base_cfg.ibs); - cd->buf_out = rballoc(0, SOF_MEM_CAPS_RAM, mod->priv.cfg.base_cfg.obs); + cd->buf_in = malloc(mod->priv.cfg.base_cfg.ibs); + cd->buf_out = malloc(mod->priv.cfg.base_cfg.obs); if (!cd->buf_in || !cd->buf_out) { ret = -ENOMEM; goto err; @@ -458,5 +439,28 @@ static const struct module_interface up_down_mixer_interface = { .free = up_down_mixer_free }; -DECLARE_MODULE_ADAPTER(up_down_mixer_interface, up_down_mixer_comp_uuid, up_down_mixer_comp_tr); -SOF_MODULE_INIT(up_down_mixer, sys_comp_module_up_down_mixer_interface_init); +DECLARE_LOADABLE_MODULE_API_VERSION(udm); + +static void* entry_point(void* mod_cfg, void* parent_ppl, void** mod_ptr) +{ + system_service = *(const struct native_system_agent**)mod_ptr; + + return &up_down_mixer_interface; +} + +//"42F8060C-832F-4DBF-B247-51E961997B34" +__attribute__((section(".module"))) +const struct sof_man_module_manifest udm_manifest = { + .module = { + .name = "UPDWMIX", + .uuid = {0x0c, 0x06, 0xf8, 0x42, + 0x2f, 0x83, + 0xbf, 0x4d, + 0xb2, 0x47, + 0x51, 0xe9, 0x61, 0x99, 0x7b, 0x34}, + .entry_point = (uint32_t)entry_point, + .type = {.load_type = SOF_MAN_MOD_TYPE_MODULE, + .domain_ll = 1 }, + .affinity_mask = 1, + } +}; \ No newline at end of file diff --git a/src/audio/up_down_mixer/up_down_mixer.h b/src/audio/up_down_mixer/up_down_mixer.h index 52a5f1e34daa..08dec5df27fd 100644 --- a/src/audio/up_down_mixer/up_down_mixer.h +++ b/src/audio/up_down_mixer/up_down_mixer.h @@ -7,13 +7,8 @@ #ifndef __SOF_AUDIO_UP_DOWN_MIXER_H__ #define __SOF_AUDIO_UP_DOWN_MIXER_H__ - -#include #include -#include #include -#include -#include #include #include diff --git a/src/audio/up_down_mixer/up_down_mixer.toml b/src/audio/up_down_mixer/up_down_mixer.toml index 2257664212f2..33487dc3405b 100644 --- a/src/audio/up_down_mixer/up_down_mixer.toml +++ b/src/audio/up_down_mixer/up_down_mixer.toml @@ -1,3 +1,63 @@ +version = [3, 0] + +[adsp] +name = "mtl" +image_size = "0x2C0000" # (22) bank * 128KB +alias_mask = "0xE0000000" + +[[adsp.mem_zone]] +type = "ROM" +base = "0x1FF80000" +size = "0x400" +[[adsp.mem_zone]] +type = "IMR" +base = "0xA104A000" +size = "0x2000" +[[adsp.mem_zone]] +type = "SRAM" +base = "0xa00f0000" +size = "0x100000" + +[[adsp.mem_alias]] +type = "uncached" +base = "0x40000000" +[[adsp.mem_alias]] +type = "cached" +base = "0xA0000000" + +[cse] +partition_name = "ADSP" +[[cse.entry]] +name = "ADSP.man" +offset = "0x5c" +length = "0x464" +[[cse.entry]] +name = "ADSP.met" +offset = "0x4c0" +length = "0x70" +[[cse.entry]] +name = "ADSP" +offset = "0x540" +length = "0x0" # calculated by rimage + +[css] + +[signed_pkg] +name = "ADSP" +[[signed_pkg.module]] +name = "ADSP.met" + +[adsp_file] +[[adsp_file.comp]] +base_offset = "0x2000" + +[fw_desc.header] +name = "ADSPFW" +load_offset = "0x40000" + +[module] +count = 1 + [[module.entry]] name = "UPDWMIX" uuid = "42F8060C-832F-4DBF-B247-51E961997B34" @@ -9,40 +69,17 @@ auto_start = "0" sched_caps = [1, 0x00008000] - // pin = [dir, type, sample rate, size, container, channel-cfg] + # pin = [dir, type, sample rate, size, container, channel-cfg] pin = [0, 0, 0xffff, 0xc, 0x8, 0x05ff, 1, 0, 0xffff, 0xc, 0x8, 0x45ff] - // mod_cfg [PAR_0 PAR_1 PAR_2 PAR_3 IS_BYTES CPS IBS OBS MOD_FLAGS CPC OBLS] - mod_cfg = [1, 0, 0, 0, 216, 5044000, 384, 192, 0, 5044, 0, - 2, 0, 0, 0, 216, 2660000, 384, 384, 0, 2660, 0, - 3, 0, 0, 0, 216, 3164000, 576, 384, 0, 3164, 0, - 4, 0, 0, 0, 216, 3316000, 768, 384, 0, 3316, 0, - 5, 0, 0, 0, 216, 5264000, 768, 384, 0, 5264, 0, - 6, 0, 0, 0, 216, 5440000, 768, 384, 0, 5440, 0, - 7, 0, 0, 0, 216, 2888000, 768, 192, 0, 2888, 0, - 8, 0, 0, 0, 216, 2856000, 768, 192, 0, 2856, 0, - 9, 0, 0, 0, 216, 2876000, 768, 192, 0, 2876, 0, - 10, 0, 0, 0, 216, 2956000, 960, 192, 0, 2956, 0, - 11, 0, 0, 0, 216, 2888000, 1152, 192, 0, 2888, 0, - 12, 0, 0, 0, 216, 2888000, 1152, 192, 0, 2888, 0, - 13, 0, 0, 0, 216, 2816000, 1536, 192, 0, 2816, 0, - 14, 0, 0, 0, 216, 2468000, 192, 384, 0, 2468, 0, - 15, 0, 0, 0, 216, 3084000, 576, 384, 0, 3084, 0, - 16, 0, 0, 0, 216, 3442000, 960, 384, 0, 3442, 0, - 17, 0, 0, 0, 216, 3478000, 1152, 384, 0, 3478, 0, - 18, 0, 0, 0, 216, 3478000, 1152, 384, 0, 3478, 0, - 19, 0, 0, 0, 216, 3736000, 1536, 384, 0, 3736, 0, - 20, 0, 0, 0, 216, 3216000, 192, 1152, 0, 3216, 0, - 21, 0, 0, 0, 216, 3308000, 384, 1152, 0, 3308, 0, - 22, 0, 0, 0, 216, 3616000, 768, 1152, 0, 3616, 0, - 23, 0, 0, 0, 216, 3616000, 768, 1152, 0, 3616, 0, - 24, 0, 0, 0, 216, 4916000, 1536, 1152, 0, 4916, 0, - 25, 0, 0, 0, 216, 3228000, 192, 1152, 0, 3228, 0, - 26, 0, 0, 0, 216, 3452000, 384, 1152, 0, 3452, 0, - 27, 0, 0, 0, 216, 4016000, 768, 1152, 0, 4016, 0, - 28, 0, 0, 0, 216, 5080000, 1536, 1152, 0, 5080, 0, - 29, 0, 0, 0, 216, 3552000, 384, 1536, 0, 3552, 0, - 30, 0, 0, 0, 216, 3728000, 768, 1152, 0, 3728, 0] - - index = __COUNTER__ + # mod_cfg [PAR_0 PAR_1 PAR_2 PAR_3 IS_BYTES CPS IBS OBS MOD_FLAGS CPC OBLS] + mod_cfg = [0, 0, 0, 0, 216, 706000, 12, 16, 0, 0, 0, + 1, 0, 0, 0, 216, 1271000, 8, 8, 0, 0, 0, + 2, 0, 0, 0, 216, 1839000, 89, 118, 0, 0, 0, + 3, 0, 0, 0, 216, 2435000, 48, 64, 0, 0, 0, + 4, 0, 0, 0, 216, 3343000, 192, 192, 0, 0, 0, + 5, 0, 0, 0, 216, 3961000, 177, 177, 0, 0, 0, + 6, 0, 0, 0, 216, 4238000, 192, 256, 0, 0, 0, + 7, 0, 0, 0, 216, 6691000, 192, 256, 0, 0, 0] + diff --git a/src/audio/up_down_mixer/up_down_mixer_ipc4.h b/src/audio/up_down_mixer/up_down_mixer_ipc4.h index 5300f5cb71d4..a7ab05cf859f 100644 --- a/src/audio/up_down_mixer/up_down_mixer_ipc4.h +++ b/src/audio/up_down_mixer/up_down_mixer_ipc4.h @@ -8,7 +8,7 @@ #define __SOF_IPC4_UP_DOWN_MIXER_H__ #include - +#include /** * \brief bits field map which helps to describe each channel location a the data stream buffer */