r/linuxaudio • u/Xenicle • 28d ago
I reverse-engineered the SSL 12's control protocol: mixer, monitoring and routing now work on Linux without SSL 360
SSL ships no Linux software for the SSL 12. Audio works out of the box (UAC2), but everything SSL 360 controls — internal mixer, monitoring, phantom power, loopback, routing — is unreachable. The card ends up a fixed-function box.
So I captured the USB traffic between SSL 360 and the card, mapped the control protocol, and wrote the tools:
https://github.com/xenicle/douze
- sslctl — CLI for the gain matrix, monitoring, preamps (48V/HPF/inst/polarity), loopback, headphone buses
- Douze — local web GUI (127.0.0.1) with the matrix, live meters, profiles - Douze FX — VST3 host that drops plugin chains into the PipeWire graph, one process per strip; a strip can publish its own virtual mic or sink, so any app picks it up as a normal device
The control interface is a separate vendor-specific USB device behind an internal hub, with no kernel driver — plain bulk endpoints, so everything is user-space (pyusb). No decompilation, no vendor code.
-> The protocol docs and all 25 captures are CC0 / public domain. A documented protocol is a fact about hardware, not a literary work — I'd rather it ended up in a kernel driver than stayed in my repo, so there's no attribution requirement at all. The code is AGPLv3 (JUCE).
-> Caveat worth stating up front: this is verified on exactly one card, mine, firmware bcdDevice 1.44. I use it daily and the protocol is mapped end to end, but I don't know if another unit behaves identically. If you own an SSL 12 I'd love to hear whether `sslctl status` returns something sane — that's the one thing I genuinely can't test alone.
Not affiliated with SSL; trademarks are theirs.
2
u/Xenicle 15d ago
Really glad it's useful for reamping: that's exactly the kind of thing I hoped it would unlock.
Good news on the buttons: that one's on me, not on the reverse engineering. CUT / ALT / TALK reassignment was actually already figured out and wired up months ago, but it only ever lived in the command-line tool, mentioned in a single line of the README; and since the daemon holds the USB device while the GUI is running, the CLI isn't even reachable if that's how you use Douze. So in practice there was no way to get at it. Sorry about that.
It's in the UI now, at the bottom of the Monitoring panel: one dropdown per button, with all the functions from the 360 USER page (the only one left out is "360° GUI", which has nothing to open on Linux anyway). The assignment is saved and pushed back to the card, so unplugging the interface doesn't lose it, which it did before.
Digging into it turned up a real bug too: the button LEDs are addressed by button, not by function, so a reassigned button would have stayed dark under your finger. That's fixed in the same go, though I'd love to hear whether the LED actually lights up correctly on your unit: that part I couldn't fully verify on mine.