Skip to content

About

Standalone Linux ALSA driver and GTK4/HTML control panel for the Roland OCTA-CAPTURE (UA-1010), with audio, MIDI and hardware mixer controls.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Repository files navigation

octa-capture

Linux driver and control panel for the Roland OCTA-CAPTURE / UA-1010 (0582:0120). The target is native Debian. Original project code is GPL-2.0-only.

The standalone ALSA module supports all four descriptor rates and separates MIDI from CTRL. Debian users load snd-octa-capture; they do not patch their kernel. The HTML panel runs against a real C++ backend and also embeds in GTK4/WebKitGTK. It includes eight preamp/compressor strips, four mixers, routing, reverb, Auto-Sens, settings import/export, device selection and live MIDI/PCM meters. Nonlinear parameter tables and display math are checked against both original Windows and macOS binaries.

Screenshots

The Linux GTK4/WebKitGTK panel connected to an OCTA-CAPTURE on native Debian.

Preamps and compressors

OCTA-CAPTURE Linux control panel showing eight preamps and compressors

Direct Mixer

OCTA-CAPTURE Linux Direct Mixer showing input channels, playback channels and master controls

Run the panel

make release
python3 tools/serve-gui.py --open
# Development binaries: add --bin-dir build/strict

Use an account with ALSA device access. The server binds only to 127.0.0.1; open its private launch link. Token authentication, Host/Origin checks and a local-only content policy protect device operations. Audio stays in the kernel and continues when the panel closes. External synchronization permits only the current rate; unavailable clock status disables rate selection.

For the desktop window on Debian 13 (GTK 4.10 or later):

sudo apt install python3-gi python3-xlib gir1.2-gtk-4.0 gir1.2-webkit-6.0
python3 tools/desktop-gui.py

The GTK host keeps the WebKit sandbox enabled, blocks external navigation and uses native file dialogs. Right-click the panel's device name, press Shift+F10 or use Driver Settings to select a discovered unit. Serial identities survive ALSA card renumbering, with automatic same-unit reconnection.

For the experimental base/EXP pair, explicitly select both serial identities:

python3 tools/desktop-gui.py --pair-base serial:BASE_SERIAL \
  --pair-expansion serial:EXP_SERIAL --experimental-pair

The HTTP launcher accepts the same flags. The panel starts on EXP; select the base or EXP through the existing device menu. Shared rate changes from EXP use the joint backend at 44.1/48/96 kHz; base external-clock controls retain the current rate. Missing/incoherent companions disable rate changes. Both Auto-Sens states must be idle and readable. Closing the host cancels pending changes and waits for recovery. This mode has synthetic browser/HTTP/backend and native WebKit checks; physical two-unit operation remains unverified. It controls units individually; the kernel guide describes the separate combined ALSA configuration.

Build and install

For Debian 13 amd64, the combined package installs the GUI, device tools, Linux 6.12 DKMS sources, hotplug activation and the regular-user stereo-pair service. It uses the same unprivileged sbuild workflow as the local btop package; see the Debian build guide.

python3 tools/build-debian.py --jobs 2
sudo apt install ./build/debian-trixie/octa-capture_*_amd64.deb

The package configures the driver on installation and after reconnecting the device. GUI and audio services run as the desktop user. Existing settings and presets are retained. DKMS builds only the external module for matching headers. Installed commands have manual pages, including man octa-capture and man octa-capture-activate.

Userspace uses C++23, CMake/Ninja, LLVM 19, ALSA and libusb; kernel additions use C/Kbuild. Development packages include clang-19, clang-tidy-19, clang-format-19, libclang-rt-19-dev, build-essential, cmake, ninja-build, pkg-config, libusb-1.0-0-dev, libasound2-dev, alsa-utils, shellcheck, python3, nodejs, node-undici and eslint. Browser checks use chromium.

make test       # strict warnings, clang-tidy, ASan/UBSan and offline tests
make lint       # formatting and full native static analysis
make release    # optimized build and tests
cmake --install build/release --prefix "$HOME/.local"
~/.local/bin/octa-capture
# HTTP-only launcher: ~/.local/bin/octa-capture-http --open

python3 tools/check-pulse-pair.py additionally checks client/remap coordination, individual client volumes/mutes, capture silence during held playback and recovery using private PulseAudio and D-Bus processes (pulseaudio, pulseaudio-utils, dbus-daemon). It leaves the desktop server untouched. USB identity, clock I/O and ALSA card creation remain modeled; this does not verify physical paired streaming.

For an isolated development installation alongside the Debian package, use a commit-specific prefix and launch it explicitly:

