ALSA: hda - Don't add aa-mix for VIA surrounds
authorTakashi Iwai <tiwai@suse.de>
Mon, 4 Jul 2011 15:35:51 +0000 (17:35 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 4 Jul 2011 15:37:57 +0000 (17:37 +0200)
Since we now route the front DAC via aa-mix widget, adding the aa-mix
to surrounds will result in a mix-up of both front and surround PCM
signals.  For avoiding this, the aa-mix routes have to be disabled
for surround paths.

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

index 8d46a0f937a9911d6e56d52dc5392a3b3a187993..42d5a91781fcca0cba00862455c8c9abacf9af06 100644 (file)
@@ -489,7 +489,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
 
 static void via_auto_init_output(struct hda_codec *codec,
                                 struct nid_path *path, int pin_type,
-                                bool force)
+                                bool with_aa_mix, bool force)
 {
        struct via_spec *spec = codec->spec;
        unsigned int caps;
@@ -520,9 +520,12 @@ static void via_auto_init_output(struct hda_codec *codec,
                idx = get_connection_index(codec, nid, spec->aa_mix_nid);
                if (idx >= 0) {
                        if (have_mute(codec, nid, HDA_INPUT)) {
+                               unsigned int mute = with_aa_mix ?
+                                       AMP_IN_UNMUTE(idx) : AMP_IN_MUTE(idx);
                                snd_hda_codec_write(codec, nid, 0,
                                                    AC_VERB_SET_AMP_GAIN_MUTE,
-                                                   AMP_IN_UNMUTE(idx));
+                                                   mute);
+                               /* exclusively via aa-mix for front */
                                if (pre_nid == spec->multiout.dac_nids[0]) {
                                        num = snd_hda_get_conn_list(codec, nid,
                                                                    NULL);
@@ -547,7 +550,9 @@ static void via_auto_init_multi_out(struct hda_codec *codec)
        int i;
 
        for (i = 0; i < spec->autocfg.line_outs + spec->smart51_nums; i++)
-               via_auto_init_output(codec, &spec->out_path[i], PIN_OUT, true);
+               /* enable aa-mute only for the front channel */
+               via_auto_init_output(codec, &spec->out_path[i], PIN_OUT,
+                                    i == 0, true);
 }
 
 static void via_auto_init_hp_out(struct hda_codec *codec)
@@ -555,15 +560,18 @@ static void via_auto_init_hp_out(struct hda_codec *codec)
        struct via_spec *spec = codec->spec;
 
        if (!spec->hp_dac_nid) {
-               via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true);
+               via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP,
+                                    true, true);
                return;
        }
        if (spec->hp_independent_mode) {
                activate_output_path(codec, &spec->hp_dep_path, false, false);
-               via_auto_init_output(codec, &spec->hp_path, PIN_HP, true);
+               via_auto_init_output(codec, &spec->hp_path, PIN_HP,
+                                    true, true);
        } else {
                activate_output_path(codec, &spec->hp_path, false, false);
-               via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true);
+               via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP,
+                                    true, true);
        }
 }
 
@@ -572,7 +580,8 @@ static void via_auto_init_speaker_out(struct hda_codec *codec)
        struct via_spec *spec = codec->spec;
 
        if (spec->autocfg.speaker_outs)
-               via_auto_init_output(codec, &spec->speaker_path, PIN_OUT, true);
+               via_auto_init_output(codec, &spec->speaker_path, PIN_OUT,
+                                    true, true);
 }
 
 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin);