When the auto-mic mode is enabled, changing the input source externally conflicts with the automatic selection mechanism. Make the control inactive when auto mic is set.
Signed-off-by: Takashi Iwai tiwai@suse.de --- sound/pci/hda/patch_realtek.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b3612a4..3236645 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -347,6 +347,11 @@ static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic) call_update_outputs(codec); }
+static struct snd_ctl_elem_id capture_source_id = { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Capture Source" +}; + /* select the given imux item; either unmute exclusively or select the route */ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, unsigned int idx, bool force, bool notify) @@ -406,12 +411,8 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, alc_inv_dmic_sync(codec, true);
if (notify) { - struct snd_ctl_elem_id id; - memset(&id, 0, sizeof(id)); - id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; - strcpy(id.name, "Capture Source"); snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, - &id); + &capture_source_id); }
return 1; @@ -703,9 +704,13 @@ static void alc880_unsol_event(struct hda_codec *codec, unsigned int res) /* call init functions of standard auto-mute helpers */ static void alc_inithook(struct hda_codec *codec) { + struct alc_spec *spec = codec->spec; alc_hp_automute(codec, NULL); alc_line_automute(codec, NULL); alc_mic_automute(codec, NULL); + if (spec->auto_mic_valid_imux) + snd_ctl_activate_id(codec->bus->card, &capture_source_id, + !spec->auto_mic); }
/* additional initialization for ALC888 variants */ @@ -964,6 +969,7 @@ static int alc_automic_mode_put(struct snd_kcontrol *kcontrol, return 0; spec->auto_mic = val; alc_mic_automute(codec, NULL); + snd_ctl_activate_id(codec->bus->card, &capture_source_id, !val); return 1; }