diff mbox

ALSA: hda - Fix wrong detection of "Headphone+LO" or "Speaker+LO"

Message ID 54f5995b.7e5343ac.bm001@wupperonline.de (mailing list archive)
State New, archived
Headers show

Commit Message

Ingo Brueckl March 3, 2015, 11:22 a.m. UTC
Add the constraint mentioned in the comment.

It does not apply to a scenario with three DACs and multi-IO where we
would normally get a "Master Playback Volume" and a "Front Playback
Volume" (prevented without checking for num_dacs).

Signed-off-by: Ingo Brückl <ib@wupperonline.de>

--
1.7.10

Comments

David Henningsson March 3, 2015, 1:24 p.m. UTC | #1
Hi Ingo and thanks for trying to improve the driver,

I've been reading through the alsa-devel thread but your alsa-info was 
removed when it was posted to the list so it's a bit hard to see the 
context.

If I understand correctly, you have three DACs, one internal speaker, 
one headphone jack, and three jacks that are both used for 5.1 surround 
and line out/mic/line in. Is this correct?

How do the DACs get assigned in this case? One would assume that you'd 
get 02 -> Front LO, HP, Speaker, 03 -> Rear LO, 04 -> CLFE LO. And then 
the volume/mute control for DAC node 02 would be called "PCM" (since 
both hp_lo_shared and spk_lo_shared are true), but in fact it would be 
more appropriate to call it "Front".

Anyhow, I'd say that the typical case where we want the "Headphone+LO" 
names is where we have only one LO, and then multiout.num_dacs would be 
1, not 2. (I think, it was a while since I looked into that part of the 
driver...)

// David

On 2015-03-03 12:22, Ingo Brückl wrote:
> Add the constraint mentioned in the comment.
>
> It does not apply to a scenario with three DACs and multi-IO where we
> would normally get a "Master Playback Volume" and a "Front Playback
> Volume" (prevented without checking for num_dacs).
>
> Signed-off-by: Ingo Brückl <ib@wupperonline.de>
>
> diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
> index ecee349..4c8910c 100644
> --- a/sound/pci/hda/hda_generic.c
> +++ b/sound/pci/hda/hda_generic.c
> @@ -1097,7 +1097,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
>   	case AUTO_PIN_LINE_OUT:
>   		/* This deals with the case where we have two DACs and
>   		 * one LO, one HP and one Speaker */
> -		if (!ch && cfg->speaker_outs && cfg->hp_outs) {
> +		if (!ch && spec->multiout.num_dacs == 2 && cfg->speaker_outs && cfg->hp_outs) {
>   			bool hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
>   			bool spk_lo_shared = !path_has_mixer(codec, spec->speaker_paths[0], ctl_type);
>   			if (hp_lo_shared && spk_lo_shared)
> --
> 1.7.10
>
Ingo Brueckl March 3, 2015, 3:04 p.m. UTC | #2
David Henningsson wrote on Tue, 03 Mar 2015 14:24:28 +0100:

> If I understand correctly, you have three DACs, one internal speaker,
> one headphone jack, and three jacks that are both used for 5.1 surround
> and line out/mic/line in. Is this correct?

This is correct. In addition I have a front mic jack.

> How do the DACs get assigned in this case? One would assume that you'd
> get 02 -> Front LO, HP, Speaker, 03 -> Rear LO, 04 -> CLFE LO.

With my private patch to enforce multi-io I seem to lose the internal speaker
which isn't bad because it isn't connected (and probably never won't be).

You are right concerning the remaining assignments:

multi_outs = 14/0/0/0 : 2/3/4/0 (type LO)
  out path: depth=3 '02:0c:14'
multi_ios(2) = 1a/18 : 3/4
  mio path: depth=3 '03:0d:1a'
  mio path: depth=3 '04:0e:18'
hp_outs = 1b/0/0/0 : 2/0/0/0
  hp  path: depth=3 '02:0c:1b'
spk_outs = 15/0/0/0 : 0/0/0/0

> And then the volume/mute control for DAC node 02 would be called "PCM"
> (since both hp_lo_shared and spk_lo_shared are true), but in fact it would
> be more appropriate to call it "Front".

I've got a Master that would only affect the Front (PCM) and a PCM that
affected Surround/CLFE which was very unpleasant.

With the patch I'm getting a real Master (for all Front/Surround/CLFE) and a
separate Front Volume Control in addition to Surround, Center and LFE which
is exactly how it should be.

> Anyhow, I'd say that the typical case where we want the "Headphone+LO"
> names is where we have only one LO, and then multiout.num_dacs would be
> 1, not 2. (I think, it was a while since I looked into that part of the
> driver...)

I'm fine with everything below 3. :-) Just tell me.

Ingo
Raymond Yau March 3, 2015, 3:18 p.m. UTC | #3
>
> Add the constraint mentioned in the comment.
>
> It does not apply to a scenario with three DACs and multi-IO where we
> would normally get a "Master Playback Volume" and a "Front Playback
> Volume" (prevented without checking for num_dacs).
>
> Signed-off-by: Ingo Brückl <ib@wupperonline.de>
>
> diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
> index ecee349..4c8910c 100644
> --- a/sound/pci/hda/hda_generic.c
> +++ b/sound/pci/hda/hda_generic.c
> @@ -1097,7 +1097,7 @@ static const char *get_line_out_pfx(struct
hda_codec *codec, int ch,
>         case AUTO_PIN_LINE_OUT:
>                 /* This deals with the case where we have two DACs and
>                  * one LO, one HP and one Speaker */
> -               if (!ch && cfg->speaker_outs && cfg->hp_outs) {
> +               if (!ch && spec->multiout.num_dacs == 2 &&
cfg->speaker_outs && cfg->hp_outs) {

spec->multiout.num_dacs == 2 mean support 4 channels

You need to find out the number of analog dacs from spec->all_dacs[]
exclude the digital output

>                         bool hp_lo_shared = !path_has_mixer(codec,
spec->hp_paths[0], ctl_type);
>                         bool spk_lo_shared = !path_has_mixer(codec,
spec->speaker_paths[0], ctl_type);
>                         if (hp_lo_shared && spk_lo_shared)
> --
> 1.7.10
diff mbox

Patch

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index ecee349..4c8910c 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -1097,7 +1097,7 @@  static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
 	case AUTO_PIN_LINE_OUT:
 		/* This deals with the case where we have two DACs and
 		 * one LO, one HP and one Speaker */
-		if (!ch && cfg->speaker_outs && cfg->hp_outs) {
+		if (!ch && spec->multiout.num_dacs == 2 && cfg->speaker_outs && cfg->hp_outs) {
 			bool hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
 			bool spk_lo_shared = !path_has_mixer(codec, spec->speaker_paths[0], ctl_type);
 			if (hp_lo_shared && spk_lo_shared)