ALSA: usb-audio: add mixer support for Focusrite Forte

Add mixer control support for the Focusrite Forte (USB ID 0x1235:0x8010),
an older USB audio interface that predates the Scarlett 2nd generation.

The Forte uses UAC2_CS_MEM (bRequest=0x03) for its input controls rather
than the standard UAC2_CS_CUR (0x01) used by Scarlett devices. This patch
adds Forte-specific control handlers that use the correct USB protocol.

Features implemented:
- Input source selection (Mic/Line/Inst) for both channels
- High pass filter switch
- 48V phantom power switch
- Phase invert switch
- Pad switch
- Preamp gain control (0-42 range, ~0-75dB)
- Matrix mixer controls (6 inputs x 4 outputs)
- Output volume and mute controls

The device is registered via mixer_quirks.c and uses the existing
mixer_scarlett.c infrastructure with Forte-specific additions.

Credit: This work builds on prior reverse-engineering by alastair-dm.

Link: https://github.com/alastair-dm/forte-mixer/wiki
Link: https://github.com/alastair-dm/forte-mixer
Link: https://github.com/jopdorp/forte-mixer
Signed-off-by: Jegor van Opdorp <jegorvanopdorp@gmail.com>
Link: https://patch.msgid.link/20260127081541.219669-1-jegorvanopdorp@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Jegor van Opdorp authored and Takashi Iwai committed 2026-01-27 09:58:50 +01:00
1 parent f2581ea2d9
commit 7bb0dbf9fc
3 files changed
+461 -19

No files matched your search

+3
View File
@@ -4417,6 +4417,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
err = snd_create_std_mono_table(mixer, ebox44_table);
break;
case USB_ID(0x1235, 0x8010): /* Focusrite Forte */
err = snd_forte_controls_create(mixer);
break;
case USB_ID(0x1235, 0x8012): /* Focusrite Scarlett 6i6 */
case USB_ID(0x1235, 0x8002): /* Focusrite Scarlett 8i6 */
case USB_ID(0x1235, 0x8004): /* Focusrite Scarlett 18i6 */
File diff suppressed because it is too large. Load diff
+1
View File
@@ -3,5 +3,6 @@
#define __USB_MIXER_SCARLETT_H
int snd_scarlett_controls_create(struct usb_mixer_interface *mixer);
int snd_forte_controls_create(struct usb_mixer_interface *mixer);
#endif /* __USB_MIXER_SCARLETT_H */