提交 43785eae 编写于 作者: T Takashi Iwai 提交者: Jaroslav Kysela

ALSA: hda - Fix wrong volumes in AD1988 auto-probe mode

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=398255Signed-off-by: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NJaroslav Kysela <perex@perex.cz>
上级 83544994
...@@ -2621,7 +2621,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, ...@@ -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; struct ad198x_spec *spec = codec->spec;
hda_nid_t nid; hda_nid_t nid;
int idx, err; int i, idx, err;
char name[32]; char name[32];
if (! pin) if (! pin)
...@@ -2629,16 +2629,26 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t 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); idx = ad1988_pin_idx(pin);
nid = ad1988_idx_to_dac(codec, idx); nid = ad1988_idx_to_dac(codec, idx);
/* specify the DAC as the extra output */ /* check whether the corresponding DAC was already taken */
if (! spec->multiout.hp_nid) for (i = 0; i < spec->autocfg.line_outs; i++) {
spec->multiout.hp_nid = nid; hda_nid_t pin = spec->autocfg.line_out_pins[i];
else hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin));
spec->multiout.extra_out_nid[0] = nid; if (dac == nid)
/* control HP volume/switch on the output mixer amp */ break;
sprintf(name, "%s Playback Volume", pfx); }
if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name, if (i >= spec->autocfg.line_outs) {
HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0) /* specify the DAC as the extra output */
return err; 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]; nid = ad1988_mixer_nids[idx];
sprintf(name, "%s Playback Switch", pfx); sprintf(name, "%s Playback Switch", pfx);
if ((err = add_control(spec, AD_CTL_BIND_MUTE, name, if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册