diff mbox series

ALSA: usb-audio: Fix regression with Dell Dock jack detection

Message ID 20221102113404.11291-1-tiwai@suse.de (mailing list archive)
State New, archived
Headers show
Series ALSA: usb-audio: Fix regression with Dell Dock jack detection | expand

Commit Message

Takashi Iwai Nov. 2, 2022, 11:34 a.m. UTC
The recent commit added Jack controls to Dell Dock, but it added with
iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
with the changes in user-space UCM profile, which expects iface =
SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
non-working profile, and the Dell Dock is gone on pipewire /
PulseAudio after the kernel update.

Fix the regression by adjusting the iface of the new ctl elements to
*_MIXER.

Fixes: 4b8ea38fabab ("ALSA: usb-audio: Support jack detection on Dell dock")
Cc: <stable@vger.kernel.org>
Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1204719
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/usb/mixer_quirks.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jaroslav Kysela Nov. 2, 2022, 11:53 a.m. UTC | #1
On 02. 11. 22 12:34, Takashi Iwai wrote:
> The recent commit added Jack controls to Dell Dock, but it added with
> iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
> with the changes in user-space UCM profile, which expects iface =
> SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
> non-working profile, and the Dell Dock is gone on pipewire /
> PulseAudio after the kernel update.
> 
> Fix the regression by adjusting the iface of the new ctl elements to
> *_MIXER.

Hi Takashi,

UCM expects SNDRV_CTL_ELEM_IFACE_CARD for jacks by default. Which change do 
you refer? I would drop this patch.

					Thanks,
						Jaroslav
Takashi Iwai Nov. 2, 2022, 11:59 a.m. UTC | #2
On Wed, 02 Nov 2022 12:53:48 +0100,
Jaroslav Kysela wrote:
> 
> On 02. 11. 22 12:34, Takashi Iwai wrote:
> > The recent commit added Jack controls to Dell Dock, but it added with
> > iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
> > with the changes in user-space UCM profile, which expects iface =
> > SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
> > non-working profile, and the Dell Dock is gone on pipewire /
> > PulseAudio after the kernel update.
> > 
> > Fix the regression by adjusting the iface of the new ctl elements to
> > *_MIXER.
> 
> Hi Takashi,
> 
> UCM expects SNDRV_CTL_ELEM_IFACE_CARD for jacks by default. Which
> change do you refer? I would drop this patch.

It's about ucm2/USB-Audio/Dell/WD15-Dock-HiFi.conf, the JackControl
entries.  For example,
		JackControl "Headphone Jack"
expects the mixer element.  The bad thing is that the complete card
entry disappears because of inconsistency.
If you modify the entry as
		JackControl "name='Headphone Jack',iface=CARD"
it would work.  But the fact that other JackControl stuff works, it's
better to align the USB-audio with IFACE_MIXER, I guess.


Takashi
Takashi Iwai Nov. 2, 2022, 12:05 p.m. UTC | #3
On Wed, 02 Nov 2022 12:59:49 +0100,
Takashi Iwai wrote:
> 
> On Wed, 02 Nov 2022 12:53:48 +0100,
> Jaroslav Kysela wrote:
> > 
> > On 02. 11. 22 12:34, Takashi Iwai wrote:
> > > The recent commit added Jack controls to Dell Dock, but it added with
> > > iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
> > > with the changes in user-space UCM profile, which expects iface =
> > > SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
> > > non-working profile, and the Dell Dock is gone on pipewire /
> > > PulseAudio after the kernel update.
> > > 
> > > Fix the regression by adjusting the iface of the new ctl elements to
> > > *_MIXER.
> > 
> > Hi Takashi,
> > 
> > UCM expects SNDRV_CTL_ELEM_IFACE_CARD for jacks by default. Which
> > change do you refer? I would drop this patch.
> 
> It's about ucm2/USB-Audio/Dell/WD15-Dock-HiFi.conf, the JackControl
> entries.  For example,
> 		JackControl "Headphone Jack"
> expects the mixer element.  The bad thing is that the complete card
> entry disappears because of inconsistency.
> If you modify the entry as
> 		JackControl "name='Headphone Jack',iface=CARD"
> it would work.  But the fact that other JackControl stuff works, it's
> better to align the USB-audio with IFACE_MIXER, I guess.

Hm, looking at the UCM code, UCM should treat IFACE_CARD as default,
indeed.  Something went south.  Will take a deeper look.


Takashi
Jaroslav Kysela Nov. 2, 2022, 12:18 p.m. UTC | #4
On 02. 11. 22 13:05, Takashi Iwai wrote:
> On Wed, 02 Nov 2022 12:59:49 +0100,
> Takashi Iwai wrote:
>>
>> On Wed, 02 Nov 2022 12:53:48 +0100,
>> Jaroslav Kysela wrote:
>>>
>>> On 02. 11. 22 12:34, Takashi Iwai wrote:
>>>> The recent commit added Jack controls to Dell Dock, but it added with
>>>> iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
>>>> with the changes in user-space UCM profile, which expects iface =
>>>> SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
>>>> non-working profile, and the Dell Dock is gone on pipewire /
>>>> PulseAudio after the kernel update.
>>>>
>>>> Fix the regression by adjusting the iface of the new ctl elements to
>>>> *_MIXER.
>>>
>>> Hi Takashi,
>>>
>>> UCM expects SNDRV_CTL_ELEM_IFACE_CARD for jacks by default. Which
>>> change do you refer? I would drop this patch.
>>
>> It's about ucm2/USB-Audio/Dell/WD15-Dock-HiFi.conf, the JackControl
>> entries.  For example,
>> 		JackControl "Headphone Jack"
>> expects the mixer element.  The bad thing is that the complete card
>> entry disappears because of inconsistency.
>> If you modify the entry as
>> 		JackControl "name='Headphone Jack',iface=CARD"
>> it would work.  But the fact that other JackControl stuff works, it's
>> better to align the USB-audio with IFACE_MIXER, I guess.
> 
> Hm, looking at the UCM code, UCM should treat IFACE_CARD as default,
> indeed.  Something went south.  Will take a deeper look.

Perhaps, it's this issue - 
https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/2744 . The 
configuration for the Dell's docking station has also defined all jacks. If 
only an output equipment is connected, the pipewire may set the profile as not 
available. My fix (MR1429) should work. No idea why this issue is not visible 
in PA.

 From alsa-info (from the OpenSuse bug), jack states:

	name 'Line Out Jack' 	value true
	name 'Headphone Jack' 	value false
	name 'Headset Mic Jack'	value false

				Jaroslav
Takashi Iwai Nov. 2, 2022, 12:45 p.m. UTC | #5
On Wed, 02 Nov 2022 13:18:05 +0100,
Jaroslav Kysela wrote:
> 
> On 02. 11. 22 13:05, Takashi Iwai wrote:
> > On Wed, 02 Nov 2022 12:59:49 +0100,
> > Takashi Iwai wrote:
> >> 
> >> On Wed, 02 Nov 2022 12:53:48 +0100,
> >> Jaroslav Kysela wrote:
> >>> 
> >>> On 02. 11. 22 12:34, Takashi Iwai wrote:
> >>>> The recent commit added Jack controls to Dell Dock, but it added with
> >>>> iface = SNDRV_CTL_ELEM_IFACE_CARD.  Unfortunately this doesn't match
> >>>> with the changes in user-space UCM profile, which expects iface =
> >>>> SNDRV_CTL_ELEM_IFACE_MIXER as default.  This mismatch resulted in the
> >>>> non-working profile, and the Dell Dock is gone on pipewire /
> >>>> PulseAudio after the kernel update.
> >>>> 
> >>>> Fix the regression by adjusting the iface of the new ctl elements to
> >>>> *_MIXER.
> >>> 
> >>> Hi Takashi,
> >>> 
> >>> UCM expects SNDRV_CTL_ELEM_IFACE_CARD for jacks by default. Which
> >>> change do you refer? I would drop this patch.
> >> 
> >> It's about ucm2/USB-Audio/Dell/WD15-Dock-HiFi.conf, the JackControl
> >> entries.  For example,
> >> 		JackControl "Headphone Jack"
> >> expects the mixer element.  The bad thing is that the complete card
> >> entry disappears because of inconsistency.
> >> If you modify the entry as
> >> 		JackControl "name='Headphone Jack',iface=CARD"
> >> it would work.  But the fact that other JackControl stuff works, it's
> >> better to align the USB-audio with IFACE_MIXER, I guess.
> > 
> > Hm, looking at the UCM code, UCM should treat IFACE_CARD as default,
> > indeed.  Something went south.  Will take a deeper look.
> 
> Perhaps, it's this issue -
> https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/2744 . The
> configuration for the Dell's docking station has also defined all
> jacks. If only an output equipment is connected, the pipewire may set
> the profile as not available. My fix (MR1429) should work. No idea why
> this issue is not visible in PA.

Yeah, I guess you're right, it's an issue in pipewire.  Let's scratch
my previous patch.

My bogus fix in the kernel looked as if working just because it made
the jack unmatching (again), hence it skips the bug of pipewire.


BTW, while looking at this bug, I noticed another bug in alsa-lib
src/ucm/main.c.  The check in snd_use_case_parse_ctl_elem_id() should
be rather to the value, not the identifier:

--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -2793,7 +2793,7 @@ int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
 	    strcmp(ucm_id, "CaptureSwitch"))
 		return -EINVAL;
 	snd_ctl_elem_id_clear(dst);
-	if (strcasestr(ucm_id, "name="))
+	if (strcasestr(value, "name="))
 		return __snd_ctl_ascii_elem_id_parse(dst, value, NULL);
 	iface = SND_CTL_ELEM_IFACE_MIXER;
 	if (jack_control)



Takashi
Jaroslav Kysela Nov. 2, 2022, 2:05 p.m. UTC | #6
On 02. 11. 22 13:45, Takashi Iwai wrote:

> BTW, while looking at this bug, I noticed another bug in alsa-lib
> src/ucm/main.c.  The check in snd_use_case_parse_ctl_elem_id() should
> be rather to the value, not the identifier:
> 
> --- a/src/ucm/main.c
> +++ b/src/ucm/main.c
> @@ -2793,7 +2793,7 @@ int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
>   	    strcmp(ucm_id, "CaptureSwitch"))
>   		return -EINVAL;
>   	snd_ctl_elem_id_clear(dst);
> -	if (strcasestr(ucm_id, "name="))
> +	if (strcasestr(value, "name="))
>   		return __snd_ctl_ascii_elem_id_parse(dst, value, NULL);
>   	iface = SND_CTL_ELEM_IFACE_MIXER;
>   	if (jack_control)

Oops. Thanks, it looks like an obvious thinko. Fixed right now.

					Jaroslav
diff mbox series

Patch

diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index ab0d459f4271..3039a17259ab 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -2042,7 +2042,7 @@  static int realtek_ctl_connector_get(struct snd_kcontrol *kcontrol,
 }
 
 static const struct snd_kcontrol_new realtek_connector_ctl_ro = {
-	.iface = SNDRV_CTL_ELEM_IFACE_CARD,
+	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name = "", /* will be filled later manually */
 	.access = SNDRV_CTL_ELEM_ACCESS_READ,
 	.info = snd_ctl_boolean_mono_info,