Re: [BUG] snd-usb-audio: Audient iD14 (2708:0008) 20 dB channel imbalance
Neil Andrews <[email protected]>
| Newsgroups | gmane.linux.sound |
|---|---|
| Message-ID | <0102019ff207ccda-7b65c5af-5c39-4218-ae8e-5ef8d55701e0-000000@eu-west-1.amazonses.com> |
On Tue, 11 Aug 2026, Takashi Iwai wrote:
> It's fine to skip the volume if it actually improves -- so please test
> it ;)
>
> Judging from your description, an alternative with keeping the volume
> control would be to just rename it; the problem is that it's tied with
> "Speaker". You can name it a different, some non-standard one,
> instead, too.
Hi Takashi,
I tested both on 7.1.6 with sound/usb rebuilt out of tree, measured with
the loopback rig from the original report. Both fix it. I would suggest
the rename.
Baseline, unpatched, PipeWire at 50% (control driven to 109/127):
18.00 dB imbalance.
1. { 12, NULL }
Control gone, userspace falls back to software volume, 0.00 dB. So it
does improve.
One wrinkle: FU 12 keeps its value across a module reload, so if the
quirk arrives while the hardware is already attenuated, the imbalance
stays and there is no longer a control with which to undo it (measured:
18.00 dB, control absent). Only a power cycle clears it, which matters
for anyone whose saved ALSA state holds a value below 0 dB.
2. { 12, "Monitor Mix Playback" }
--- a/sound/usb/mixer_maps.c
+++ b/sound/usb/mixer_maps.c
@@ -495,6 +495,19 @@
{}
};
+/* Audient iD14: FU 12 advertises Volume on only 4 of its 6 logical channels
+ * and sits on the monitor-mixer branch, but it is traced through to the
+ * Speaker output terminal and gets named "Speaker Playback Volume". Userspace
+ * then adopts it as the stream's hardware volume, and any setting below 0 dB
+ * attenuates some channels but not others (20 dB imbalance at 80%). Give it a
+ * non-standard name so that it is no longer taken for the stream's master
+ * volume, while remaining reachable for anyone who wants the monitor gain.
+ */
+static const struct usbmix_name_map audient_id14_map[] = {
+ { 12, "Monitor Mix Playback" }, /* FU, partial coverage */
+ {}
+};
+
/*
* Control map entries
*/
@@ -579,6 +592,11 @@
.map = maya44_map,
},
{
+ /* Audient iD14 */
+ .id = USB_ID(0x2708, 0x0008),
+ .map = audient_id14_map,
+ },
+ {
/* KEF X300A */
.id = USB_ID(0x27ac, 0x1000),
.map = scms_usb3318_map,
Gives numid=11,name='Monitor Mix Playback Volume'. PipeWire no longer
picks it up (control stays at 127, 0.00 dB), and it still works when set
deliberately, so an attenuated device can be recovered: 107 by hand
gives 20.00 dB, back to 127 gives 0.00 dB. The name ends in "Playback"
because a mapped name suppresses the automatic " Playback" but still
gets " Volume" appended.
3. A qualification to my report
I said userspace adopts the control as the card's hardware playback
volume, without qualifying it. That is too broad.
alsa-ucm-conf 1.2.16.1 ships
USB-Audio/Audient/Audient-iD14-HiFi-0008.conf, which splits the device
into 2-channel sinks and declares no playback mixer element. With it in
use PipeWire never touches FU 12: the control stays at 127 at every
volume setting, on both split sinks and on the underlying node.
Reproducing needs the ACP path instead, which I got by setting
api.alsa.use-ucm = false for the device in WirePlumber (then 100% ->
127, 80% -> 122, 50% -> 109). All measurements above were taken that
way.
So the affected set is narrower than I implied: the ACP path rather than
that UCM profile, plus anyone whose saved ALSA state carries a value
below 0 dB, since that is restored at boot either way. The descriptor
problem itself is unchanged.
Happy to send either version as a proper patch with a Signed-off-by, and
to test anything else on the hardware.
thanks,
Neil