[alsa-devel] [PATCH v2 4/5] ASoC: dapm: Add support for autodisable mux controls
Lars-Peter Clausen
lars at metafoo.de
Thu Apr 30 19:48:09 CEST 2015
On 04/30/2015 06:38 PM, Charles Keepax wrote:
[...]
> @@ -354,6 +355,34 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
> }
> }
> break;
> + case snd_soc_dapm_mux:
> + e = (struct soc_enum *)kcontrol->private_value;
> +
> + if (e->autodisable) {
> + struct snd_soc_dapm_widget template;
> +
> + memset(&template, 0, sizeof(template));
> + template.reg = e->reg;
> + template.mask = e->mask << e->shift_l;
> + template.shift = e->shift_l;
> + template.off_val = e->values[0];
I think we should handle the case where e->values is NULL. In which case
off_val should just be 0.
> + template.on_val = template.off_val;
> + template.id = snd_soc_dapm_kcontrol;
> + template.name = name;
> +
[...]
> @@ -3002,10 +3034,10 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
>
> mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
>
> + change = dapm_kcontrol_set_value(kcontrol, val);
> +
> if (e->reg != SND_SOC_NOPM)
> change = soc_dapm_test_bits(dapm, e->reg, mask, val);
> - else
> - change = dapm_kcontrol_set_value(kcontrol, val);
>
This probably needs the same logic as in snd_soc_dapm_put_volsw() to
correctly handle the case where the hardware state and the software state
might be out of sync.
> if (change) {
> if (e->reg != SND_SOC_NOPM) {
>
/
More information about the Alsa-devel
mailing list