Actually, it works fine in Skype when using "AD1989B Analog (hw:
0,2)". I
was confused because I changed only "Speakers" to that device and
tried
making a test sound. That did not work, apparently test sound goes to whatever "Ringing" is set to. But when making actual calls, it works
as
expected and I can take advantage of the Independent HP feature.
Hm, there should be nothing to touch the indep-HP mixer control from PCM, so I have no idea why it went wrong.
BTW, I guess we have still an issue regarding indep HP. When it's ON, should the auto-mute be disabled, no? Although one can disable the automute manually, it'd be maybe more user-friendly if the driver does it by itself.
The patch is below, already merged in test/hda-gen-parser branch (and test/hda-migrate and master branch, too), as usual.
Does it mean that the value of the "front headphone jack" kcontrol is no longer updated when the independent headphone is switch on ?
From: Takashi Iwai tiwai@suse.de Subject: [PATCH] ALSA: hda - Disable HP auto-mute during independent HP
mode
Both the HP auto-mute and the independent HP mode conflict with each other. Make HP auto-mute disabled (only for the affected HP jack) during the driver is in HP independent mode.
Signed-off-by: Takashi Iwai tiwai@suse.de
sound/pci/hda/hda_generic.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 63d12ef..258fb5e 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -1889,6 +1889,13 @@ static int indep_hp_put(struct snd_kcontrol
*kcontrol,
*dacp = 0; else *dacp = spec->alt_dac_nid;
/* update HP auto-mute state too */
if (spec->hp_automute_hook)
spec->hp_automute_hook(codec, NULL);
else
snd_hda_gen_hp_automute(codec, NULL);
unlock:ret = 1; }
@@ -3467,10 +3474,16 @@ static void call_update_outputs(struct hda_codec
*codec)
void snd_hda_gen_hp_automute(struct hda_codec *codec, struct
hda_jack_tbl *jack)
{ struct hda_gen_spec *spec = codec->spec;
hda_nid_t *pins = spec->autocfg.hp_pins;
int num_pins = ARRAY_SIZE(spec->autocfg.hp_pins);
/* No detection for the first HP jack during indep-HP mode */
if (spec->indep_hp_enabled) {
pins++;
num_pins--;
}
spec->hp_jack_present =
detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
spec->autocfg.hp_pins);
spec->hp_jack_present = detect_jacks(codec, num_pins, pins); if (!spec->detect_hp || (!spec->automute_speaker &&
!spec->automute_lo))
return; call_update_outputs(codec);
-- 1.8.1.1