ALSA: hda/realtek - Fix DAC assignments of multiple speakers
authorTakashi Iwai <tiwai@suse.de>
Fri, 21 Oct 2011 13:07:42 +0000 (15:07 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 21 Oct 2011 13:07:42 +0000 (15:07 +0200)
When a device has multiple speakers and still has the auto-mute support,
the driver copies line_outs[] to speaker_outs[].  And then it tries to
assign DACs for both.  This ended up with the assignment only to the
primary DAC to all speakers.

This patch fixes the situation by checking the duplicated LO/SPK case
appropriately.

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

index f9d24c33ce93b230719b4c2e1fbfec3351ca1106..f7762005db1ecf21e1afed7a3c7e258a61f8dc1d 100644 (file)
@@ -2996,9 +2996,11 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
                }
        }
 
-       alc_auto_fill_extra_dacs(codec, cfg->hp_outs, cfg->hp_pins,
+       if (cfg->line_out_type != AUTO_PIN_HP_OUT)
+               alc_auto_fill_extra_dacs(codec, cfg->hp_outs, cfg->hp_pins,
                                 spec->multiout.hp_out_nid);
-       alc_auto_fill_extra_dacs(codec, cfg->speaker_outs, cfg->speaker_pins,
+       if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
+               alc_auto_fill_extra_dacs(codec, cfg->speaker_outs, cfg->speaker_pins,
                                 spec->multiout.extra_out_nid);
 
        return 0;
@@ -3315,6 +3317,8 @@ static void alc_auto_init_extra_out(struct hda_codec *codec)
        hda_nid_t pin, dac;
 
        for (i = 0; i < spec->autocfg.hp_outs; i++) {
+               if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
+                       break;
                pin = spec->autocfg.hp_pins[i];
                if (!pin)
                        break;
@@ -3328,6 +3332,8 @@ static void alc_auto_init_extra_out(struct hda_codec *codec)
                alc_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
        }
        for (i = 0; i < spec->autocfg.speaker_outs; i++) {
+               if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
+                       break;
                pin = spec->autocfg.speaker_pins[i];
                if (!pin)
                        break;