octa_dev_prefix="$HOME/.local/opt/octa-capture-dev/$(git rev-parse --short HEAD)"
cmake --install build/release --prefix "$octa_dev_prefix"
"$octa_dev_prefix/bin/octa-capture"

The package's Xfce Applications → Settings entry starts the packaged installation.

Kernel and Debian/DKMS instructions cover matching headers, module activation and packages. VERSION controls CMake/CPack versions. The runtime package includes both GUI launchers, device tools and an OCTA-CAPTURE entry under Applications → Settings in Xfce. The DKMS package builds only the external module for its supported kernel series.

Experimental octa-aggregate preparation and its physical-test limits are described in the kernel guide.

For native PulseAudio, run octa-pulse-pairs --install as your regular user to enable five Playback and six Recording stereo pairs, including Recording 11-12. The user service installs device-specific ALSA dshare/dsnoop definitions and a PulseAudio stereo profile; unrelated ALSA settings remain intact. Desktop stereo audio stays on its selected pair, with no surround upmix or duplicate multichannel endpoint. Applications needing the full interleaved stream can still access ALSA directly after PulseAudio releases the device.

The GUI coordinates sample-rate changes with PulseAudio: streams are briefly paused, the card is reopened at the requested rate, then pair assignments, volumes and mute states are restored. At 192 kHz, only Playback/Recording 1-2 and 3-4 exist. Stop active streams on higher pairs before switching to 192 kHz. Native PulseAudio 17 passes application rate changes at all four rates; other ALSA clients must release their streams themselves. PipeWire integration remains unverified. Starting the helper initially may briefly interrupt device audio.

For native Debian development, first build build/driver-native/snd-octa-capture.ko against the running 6.12 kernel, then run sudo ./tools/setup-native-dev.sh. This installs development tools, grants the invoking user device access and configures the existing bounded module helper. USB monitor access is limited to the connected device's bus and must be renewed after reboot.

Verification

Native userspace builds retain strict warnings, stack and stack-clash protection, Fortify 3, libstdc++ assertions, full RELRO and a non-executable stack. CMake requires PIE support and builds executables as PIE; Linux/x86 builds also use -fcf-protection=full. Sanitizer presets add their instrumentation to this baseline. The kernel module uses only Kbuild's own hardening settings.

Hardware checkers are read-only by default unless their purpose explicitly requires streaming. --write checks change device parameters and use recovery snapshots. Power switching and persistent memory require separate attention; a runtime backup cannot undo an overwritten device-memory preset.

./build/strict/octa-state             # complete CTRL state
./build/strict/octa-status            # kernel-owned clock status
python3 tools/check-status.py --stress --binary build/strict/octa-status
python3 tools/check-bridge.py --din-isolation  # close GUI first; quiet DIN, no DIN transmission
python3 tools/check-preamps.py --write       # active channels at the current rate
./build/strict/octa-audio-check 48000 capture  # quiet, timed transfer
python3 tools/check-pcm-meters.py --rates    # quiet meter/PCM lifecycle checks
python3 tools/check-mixer-audio.py --write --rates --keep-going  # digital DSP/signal checks
python3 tools/check-mixer-audio.py --write --rates --integrity-seconds 10 --aperiodic \
  --period-size 256 --buffer-size 1024      # verify actual buffers and unique digital sample alignment
./tools/check-gui.sh                        # running-panel browser checks

Add --realtime to the digital mixer checker to request bounded RTKit SCHED_RR priority 5 for both ALSA utilities. This optional mode needs rtkit and python3-gi; it runs as the regular user. The checker records actual scheduling and rejects lost realtime policy, XRUNs and sample mismatches.

Fuzzing is separate from standard tests and runs only on explicit user request. The tools/fuzz*.sh scripts use the dedicated fuzz preset with LLVM libFuzzer and ASan/UBSan; for example, ./tools/fuzz.sh 120 runs offline protocol fuzzing for 120 seconds. They send no malformed traffic to hardware. Kernel code retains separate Kbuild/Sparse checks; host fuzzing does not replace kernel sanitizers, USB fault injection or physical lifecycle tests.

References

USB/MIDI protocol, GUI/backend, PCM meters, preset format and Windows GUI inspection describe recovered behavior, commands and evidence limits.

Official manufacturer downloads are listed in the manifest and checksums. Downloads, extracted assets and decompilation remain local references and are excluded from Git and releases. The interface ships our own assets. Manufacturer files retain their original terms; see LICENSE for project code.

About

Standalone Linux ALSA driver and GTK4/HTML control panel for the Roland OCTA-CAPTURE (UA-1010), with audio, MIDI and hardware mixer controls.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages