[PATCH] ALSA: usb-audio: Fix Logitech PRO X Wireless volume control
Alexander Niemeyer <[email protected]>
| Newsgroups | gmane.linux.sound |
|---|---|
| Message-ID | <[email protected]> |
The Logitech PRO X Wireless headset (046d:0aba) advertises a UAC1
playback volume range from -64 dB to 0 dB in 1 dB steps. The -64 dB
endpoint is not effective, and GET_CUR reflects effective SET_CUR
changes only after roughly 50 ms.
Since commit 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky
mixers"), the probe-time sticky mixer check writes the advertised
minimum or maximum value and immediately reads it back. On this device
that falsely classifies the working playback volume control as sticky
and removes it, leaving only the PCM Playback Switch control.
Clamp the unusable minimum to the next step (-63 dB) for Feature Unit 2
volume control and skip the probe-time sticky/resolution checks for this
control.
With the quirk applied, ALSA exposes PCM Playback Volume again and the
physical headset volume wheel updates ALSA and PipeWire/KDE system
volume normally.
Tested on Linux 7.1.5 with Logitech PRO X Wireless 046d:0aba.
Fixes: 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky mixers")
Cc: [email protected]
Assisted-by: ChatGPT:GPT-5.6-Sol
Signed-off-by: Alexander Niemeyer <[email protected]>
---
sound/usb/mixer.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -1299,6 +1299,21 @@ static int get_min_max_with_quirks(struct
usb_mixer_elem_info *cval,
if (cval->res == 0)
cval->res = 1;
+ /*
+ * Logitech PRO X Wireless advertises a non-functional
+ * -64 dB minimum and delays GET_CUR updates.
+ */
+ if (cval->head.mixer->chip->usb_id ==
+ USB_ID(0x046d, 0x0aba) &&
+ cval->head.id == 2 &&
+ cval->control == UAC_FU_VOLUME) {
+ usb_audio_info(cval->head.mixer->chip,
+ "Logitech PRO X Wireless: applying "
+ "playback volume quirk\n");
+ cval->min = -16128; /* -63 dB */
+ goto no_checks;
+ }
+
if (cval->min < cval->max) {
int saved;