Since commit 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky
mixers"), the UAC mixer core utilizes volume SET_CUR and GET_CUR to
identify devices with sticky mixers. Unfortunately, even though most
devices with sticky GET_CUR also have corresponding sticky SET_CUR,
which I actually met more since the commit had been merged, there is
also a rare case that some devices may have volume mixers that responds
to SET_CUR properly but with its GET_CUR stubbed. This cause the sticky
check to consider the mixer to be sticky and unnecessarily disable it.
As the sticky check can't distinguish between sticky mixers and working
SET_CUR but broken GET_CUR, add QUIRK_FLAG_MIXER_GET_CUR_BROKEN to tell
that the device should fall into the second category when GET_CUR
returns a constant value. In this case, the sticky check becomes
non-fatal and only disables GET_CUR instead of the whole mixer. The
current volume will then be provided by the internal cache that stores
the last set volume.
The Sennheiser MOMENTUM 3 needs the quirk flag. Though its UAC mixer
works fine and precisely corresponds to the reported dB range, the
mixer's volume GET_CUR method is somehow stubbed and returns a constant
value (15dB), resulting in it being disabled by the sticky check.
Signed-off-by: Rong Zhang <i@rong.moe>
---
Changes in v2:
- Turn the approach into a less radical one
- Rename the quirk flag to QUIRK_FLAG_MIXER_GET_CUR_BROKEN
- Add a flag `get_cur_broken' to `struct usb_mixer_elem_info'
- When the sticky check fails, check quirk flags. Gate further GET_CUR
by setting `cval->get_cur_broken' if QUIRK_FLAG_MIXER_GET_CUR_BROKEN
is set, otherwise disable the mixer as usual
- The quirk flag still applies to all mixers, but as long as a mixer
makes the sticky check happy, it won't be affected at all. Only
those mixers with constant GET_CUR values will have their GET_CUR
gated. I assume the impact is minimal, since it's very unlikely a
device would have sticky mixers (broken SET_CUR) along with mixers
with working SET_CUR but broken GET_CUR at the same time
- Link to v1: https://patch.msgid.link/20260527-uac-quirk-get-cur-vol-v1-0-e9362b712e5e@rong.moe
To: Jaroslav Kysela <perex@perex.cz>
To: Takashi Iwai <tiwai@suse.com>
To: Jonathan Corbet <corbet@lwn.net>
To: Shuah Khan <skhan@linuxfoundation.org>
Cc: linux-sound@vger.kernel.org
Cc: linux-doc@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
Rong Zhang (2):
ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN
ALSA: usb-audio: Add quirk flag for Sennheiser MOMENTUM 3
Documentation/sound/alsa-configuration.rst | 12 ++++++++++++
sound/usb/mixer.c | 17 +++++++++++++++--
sound/usb/mixer.h | 1 +
sound/usb/quirks.c | 3 +++
sound/usb/usbaudio.h | 13 +++++++++++++
5 files changed, 44 insertions(+), 2 deletions(-)
---
base-commit: 72d8bf668954678bfae8f7296b4b1c01990bcdc2
change-id: 20260527-uac-quirk-get-cur-vol-d0b292c3e796
Thanks,
Rong