Linux Documentation
 help / color / mirror / Atom feed
* [PATCH v4 0/3] ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN
@ 2026-05-31 15:45 Rong Zhang
  2026-05-31 15:45 ` [PATCH v4 1/3] " Rong Zhang
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Rong Zhang @ 2026-05-31 15:45 UTC (permalink / raw)
  To: Jaroslav Kysela, Takashi Iwai, Jonathan Corbet, Shuah Khan
  Cc: Takashi Iwai, Steve Smith, linux-sound, linux-doc, linux-kernel,
	Rong Zhang

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.

An info message prompting users to check MIXER_GET_CUR_BROKEN for
potential sticky mixers is also added, so that users can learn how to do
some experiments to determine what's going on. If the mixer surprisingly
turns out to be non-sticky, they can submit a patch for a new quirk
table entry.

The Sennheiser MOMENTUM 3 and Edifier MF200 need the quirk flag. Though
their UAC mixers respond to SET_CUR by tuning the volume, the
corresponding GET_CUR methods are somehow stubbed and return constant
values, resulting in them being disabled by the sticky check.

Signed-off-by: Rong Zhang <i@rong.moe>
---
Changes in v4:
- Rebase since a patch improving the error path of the sticky check has
  been applied earlier
  - https://patch.msgid.link/20260531-uac-sticky-error-path-v1-1-12c2329d17ef@rong.moe
- Integrate a follow-up series into this one
  - https://patch.msgid.link/20260531-uac-edifier-mf200-v1-0-be69657c3f87@rong.moe
- Link to v3: https://patch.msgid.link/20260529-uac-quirk-get-cur-vol-v3-0-bde363188ca4@rong.moe

Changes in v3:
- Make the log less noisy (thanks Takashi Iwai)
- Do not propagate mixer values written by sanity checks when GET_CUR is
  broken, nor restore the garbage backed-up value. Instead, rely on
  init_cur_mix_raw() to initialize the mixer properly
- Gate cache invalidation as well, so that the current volume is always
  available to userspace
- Update the comment of check_sticky_volume_control()
- Link to v2: https://patch.msgid.link/20260528-uac-quirk-get-cur-vol-v2-0-84d3c8f48150@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

---
Rong Zhang (3):
      ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN
      ALSA: usb-audio: Add quirk flag for Sennheiser MOMENTUM 3
      ALSA: usb-audio: Add quirk flag for Edifier MF200

 Documentation/sound/alsa-configuration.rst | 12 ++++++
 sound/usb/mixer.c                          | 60 +++++++++++++++++++++++++-----
 sound/usb/mixer.h                          |  1 +
 sound/usb/quirks.c                         |  5 +++
 sound/usb/usbaudio.h                       | 13 +++++++
 5 files changed, 81 insertions(+), 10 deletions(-)
---
base-commit: f52b1b0506c6a209c10a741d031944d1ed19548c
change-id: 20260527-uac-quirk-get-cur-vol-d0b292c3e796

Thanks,
Rong


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-06-05 12:06 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-31 15:45 [PATCH v4 0/3] ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN Rong Zhang
2026-05-31 15:45 ` [PATCH v4 1/3] " Rong Zhang
2026-05-31 15:45 ` [PATCH v4 2/3] ALSA: usb-audio: Add quirk flag for Sennheiser MOMENTUM 3 Rong Zhang
2026-05-31 15:45 ` [PATCH v4 3/3] ALSA: usb-audio: Add quirk flag for Edifier MF200 Rong Zhang
2026-05-31 15:50 ` [PATCH v4 0/3] ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN Takashi Iwai
2026-05-31 15:52   ` Rong Zhang
2026-06-05 12:00   ` Thorsten Leemhuis
2026-06-05 12:05     ` Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox