[PATCH] ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP

Takashi Iwai tiwai at suse.de
Tue May 4 10:30:38 CEST 2021


On Tue, 04 May 2021 09:39:17 +0200,
Hui Wang wrote:
> 
> Without this change, the DAC ctl's name could be changed only when
> the machine has both Speaker and Headphone, but we met some machines
> which only has Lineout and Headhpone, and the Lineout and Headphone
> share the Audio Mixer0 and DAC0, the ctl's name is set to "Front".
> 
> On most of machines, the "Front" is used for Speaker only or Lineout
> only, but on this machine it is shared by Lineout and Headphone,
> This introduces an issue in the pipewire and pulseaudio, suppose users
> want the Headphone to be on and the Speaker/Lineout to be off, they
> could turn off the "Front", this works on most of the machines, but on
> this machine, the "Front" couldn't be turned off otherwise the
> headphone will be off too. Here we do some change to let the ctl's
> name change to "Headphone+LO" on this machine, and pipewire and
> pulseaudio already could handle "Headphone+LO" and "Speaker+LO".
> (https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/747)
> 
> BugLink: http://bugs.launchpad.net/bugs/804178
> Signed-off-by: Hui Wang <hui.wang at canonical.com>

I'm fine to take the change, but wouldn't this break anything else in
PA?  Once when I get a positive answer, I'll apply it.


thanks,

Takashi

> ---
>  sound/pci/hda/hda_generic.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
> index 3998e1771805..b638fc2ef6f7 100644
> --- a/sound/pci/hda/hda_generic.c
> +++ b/sound/pci/hda/hda_generic.c
> @@ -1204,11 +1204,17 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
>  		*index = ch;
>  		return "Headphone";
>  	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) {
> -			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);
> +		/* This deals with the case where one HP or one Speaker or
> +		 * one HP + one Speaker need to share the DAC with LO
> +		 */
> +		if (!ch) {
> +			bool hp_lo_shared = false, spk_lo_shared = false;
> +
> +			if (cfg->speaker_outs)
> +				spk_lo_shared = !path_has_mixer(codec,
> +								spec->speaker_paths[0],	ctl_type);
> +			if (cfg->hp_outs)
> +				hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
>  			if (hp_lo_shared && spk_lo_shared)
>  				return spec->vmaster_mute.hook ? "PCM" : "Master";
>  			if (hp_lo_shared)
> -- 
> 2.25.1
> 


More information about the Alsa-devel mailing list