Skip to content

About

Proprietary-mode Linux kernel driver for the RME Babyface Pro FS (ALSA)

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

snd-usb-babyface-pro

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)


What it is

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).

Get started

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-pro

Then 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_urb nurbs period 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

Status & features

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 Count for a mixer application to act on; the Dim Switch control still applies the fixed Phones dim.
  • PM — suspend/resume with full mixer-state restore.
  • Automated checks — regress.sh passes 41/41 on hardware; selftests.sh runs 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.

Documentation

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

Why a dedicated driver?

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).

License

GPL-2.0-only (kernel driver).

About

Proprietary-mode Linux kernel driver for the RME Babyface Pro FS (ALSA)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages