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