ALSA: hda - Allow auto_mute_via_amp on bind mute controls
authorTakashi Iwai <tiwai@suse.de>
Fri, 9 Aug 2013 13:05:03 +0000 (15:05 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 13 Aug 2013 07:10:37 +0000 (09:10 +0200)
The auto-mute using the amp currently works only for a single amp on a
pin.  Make it working also with HDA_CTL_BIND_MUTE type, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_generic.c

index f6c0344258ac579154345f15ca15ff80a97ec144..6ed2209c914214070518d9eb7dc0d93c2192ddac 100644 (file)
@@ -816,6 +816,8 @@ static void resume_path_from_idx(struct hda_codec *codec, int path_idx)
 
 static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
                                  struct snd_ctl_elem_value *ucontrol);
+static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol);
 
 enum {
        HDA_CTL_WIDGET_VOL,
@@ -833,7 +835,13 @@ static const struct snd_kcontrol_new control_templates[] = {
                .put = hda_gen_mixer_mute_put, /* replaced */
                .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
        },
-       HDA_BIND_MUTE(NULL, 0, 0, 0),
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .info = snd_hda_mixer_amp_switch_info,
+               .get = snd_hda_mixer_bind_switch_get,
+               .put = hda_gen_bind_mute_put, /* replaced */
+               .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
+       },
 };
 
 /* add dynamic controls from template */
@@ -940,8 +948,8 @@ static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
 }
 
 /* playback mute control with the software mute bit check */
-static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
-                                 struct snd_ctl_elem_value *ucontrol)
+static void sync_auto_mute_bits(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_value *ucontrol)
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct hda_gen_spec *spec = codec->spec;
@@ -952,10 +960,22 @@ static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
                ucontrol->value.integer.value[0] &= enabled;
                ucontrol->value.integer.value[1] &= enabled;
        }
+}
 
+static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
+                                 struct snd_ctl_elem_value *ucontrol)
+{
+       sync_auto_mute_bits(kcontrol, ucontrol);
        return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
 }
 
+static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       sync_auto_mute_bits(kcontrol, ucontrol);
+       return snd_hda_mixer_bind_switch_put(kcontrol, ucontrol);
+}
+
 /* any ctl assigned to the path with the given index? */
 static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
 {