ALSA: hda - Fix wrong volumes in AD1988 auto-probe mode
authorTakashi Iwai <tiwai@suse.de>
Mon, 16 Jun 2008 13:47:26 +0000 (15:47 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 18 Jun 2008 07:24:36 +0000 (09:24 +0200)
Don't create mixer volume elements for Headphone and Speaker if they
use the same DAC as normal line-outs on AD1988.  Otherwise the amp
value gets screwed up, e.g.
https://bugzilla.novell.com/show_bug.cgi?id=398255

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/hda/patch_analog.c

index 55ce897ef0b3a8447f8fca80228d509680458489..05ca027fcc01c397ee80354c7d847699e7534453 100644 (file)
@@ -2621,7 +2621,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
 {
        struct ad198x_spec *spec = codec->spec;
        hda_nid_t nid;
-       int idx, err;
+       int i, idx, err;
        char name[32];
 
        if (! pin)
@@ -2629,16 +2629,26 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
 
        idx = ad1988_pin_idx(pin);
        nid = ad1988_idx_to_dac(codec, idx);
-       /* specify the DAC as the extra output */
-       if (! spec->multiout.hp_nid)
-               spec->multiout.hp_nid = nid;
-       else
-               spec->multiout.extra_out_nid[0] = nid;
-       /* control HP volume/switch on the output mixer amp */
-       sprintf(name, "%s Playback Volume", pfx);
-       if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
-                              HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)
-               return err;
+       /* check whether the corresponding DAC was already taken */
+       for (i = 0; i < spec->autocfg.line_outs; i++) {
+               hda_nid_t pin = spec->autocfg.line_out_pins[i];
+               hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin));
+               if (dac == nid)
+                       break;
+       }
+       if (i >= spec->autocfg.line_outs) {
+               /* specify the DAC as the extra output */
+               if (!spec->multiout.hp_nid)
+                       spec->multiout.hp_nid = nid;
+               else
+                       spec->multiout.extra_out_nid[0] = nid;
+               /* control HP volume/switch on the output mixer amp */
+               sprintf(name, "%s Playback Volume", pfx);
+               err = add_control(spec, AD_CTL_WIDGET_VOL, name,
+                                 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
+               if (err < 0)
+                       return err;
+       }
        nid = ad1988_mixer_nids[idx];
        sprintf(name, "%s Playback Switch", pfx);
        if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,