Re: [PATCH] ALSA: usb-audio: Fix Logitech PRO X Wireless volume control

Rong Zhang <[email protected]>
Newsgroups org.kernel.vger.linux-sound,dev.linux.lists.regressions
Message-ID <[email protected]>
Hi Alexander,

On Fri, 2026-08-14 at 14:35 +0200, Alexander Niemeyer wrote:
>   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;
> +        }
> +

Adding a device-specific quirk here made me uncomfortable. If my proposed
improvement to the sticky check works for you (after me finishing it and
you testing it), it'd better adding the quirk to volume_control_quirks().

Thanks,
Rong

>           if (cval->min < cval->max) {
>               int saved;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.