Re: [PATCH] USB Audio Class 2 Mixer unit support for GET_CUR, SET_CUR and RANGE

From: Zipdox

Date: Fri Sep 18 2026 - 04:37:14 EST



On 9/17/26 6:40 PM, Takashi Iwai wrote:
Another thing on my mind is the following section from section
5.2.5.5.1 from the spec:
A Mixer Unit consists of a number of Mixer Controls, either programmable or fixed. A Mixer Control must
support the CUR and RANGE(MIN, MAX, RES) attributes. The settings for the CUR, MIN, and MAX
attributes can range from +127.9961 dB (0x7FFF) down to -127.9961 dB (0x8001) in steps of 1/256 dB or
0.00390625 dB (0x0001). The settings for the RES attribute can only have positive values and range from
1/256 dB (0x0001) to +127.9961 dB (0x7FFF).
In addition, code 0x8000, representing silence (i.e., -∞ dB), must always be implemented. However, it must
never be reported as the MIN attribute value.

Is this presently handled? For reference, 0x8000 is -32768. When I use
qasmixer or alsamixer, for example, it only goes down to -32767. This
is the same in UAC1 by the way. Should we add a mute control to mixer
nodes? Or perhaps extend the reported range downward by one, and
overwrite the lowest value to -32768 when writing to a mixer unit. The
latter is my preferred solution.

I guess it's not; there is cval->min_mute flag, but it's for another
case (the minimal volume = mute) for the statically mapped mixer
elements, and not for this mixer unit case.

Maybe they should be implemented by additional mute switches.

Overall, the mixer unit controls have been rarely used by the devices,
so far, and that's the reason we didn't hit this over years :)


Takashi


From a UX perspective, I would prefer if the lowest setting on the control equals mute. This makes the most sense for a "mixer". Like I mentioned before, extending the range down by 1 and making that translate to -32768 seems like a convenient solution. When setting, simply check if it's a mixer unit (UAC1 or UAC2, both do this) and if the set value is equal to the minimum, and set the value to -32768. For getting, check if it's a mixer unit and check if the retrieved value is -32768, and then set the value to the minimum. The only caveat is that the resolution might not align anymore with the range. What do you think of this idea?