[PATCH] ASoC: ipc4-topology: use different channel mask for each sdw amp feedback
Péter Ujfalusi
peter.ujfalusi at linux.intel.com
Wed Jan 25 15:12:44 CET 2023
On 25/01/2023 16:10, Peter Ujfalusi wrote:
> From: Bard Liao <yung-chuan.liao at linux.intel.com>
The subject line is missing "SOF", sending v2 right away, sorry.
> Currently, we use the same channel mask for aggregated speakers.
> It works fine for playback because we duplicate the audio data for all
> aggregated speakers. But we need to get audio data from each aggregated
> speaker and combine them to the captured audio. So we need to set
> non-overlapping channel mask for aggregated ALH DAIs.
>
> Signed-off-by: Bard Liao <yung-chuan.liao at linux.intel.com>
> Reviewed-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> Reviewed-by: Péter Ujfalusi <peter.ujfalusi at linux.intel.com>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi at linux.intel.com>
> ---
> sound/soc/sof/ipc4-topology.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/sound/soc/sof/ipc4-topology.c b/sound/soc/sof/ipc4-topology.c
> index 59f4d42f9011..34586cbb461f 100644
> --- a/sound/soc/sof/ipc4-topology.c
> +++ b/sound/soc/sof/ipc4-topology.c
> @@ -1203,8 +1203,11 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
> struct sof_ipc4_copier_data *alh_data;
> struct sof_ipc4_copier *alh_copier;
> struct snd_sof_widget *w;
> + u32 ch_count = 0;
> u32 ch_mask = 0;
> u32 ch_map;
> + u32 step;
> + u32 mask;
> int i;
>
> blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config;
> @@ -1214,11 +1217,15 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
> /* Get channel_mask from ch_map */
> ch_map = copier_data->base_config.audio_fmt.ch_map;
> for (i = 0; ch_map; i++) {
> - if ((ch_map & 0xf) != 0xf)
> + if ((ch_map & 0xf) != 0xf) {
> ch_mask |= BIT(i);
> + ch_count++;
> + }
> ch_map >>= 4;
> }
>
> + step = ch_count / blob->alh_cfg.count;
> + mask = GENMASK(step - 1, 0);
> /*
> * Set each gtw_cfg.node_id to blob->alh_cfg.mapping[]
> * for all widgets with the same stream name
> @@ -1233,7 +1240,22 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
> alh_copier = (struct sof_ipc4_copier *)dai->private;
> alh_data = &alh_copier->data;
> blob->alh_cfg.mapping[i].alh_id = alh_data->gtw_cfg.node_id;
> - blob->alh_cfg.mapping[i].channel_mask = ch_mask;
> + /*
> + * Set the same channel mask for playback as the audio data is
> + * duplicated for all speakers. For capture, split the channels
> + * among the aggregated DAIs. For example, with 4 channels on 2
> + * aggregated DAIs, the channel_mask should be 0x3 and 0xc for the
> + * two DAI's.
> + * The channel masks used depend on the cpu_dais used in the
> + * dailink at the machine driver level, which actually comes from
> + * the tables in soc_acpi files depending on the _ADR and devID
> + * registers for each codec.
> + */
> + if (w->id == snd_soc_dapm_dai_in)
> + blob->alh_cfg.mapping[i].channel_mask = ch_mask;
> + else
> + blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
> +
> i++;
> }
> if (blob->alh_cfg.count > 1) {
--
Péter
More information about the Alsa-devel
mailing list