Skip to content

Commit bfad6f7

Browse files
committed
Audio: Up_down_mixer: Handle Linux driver init
In Linux the up_down_mixer is initialized as process component type without mix definitions. This change adds to init() a default pass-through configuration with same input and output format. The up/down mixing configuration can be updated with bytes control. The mixing configuration is re-initialized in added prepare() step. Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
1 parent 6e03c12 commit bfad6f7

3 files changed

Lines changed: 40 additions & 4 deletions

File tree

src/audio/up_down_mixer/up_down_mixer.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,12 +335,16 @@ static int up_down_mixer_free(struct processing_module *mod)
335335

336336
static int up_down_mixer_init(struct processing_module *mod)
337337
{
338+
struct up_down_mixer_config default_config;
338339
struct module_config *dst = &mod->priv.cfg;
339-
const struct ipc4_up_down_mixer_module_cfg *up_down_mixer = dst->init_data;
340+
const struct ipc4_up_down_mixer_module_cfg *up_down_mixer_init = dst->init_data;
341+
const struct up_down_mixer_config *up_down_mixer = &up_down_mixer_init->config;
340342
struct module_data *mod_data = &mod->priv;
341343
struct comp_dev *dev = mod->dev;
342344
struct up_down_mixer_data *cd;
345+
size_t min_size;
343346
int ret;
347+
int i;
344348

345349
cd = rzalloc(SOF_MEM_ZONE_RUNTIME, 0, SOF_MEM_CAPS_RAM, sizeof(*cd));
346350
if (!cd) {
@@ -357,6 +361,32 @@ static int up_down_mixer_init(struct processing_module *mod)
357361
goto err;
358362
}
359363

364+
comp_info(dev, "nb_input_pins = %d, nb_output_pins = %d",
365+
dst->nb_input_pins, dst->nb_output_pins);
366+
367+
min_size = sizeof(struct ipc4_base_module_cfg);
368+
if (dst->nb_input_pins > 0 && dst->nb_output_pins > 0)
369+
min_size += ipc4_calc_base_module_cfg_ext_size(dst->nb_input_pins,
370+
dst->nb_output_pins);
371+
comp_info(dev, "ipc_config_size = %d, min_size = %d",
372+
dev->ipc_config.ipc_config_size, min_size);
373+
374+
if (dev->ipc_config.ipc_config_size > min_size) {
375+
cd->has_init_mix_configuration = true;
376+
comp_info(dev, "init data contains up_down_mixer configuration");
377+
comp_info(dev, "out_channel_config = %d", up_down_mixer->out_channel_config);
378+
comp_info(dev, "coefficients_select = %d", up_down_mixer->coefficients_select);
379+
comp_info(dev, "channel_map = %d", up_down_mixer->channel_map);
380+
for (i = 0; i < UP_DOWN_MIX_COEFFS_LENGTH; i++)
381+
comp_info(dev, "coef[%d] = %d", i, up_down_mixer->coefficients[i]);
382+
} else {
383+
cd->has_init_mix_configuration = false;
384+
default_config.out_channel_config = up_down_mixer_init->base_cfg.audio_fmt.ch_cfg;
385+
default_config.coefficients_select = DEFAULT_COEFFICIENTS;
386+
up_down_mixer = &default_config;
387+
comp_info(dev, "no up_down_mixer configuration in init, using default");
388+
}
389+
360390
switch (up_down_mixer->coefficients_select) {
361391
case DEFAULT_COEFFICIENTS:
362392
cd->out_channel_map = create_channel_map(up_down_mixer->out_channel_config);

src/audio/up_down_mixer/up_down_mixer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <ipc/stream.h>
1515
#include <ipc4/module.h>
1616
#include <ipc4/base-config.h>
17+
#include <stdbool.h>
1718
#include <stddef.h>
1819
#include <stdint.h>
1920

@@ -142,6 +143,8 @@ struct up_down_mixer_data {
142143
/** In/out internal buffers */
143144
int32_t *buf_in;
144145
int32_t *buf_out;
146+
147+
bool has_init_mix_configuration;
145148
};
146149

147150
/**

src/audio/up_down_mixer/up_down_mixer_ipc4.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ enum up_down_mix_coeff_select {
2828
#define UP_DOWN_MIX_COEFFS_LENGTH 8
2929
#define IPC4_UP_DOWN_MIXER_MODULE_OUTPUT_PINS_COUNT 1
3030

31-
struct ipc4_up_down_mixer_module_cfg {
32-
struct ipc4_base_module_cfg base_cfg;
33-
31+
struct up_down_mixer_config {
3432
/*
3533
* Output Channel Configuration.
3634
* Together with audio_fmt.channel_config determines module conversion ratio.
@@ -64,6 +62,11 @@ struct ipc4_up_down_mixer_module_cfg {
6462
* channel decoding.
6563
*/
6664
channel_map channel_map;
65+
};
66+
67+
struct ipc4_up_down_mixer_module_cfg {
68+
struct ipc4_base_module_cfg base_cfg;
69+
struct up_down_mixer_config config;
6770
} __packed __aligned(8);
6871

6972
#endif /* __SOF_IPC4_UP_DOWN_MIXER_H__ */

0 commit comments

Comments
 (0)