Skip to content

Commit eadc01d

Browse files
Chao Songplbossart
authored andcommitted
ASoC: SOF: ipc4-topology: set copier output format for process module
The copier output pin 0 format is set with module instance initialization, format for additional copier output pin should be set before the pin is used. If a process module is connected to additional copier output pin, the copier output pin format should be set according to the corresponding input pin format of the process module. Signed-off-by: Chao Song <chao.song@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
1 parent ef16352 commit eadc01d

1 file changed

Lines changed: 43 additions & 3 deletions

File tree

sound/soc/sof/ipc4-topology.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,37 @@ static void sof_ipc4_dbg_audio_format(struct device *dev, struct sof_ipc4_pin_fo
167167
}
168168
}
169169

170+
static const struct sof_ipc4_audio_format *
171+
sof_ipc4_get_input_pin_audio_fmt(struct snd_sof_widget *swidget, int pin_index)
172+
{
173+
struct sof_ipc4_base_module_cfg_ext *base_cfg_ext;
174+
struct sof_ipc4_process *process;
175+
int i;
176+
177+
if (swidget->id != snd_soc_dapm_effect) {
178+
struct sof_ipc4_base_module_cfg *base = swidget->private;
179+
180+
/* For non-process modules, base module config format is used for all input pins */
181+
return &base->audio_fmt;
182+
}
183+
184+
process = swidget->private;
185+
base_cfg_ext = process->base_config_ext;
186+
187+
/*
188+
* If there are multiple input formats available for a pin, the first available format
189+
* is chosen.
190+
*/
191+
for (i = 0; i < base_cfg_ext->num_input_pin_fmts; i++) {
192+
struct sof_ipc4_pin_format *pin_format = &base_cfg_ext->pin_formats[i];
193+
194+
if (pin_format->pin_index == pin_index)
195+
return &pin_format->audio_fmt;
196+
}
197+
198+
return NULL;
199+
}
200+
170201
/**
171202
* sof_ipc4_get_audio_fmt - get available audio formats from swidget->tuples
172203
* @scomp: pointer to pointer to SOC component
@@ -2128,9 +2159,9 @@ static int sof_ipc4_set_copier_sink_format(struct snd_sof_dev *sdev,
21282159
struct snd_sof_widget *sink_widget,
21292160
int sink_id)
21302161
{
2131-
struct sof_ipc4_base_module_cfg *sink_config = sink_widget->private;
2132-
struct sof_ipc4_base_module_cfg *src_config;
21332162
struct sof_ipc4_copier_config_set_sink_format format;
2163+
struct sof_ipc4_base_module_cfg *src_config;
2164+
const struct sof_ipc4_audio_format *pin_fmt;
21342165
struct sof_ipc4_fw_module *fw_module;
21352166
struct sof_ipc4_msg msg = {{ 0 }};
21362167
u32 header, extension;
@@ -2150,7 +2181,16 @@ static int sof_ipc4_set_copier_sink_format(struct snd_sof_dev *sdev,
21502181

21512182
format.sink_id = sink_id;
21522183
memcpy(&format.source_fmt, &src_config->audio_fmt, sizeof(format.source_fmt));
2153-
memcpy(&format.sink_fmt, &sink_config->audio_fmt, sizeof(format.sink_fmt));
2184+
2185+
pin_fmt = sof_ipc4_get_input_pin_audio_fmt(sink_widget, sink_id);
2186+
if (!pin_fmt) {
2187+
dev_err(sdev->dev, "Unable to get pin %d format for %s",
2188+
sink_id, sink_widget->widget->name);
2189+
return -EINVAL;
2190+
}
2191+
2192+
memcpy(&format.sink_fmt, pin_fmt, sizeof(format.sink_fmt));
2193+
21542194
msg.data_size = sizeof(format);
21552195
msg.data_ptr = &format;
21562196

0 commit comments

Comments
 (0)