ALSA: hda - Fix invalid multi-channel amplifiers for VT1718S
authorLydia Wang <lydiawang@viatech.com.cn>
Mon, 4 Jul 2011 09:01:33 +0000 (17:01 +0800)
committerTakashi Iwai <tiwai@suse.de>
Mon, 4 Jul 2011 12:53:25 +0000 (14:53 +0200)
For VT1718S, the multi-channel path should be like following:
DAC 0-->Mixer 9(index 5)-->Mixer 0(index 1)-->Front Pin;
DAC 1-->Mixer 1(index 0)-->Surround Pin;
DAC 2-->C/LFE Pin;
DAC 3-->Mixer 2(index 0)-->Side Pin;

But current code built Surround and Side path through index 1 of
Mixer 1 and 2. So Adjusting Surround and Side channel amplifier is
invalid. This patch fixes the issue.

Signed-off-by: Lydia Wang <lydiawang@viatech.com.cn>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_via.c

index 89dd29d..7305f4d 100644 (file)
@@ -452,8 +452,9 @@ static void activate_output_path(struct hda_codec *codec, struct nid_path *path,
                if (enable && path->multi[i])
                        snd_hda_codec_write(codec, dst, 0,
                                            AC_VERB_SET_CONNECT_SEL, idx);
-               if (get_wcaps_type(get_wcaps(codec, src)) == AC_WID_AUD_OUT &&
-                   get_wcaps_type(get_wcaps(codec, dst)) == AC_WID_AUD_MIX)
+               if (!force
+                   && get_wcaps_type(get_wcaps(codec, src)) == AC_WID_AUD_OUT
+                   && get_wcaps_type(get_wcaps(codec, dst)) == AC_WID_AUD_MIX)
                        continue;
                if (have_mute(codec, dst, HDA_INPUT)) {
                        int val = enable ? AMP_IN_UNMUTE(idx) :
@@ -490,8 +491,8 @@ static void via_auto_init_output(struct hda_codec *codec,
 {
        struct via_spec *spec = codec->spec;
        unsigned int caps;
-       hda_nid_t pin, nid;
-       int i, idx;
+       hda_nid_t pin, nid, pre_nid;
+       int i, idx, j, num;
 
        if (!path->depth)
                return;
@@ -513,12 +514,26 @@ static void via_auto_init_output(struct hda_codec *codec,
                return;
        for (i = path->depth - 1; i > 0; i--) {
                nid = path->path[i];
+               pre_nid = path->path[i - 1];
                idx = get_connection_index(codec, nid, spec->aa_mix_nid);
                if (idx >= 0) {
-                       if (have_mute(codec, nid, HDA_INPUT))
+                       if (have_mute(codec, nid, HDA_INPUT)) {
                                snd_hda_codec_write(codec, nid, 0,
                                                    AC_VERB_SET_AMP_GAIN_MUTE,
                                                    AMP_IN_UNMUTE(idx));
+                               if (pre_nid == spec->multiout.dac_nids[0]) {
+                                       num = snd_hda_get_conn_list(codec, nid,
+                                                                   NULL);
+                                       for (j = 0; j < num; j++) {
+                                               if (j == idx)
+                                                       continue;
+                                               snd_hda_codec_write(codec,
+                                                   nid, 0,
+                                                   AC_VERB_SET_AMP_GAIN_MUTE,
+                                                   AMP_IN_MUTE(j));
+                                       }
+                               }
+                       }
                        break;
                }
        }