DAPM PIN switches do not update in alsamixer when changed through UCM profile
Takashi Iwai
tiwai at suse.de
Sun Oct 3 16:46:21 CEST 2021
On Sun, 03 Oct 2021 15:12:57 +0200,
Hans de Goede wrote:
>
> Hi All,
>
> I notice that DAPM PIN switches, such as e.g. the "Headphone"
> SOC_DAPM_PIN_SWITCH defined in:
> sound/soc/intel/boards/cht_bsw_nau8824.c:
>
> static const struct snd_kcontrol_new cht_mc_controls[] = {
> SOC_DAPM_PIN_SWITCH("Headphone"),
> SOC_DAPM_PIN_SWITCH("Headset Mic"),
> SOC_DAPM_PIN_SWITCH("Int Mic"),
> SOC_DAPM_PIN_SWITCH("Ext Spk"),
> };
>
> Do not get updated to reflect state-changes when the output
> is switched between e.g. Headphone / "Ext Spk" by
> pulseaudio/pipewire through the UCM profile mechanism.
>
> If I exit alsa-mixer after changing the output and
> start it again then the control does show the expect
> value. So it seems that we are failing to send a change
> event about this somewhere?
Does the patch below work?
thanks,
Takashi
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2561,6 +2561,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
const char *pin, int status)
{
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
+ int ret = 0;
dapm_assert_locked(dapm);
@@ -2573,13 +2574,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
dapm_mark_dirty(w, "pin configuration");
dapm_widget_invalidate_input_paths(w);
dapm_widget_invalidate_output_paths(w);
+ ret = 1;
}
w->connected = status;
if (status == 0)
w->force = 0;
- return 0;
+ return ret;
}
/**
@@ -3583,14 +3585,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
{
struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
const char *pin = (const char *)kcontrol->private_value;
+ int ret;
if (ucontrol->value.integer.value[0])
- snd_soc_dapm_enable_pin(&card->dapm, pin);
+ ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
else
- snd_soc_dapm_disable_pin(&card->dapm, pin);
+ ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
snd_soc_dapm_sync(&card->dapm);
- return 0;
+ return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
@@ -4023,7 +4026,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
rtd->params_select = ucontrol->value.enumerated.item[0];
- return 0;
+ return 1;
}
static void
More information about the Alsa-devel
mailing list