A Linux ALSA driver for the RME Babyface Pro FS, running in its proprietary USB mode.
VID:PID 2a39:3fc0 · reverse-engineered from Windows captures · validated on real hardware
Hardware-validated · checkpatch / sparse / W=1 clean · 41/41 regression suite · 0.67 ms clean latency floor (0.33 ms monitoring)
A from-scratch kernel driver that brings the full channel count and the hardware DSP mixer of the Babyface Pro FS to Linux — in its proprietary USB mode, which a stock snd-usb-audio cannot touch. Modeled on snd-usb-caiaq, the in-tree precedent for interrupt-based USB audio.
The proprietary mode runs the PCM stream on interrupt endpoints (interface 5) and exposes the TotalMix-class control surface as a normal ALSA mixer, reaching a 0.67 ms clean streaming floor (32-frame URBs @ 48 kHz) and a 0.33 ms monitoring-grade floor (16-frame URBs @ 48 kHz).
Related project: the companion user-space mixer app lives in the sibling repo TuxMix (control stack + GUI/TUI).
The card works like any other ALSA / PipeWire device once loaded.
# DKMS (recommended — survives kernel upgrades). Arch/CachyOS:
cd aur/snd-usb-babyface-pro-dkms && makepkg -si
# ...or any distro with dkms installed (dkms.conf ships in tools/kernel/):
sudo cp -r tools/kernel /usr/src/snd-usb-babyface-pro-0.1.0
sudo dkms add -m snd-usb-babyface-pro -v 0.1.0
sudo dkms install -m snd-usb-babyface-pro -v 0.1.0
sudo modprobe snd-usb-babyface-proThen the mixer is the normal ALSA control set: amixer -c <n> controls.
Low-latency profiles — off by default. The driver ships the TotalMix-parity 256 samples (≈5.3 ms) so a fresh install is stable everywhere. Measured at 48 kHz, full-duplex:
frames_per_urbnurbsperiod result 256 (default) 8 5.3 ms 100 % stable 32 8 0.67 ms clean in the regression sweeps — see the note below 16 16 0.33 ms playback rock-solid, but capture drops ~1 sample / 7 s 32/8 has one open issue: once, the unit stopped exchanging audio altogether (it still answered control requests) and only came back after being unplugged — a module reload, a USB re-enumeration and a host reboot did not help. Once, a single 192 kHz session came up silent and the next one was fine. Neither has been reproduced since, and neither has been seen at the default 256. Use 32/8 if you want the latency and can live with that; if the card goes silent, unplug and replug it. The 0.33 ms floor (16/16) is asymmetric, solid for playback but lossy for recording. The DKMS package installs a commented template at
/usr/lib/modprobe.d/snd-usb-babyface-pro.conf; uncomment a line there (or override in/etc/modprobe.d/) and reload the module. Latency is quantised to the URB boundary, so it does not depend on the period size your DAW asks for. Full build / load / test walkthrough (manual build, hardware checks, front-panel probes) →LINUX-TEST.md
Hardware-validated on a real Babyface Pro FS, and reported to run unmodified on an original (non-FS) Babyface Pro:
- Streaming — 32–192 kHz, 2–12 channels, interrupt-URB, full-duplex; 32-frame URBs (0.67 ms @ 48 kHz) run clean across the sweep (one open issue, see above), 16-frame URBs (0.33 ms, monitoring-grade) are playback-solid but drop the occasional capture buffer.
- Mixer (ALSA controls) — 6 output masters + mutes, the full 6×14 crosspoint matrix, 4 preamp gains, phantom power + PAD, pitch/varispeed, loopback, width, FX send, MS processing, input link, AN 1>2, plus clock source, ref level, phase and trim.
- Front panel (the host is "in the loop", like TotalMix) — every button, the wheel and the IN/OUT/MIX selection are decoded and exposed as read-only controls; the driver acts on SET (phantom), the wheel and MIX-mode, including the VU display. DIM presses are reported through
DIM Button Press Countfor a mixer application to act on; theDim Switchcontrol still applies the fixed Phones dim. - PM — suspend/resume with full mixer-state restore.
- Automated checks —
regress.shpasses 41/41 on hardware;selftests.shruns laws, build and checkpatch without the card.
The protocol was decoded from Windows USB captures and verified bit-by-bit on hardware. The full reference, the calibrated laws and the engineering history live in the docs below.
Everything lives in dedicated files; this README only links to them.
| If you want to… | Go to |
|---|---|
| Build, load & test the driver on real hardware | LINUX-TEST.md |
| Understand the driver architecture & current gaps | KERNEL-DRIVER.md |
| See the hardware validation log (what was verified, and when) | LINUX-VALIDATION.md |
| Read the protocol reference (register maps, requests, stream layout) | tools/usbdump/PROTOCOL.md |
| Read the calibrated laws (fader/master curves, gains, EQ) | tools/usbdump/CALIBRATION.md |
| Follow the upstream submission (RFC series, review prep) | tools/kernel/UPSTREAM.md · patches/COVER-LETTER.md |
| Dive into the RE tooling (USBPcap capture analysis) | tools/usbdump/README.md |
Optional reading — review & reverse-engineering notes
- External AI review of the driver & how each finding was resolved:
docs/REVIEW-FINDINGS.md - Draft reply to the maintainer's v2 review:
docs/REPLY-TO-TAKASHI-V2.md - Original Windows capture plan (RE background):
tools/usbdump/WINDOWS-CAPTURE-PLAN.md
The device presents two USB personalities:
- a class-compliant one, handled by the stock
snd-usb-audio, and - the proprietary one (
2a39:3fc0) whose PCM stream runs on interrupt endpoints and whose mixer is a vendor-control surface.
The proprietary mode is the interesting one — full channel count + hardware DSP mixer at the lowest latency — and the only reverse-engineered implementation of it on Linux. The rest of the ecosystem stays on the more limited class-compliant surface (oscmix, rme-control-cli).
GPL-2.0-only (kernel driver).