[alsa-devel] HD-audio regression after commit 34588709af61be1550b4e2bcee5c85d0ac4f34d4

Takashi Iwai tiwai at suse.de
Tue Jan 22 08:05:19 CET 2013


At Mon, 21 Jan 2013 21:21:45 +0100,
Takashi Iwai wrote:
> 
> At Mon, 21 Jan 2013 14:11:47 -0500,
> Miro Hodak wrote:
> > 
> > [1  <text/plain; ISO-8859-1 (7bit)>]
> > On Mon, Jan 21, 2013 at 12:44 PM, Miro Hodak <mhodak127 at gmail.com> wrote:
> > 
> > >
> > >
> > > On Mon, Jan 21, 2013 at 12:29 PM, Takashi Iwai <tiwai at suse.de> wrote:
> > >
> > >> At Mon, 21 Jan 2013 12:08:13 -0500,
> > >> Miro Hodak wrote:
> > >> >
> > >> > On Mon, Jan 21, 2013 at 4:18 AM, Raymond Yau <
> > >> superquad.vortex2 at gmail.com>wrote:
> > >> >
> > >> > >
> > >> > > > I have been playing with Independent HP feature and while I can get
> > >> it
> > >> > > to work in aplay and mplayer, it does not seem to work on vlc and
> > >> Skype.
> > >> > > Both applications seem to have options for sending sound to HPs
> > >> ("AD1989B
> > >> > > Analog Front Speakers" or "AD1989B Analog (hw: 0,2)" - Skype only),
> > >> but
> > >> > > none of those options sends sound to the HPs. Any thoughts on this?
> > >> > >
> > >> > > Because the driver should not allow user to change the independent
> > >> > > headphone switch when there is any playing stream
> > >> > >
> > >> > The Independent HP switch is on before starting these apps (vlc and
> > >> Skype).
> > >>
> > >> Maybe it's because you set it beforehand?
> > >> The previous mixer state is restored usually upon login or reboot.
> > >>
> > >>
> > >> Takashi
> > >>
> > >
> > > Well, I verify that the Independent  HP mode works  just before trying
> > > these applications so mixer should be in correct state.
> > >
> > 
> > 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 necessary change would be likely trivial, so I'm going to
> implement it tomorrow.

The patch is below, already merged in test/hda-gen-parser branch (and 
test/hda-migrate and master branch, too), as usual.


Takashi

---
From: Takashi Iwai <tiwai at 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 at 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);
+
 		ret = 1;
 	}
  unlock:
@@ -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



More information about the Alsa-devel mailing list