ASoC: SOF: ipc4-topology: Fix the output reference params for SRC
For playback, the SRC sink rate must be configured based on the requested output format which is restricted to only handle DAI's that support a single audio format for now. For capture, the SRC module should convert the rate to match the rate requested by the PCM hw_params. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20230821113629.5017-3-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ef24388225
commit
56ecc16404
|
@ -1839,19 +1839,39 @@ static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
|
|||
struct sof_ipc4_src *src = swidget->private;
|
||||
struct sof_ipc4_available_audio_format *available_fmt = &src->available_fmt;
|
||||
struct sof_ipc4_audio_format *out_audio_fmt;
|
||||
struct sof_ipc4_audio_format *in_fmt;
|
||||
struct sof_ipc4_audio_format *in_audio_fmt;
|
||||
u32 out_ref_rate, out_ref_channels, out_ref_valid_bits;
|
||||
int ret, output_format_index;
|
||||
int output_format_index, input_format_index;
|
||||
|
||||
ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->base_config,
|
||||
pipeline_params, available_fmt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
input_format_index = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->base_config,
|
||||
pipeline_params, available_fmt);
|
||||
if (input_format_index < 0)
|
||||
return input_format_index;
|
||||
|
||||
in_fmt = &available_fmt->input_pin_fmts[ret].audio_fmt;
|
||||
out_ref_rate = in_fmt->sampling_frequency;
|
||||
out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg);
|
||||
out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg);
|
||||
/*
|
||||
* For playback, the SRC sink rate will be configured based on the requested output
|
||||
* format, which is restricted to only deal with DAI's with a single format for now.
|
||||
*/
|
||||
if (dir == SNDRV_PCM_STREAM_PLAYBACK && available_fmt->num_output_formats > 1) {
|
||||
dev_err(sdev->dev, "Invalid number of output formats: %d for SRC %s\n",
|
||||
available_fmt->num_output_formats, swidget->widget->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* SRC does not perform format conversion, so the output channels and valid bit depth must
|
||||
* be the same as that of the input.
|
||||
*/
|
||||
in_audio_fmt = &available_fmt->input_pin_fmts[input_format_index].audio_fmt;
|
||||
out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_audio_fmt->fmt_cfg);
|
||||
out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_audio_fmt->fmt_cfg);
|
||||
|
||||
/*
|
||||
* For capture, the SRC module should convert the rate to match the rate requested by the
|
||||
* PCM hw_params. Set the reference params based on the fe_params unconditionally as it
|
||||
* will be ignored for playback anyway.
|
||||
*/
|
||||
out_ref_rate = params_rate(fe_params);
|
||||
|
||||
output_format_index = sof_ipc4_init_output_audio_fmt(sdev, &src->base_config,
|
||||
available_fmt, out_ref_rate,
|
||||
|
|
Loading…
Reference in New Issue