Unofficial control panel and mixer software for the Audient iD series USB audio interfaces on Linux: iD4, iD14, iD14 MKII, iD22, iD24, iD44 and iD48. Audient ships no Linux software or driver for the iD range — BiD is the missing mixer: mixes and stereo cues, routing, alternate speaker switching, VU meters and the full monitor section, while audio keeps playing. Built on libusb, glfw and imgui.
BiD is a fork of MixiD by @TheOnlyJoey, which did the original reverse engineering and protocol work this builds on.
Since there is no official support by Audient for the iD interfaces on Linux, this exists as an alternative to enable the functionality not available in the default class compliant USB driver.
Unlike the original, BiD talks to the interface over its spare DFU interface rather than claiming the audio control interface, so the kernel keeps the sound card and playback carries on while the mixer is open. It also stays resident in the system tray, and the interface follows the window when you resize it.
- Devices are detected by USB id; the iD24 is the one verified on hardware. The
others carry a profile decoded from the official app — how many mixer nodes and
cues they have, whether they own alternate speakers or an optical output —
and BiD hides what a model does not have. Until a model is confirmed
on hardware it is marked "protocol unverified" and nothing is written to it on
connect
- If a new device gets released, please open an Issue with your USB id and input/output counts
- The protocol is mostly figured out, just needs verification/testing
- Only the monitor section can be read back; the rest of the hardware is write-only, so BiD remembers its own state per device and pushes it on connect instead
- Linux is the target; the tray and desktop integration are Linux only
One line on any major distro (Debian/Ubuntu, Fedora, Arch, openSUSE):
curl -fsSL https://raw.githubusercontent.com/baakhoff/BiD/master/install.sh | bash
It installs the build dependencies with your package manager, builds the newest release, installs the binary with its desktop entry and icon, and writes the udev rule so BiD runs without root. Re-run it any time to update. Rather read before you pipe? Download install.sh and run it locally — it is short.
Prefer a package? Every release carries a .deb (dependencies and the
udev rule baked in) and an AppImage that runs anywhere; Arch users find a
PKGBUILD in packaging/.
- CMake, a C++ compiler and pkg-config
- libglfw3-dev (glfw-devel)
- libusb-1.0-0-dev (libusb1-devel)
- OpenGL headers (libgl-dev / mesa-libGL-devel)
- libsystemd-dev, or basu on distributions without systemd (optional, enables the system tray icon)
- git clone the repository
- mkdir Release
- cd Release
- cmake -DCMAKE_BUILD_TYPE=Release ..
- make
- Either run through sudo, or setup appropriate udev rules for your interface
- Run the BiD executable
Optionally, make install also places a desktop entry and icon, so BiD can be started from your application menu.
Installing under a prefix inside your home directory, rather than into /usr,
can leave the icon missing from the menu and the task bar: an icon theme
directory is only searched when it has an index.theme, and a fresh
~/.local/share/icons/hicolor has none. If that happens:
cp /usr/share/icons/hicolor/index.theme ~/.local/share/icons/hicolor/
gtk-update-icon-cache -f -t ~/.local/share/icons/hicolor
When the desktop provides a system tray, closing the window hides BiD there instead of quitting, so the interface stays connected and reachable. Clicking the icon shows and hides the window again, and right clicking it opens a menu with the monitor toggles (Dim, Alt, Talk, Phase, Mono) and Quit.
This needs a StatusNotifier tray, which KDE Plasma, Cinnamon, Budgie, XFCE and LXQt provide out of the box. GNOME needs an appindicator extension for it, and compositors such as Sway or Hyprland need a panel that implements a tray, for example Waybar. Without one, or when built without libsystemd/basu, BiD simply quits on close.
The iD button's ScrollControl works on Linux out of the box: the interface's knob is a USB HID device the kernel binds as a mouse, so press the iD button, hover the pointer over anything scrollable, and turn the encoder. No driver and no configuration involved — confirmed on the iD24.
Menu → Claim the system output makes the Audient the default output on every launch and every connect. On PipeWire, a card the sound server has split into invented stereo outputs (the iD14 family's "Line" and "Headphones" twins) is first moved to the Pro Audio profile — one honest multichannel output, with the default input following it — while a card already showing a single output keeps its profile, and its node names, untouched. Off by default. Turning it off changes nothing back, and when the claim cannot act — no PipeWire, no card, no such profile — the menu says which it was.
The reassertion is the point: the desktop's output menu offers every profile of every card as a clickable entry, so one misclick can flip the card back and the choice would otherwise quietly stick.
By default the USB device node is root-only, so BiD needs a udev rule to run without root. The installer writes it for you; by hand it is:
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2708", MODE="0660", GROUP="audio", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/70-audient.rules
The number matters: uaccess grants the logged-in user access through the
seat ACL, and udev applies those ACLs at rule 73 — a later file (like the
old 84-audient.rules) tags too late and grants nothing unless you happen
to be in the audio group, which stock Ubuntu users are not.
Then either reboot or reload the rules for the running system.
udevadm control --reload-rules && udevadm trigger --attr-match=idVendor=2708
All done!
BiD grows by measurement, and owners of untested models are the instrument. docs/TESTING.md (по-русски: docs/TESTING.ru.md) is the whole process — the safety rules, the per-ear checks, the watcher, the beep hunts, and how to report so a finding becomes a fix. Twenty minutes and working ears have mapped entire devices.
A problem with an iD interface on Linux lives in one of three layers: the hardware and its cabling, the kernel/PipeWire audio stack, or BiD itself. Chasing a symptom through the wrong layer eats evenings — a stereo imbalance was once pursued here through every software layer before turning out to be a badly seated speaker cable.
| Symptom | Layer | Fix |
|---|---|---|
| One side quieter at any volume below 100% (iD14 MkII) | Firmware + PipeWire | The firmware ignores volume writes on the left half of Speaker Playback Volume, so hardware volume moves tilt the image right. Keep PipeWire off the hardware volume (rule below) and let BiD or the knob own the level. Documented in Audientid14-linux-fix |
| Only surround profiles offered for a stereo interface | Kernel + PipeWire | The USB descriptors declare no channel positions, so a surround layout gets invented. Choose the Pro Audio profile, which exposes the raw channels without guessing |
| Mixer stops responding after suspend or a replug | BiD | Fixed in 0.2.1: BiD notices the stale device, shows an amber reconnecting dot and comes back on its own. On older builds, Disconnect and Connect again |
| ALSA mixer sliders look wrong or do nothing | Kernel | Most of the device is write-only and its ALSA controls are misleading by design; see docs/PROTOCOL.md. Use BiD for the mixer, ALSA/PipeWire for the streams |
| Connect hangs forever as a normal user | udev | The rule's uaccess tag only works from files numbered below 73. Re-run the installer (it replaces the old 84- file with 70-audient.rules), replug the interface, retry |
| Connected, but no control responds (models other than the iD24) | Firmware | Some models refuse control traffic on the spare interface. Force the old exclusive mode with BID_CONTROL_IFACE=0 BiD — audio pauses while connected — and please report your model in an issue |
| One side quiet everywhere, all software checked | Cables | Reseat or swap the speaker cables first. It happened here |
To keep PipeWire away from the hardware volume (the iD14 MkII fix; harmless
on the other models), drop a WirePlumber rule into
~/.config/wireplumber/wireplumber.conf.d/50-audient-soft-mixer.conf:
monitor.alsa.rules = [
{
matches = [ { node.name = "~alsa_output.usb-Audient.*" } ]
actions = { update-props = { api.alsa.soft-mixer = true } }
}
]
then restart it with systemctl --user restart wireplumber. Desktop volume
becomes a software gain, and the hardware level belongs to BiD and the
physical knob alone.
When a front-panel control seems to land nowhere in BiD — a knob the app
does not follow, a button with no effect — close BiD (tray included) and
run BiD --watch-monitor: it reads the monitor section a few times a
second and prints whichever selector moved, stamped with seconds since
start. Turn the control, paste the output into an issue, and the selector
names itself. It only reads, so it is safe to run on any model.
A practical companion for all of this is PavuControl (pavucontrol): it
shows every device PipeWire offers, switches profiles (that is where
Pro Audio lives), and picks the default output. Most usefully, its
Configuration tab can turn a device Off entirely — disabling the HDMI
outputs and webcam mics you never listen to prevents a whole class of
sound problems, from apps waking up on the wrong device to defaults
jumping after a replug, and leaves WirePlumber far less to juggle.
- @baakhoff — BiD
- @TheOnlyJoey — MixiD, which BiD is forked from
- 0.3.0
- The alt speakers get their trim: right-click ALT sets it in dB, a level-match offset riding the volume while ALT holds — the second pair balanced against the mains, the knob live on both sets
- The loopback row sits this version out. Its routing writes latch but no capture channel ever carries the signal, and its enable answered to nothing reachable from Linux — the full hunt is in docs/PROTOCOL.md. It returns in 0.4.0 once the official app's traffic shows the write that wakes it
- The iD24's ear-mapped layout now annotates the whole family: the iD14 table's single cue codes are the mono sums, its true stereo pairs are predicted two families down (docs/TESTING.md carries the ear test that confirms them), and the iD48, speaking the iD24's formula, inherits every correction as predictions awaiting an owner
- A tester's handbook, in English and Russian (docs/TESTING.md): the safety rules, the per-ear checks, the watcher, the beep hunts, and how to report so a finding becomes a fix
- Cue A on the iD24 is stereo at last. The codes BiD wrote as its pair turned out to be the mono sums of cue A and cue B — one ear played each — and the true pair, 0x1e/0x1f, had spent years mislabelled as Alt. Found by ear, one beep per candidate code, verified left/right on the speakers and the phones alike; the whole hunt and the corrected code table are in docs/PROTOCOL.md. The same hunt, with the monitors plugged into the alt jacks and — the detail that hid it all night — the knob verifiably up, then found Alt's real pair too: 0x27/0x28, silent until the ALT button, then the monitor mix at the knob's level while the mains mute. Real A/B speaker switching, plus two raw fixed-level taps of the main bus documented along the way
- The iD14 family gets its second cue back and, on the MKII, the shared encoder's SPEAKERS/PHONES buttons under the knob, like the official console. The headphone level is read from the device on connect instead of guessed — pushing a stored level into an unseen control was how headphones went silent with nothing on screen to explain it
- MixiD's original routing table returns for the iD14 family — it was written on one — and an iD14 MKII owner confirmed it on hardware (#26): audio followed the matrix through every assignment, so the MKII is marked verified and its routing is pushed on connect
- The same tester settled what the volume knob governs: on the MKII it acts on the main-mix path, and cue-fed outputs play at fixed level by the hardware's own design — recorded in docs/PROTOCOL.md
- Faders speak dB, with the scale printed on both flanks, and the meter moved inside the fader slot as a bead ladder showing the channel's input
- Every device gets a default desk: Set as default keeps the desk as it is now (or any preset), Restore default brings it back — levels, pans, names, routing — and pushes it to the box. Renames hit the disk the moment they are committed
- Switching the sample rate with BiD open no longer risks wedging the device: BiD watches the momentary rate by file reads alone and goes silent on the wire for a few seconds around any change (#26, and reproduced on the iD24)
BiD --watch-monitorprints which monitor selector moves as a front-panel control is turned — the tool for mapping controls that BiD does not follow yet- Menu → Claim the system output makes the Audient the default output on every launch and connect; see Usage
- 0.2.3
- The udev rule moves to
70-audient.rules, where itsuaccesstag is honoured — udev applies seat ACLs at 73, so the old84-file granted nothing on stock Ubuntu and Connect hung forever as a normal user. The installer replaces the old file BID_CONTROL_IFACEforces the control interface:=0is the old exclusive mode that pauses audio, for models whose firmware refuses control on the spare interface (reported on the iD14 MKII in #26)- Every model carries its own profile now: mixer nodes, DAW returns, how many cues, whether it has alternate speakers, an optical output or a loopback. Controls a model lacks are hidden or greyed instead of being offered, the matrix spacing follows the model's bus count, and a model whose protocol is not hardware-verified gets nothing written on connect — an iD14 MKII was silenced by writes meant for an iD24 (#26)
- BiD can start itself: "Start at login" in the menu writes an XDG
autostart entry pointing at the very binary you are running, opening
BiD hidden in the tray (
--tray); "Connect on launch" opens the device by itself, retrying quietly until it appears — login often beats the USB bus. Both sit in the menu as checkmarks - The rate readout no longer decays to
--between streams: with nothing playing it shows the rate the graph is set to run at next, asked of PipeWire itself
- The udev rule moves to
- 0.2.2
- One line installs it on any major distro: the installer picks apt, dnf, pacman or zypper, pulls the dependencies, builds the newest release, installs the desktop entry and writes the udev rule
- The GLEW build requirement is gone — nothing ever used it
- Packages: a Debian package with the udev rule and dependencies baked
in (
cpack -G DEB), an AppImage built with linuxdeploy, and a PKGBUILD for Arch underpackaging/
- 0.2.1
- Routing rewritten with the iD24's real source codes (decoded by Monix from the official app). The old table predated this device and could leave outputs stuck at full level on a source no fader controls
- The routing window now works per output pair, starts from sane defaults, explains what the sources mean, and can reset to defaults
- Routing is pushed to the device on connect like the rest of the state, which also recovers a device left mis-routed by older builds
- The faders edit any of the hardware's three mixes — Main, Cue A, Cue B — switched with tabs above the strips. Each mix keeps its own levels and pans, all pushed on connect
- Phones default to Cue A. The main-mix source turned out to be the monitor section's own feed, so Dim and Cut used to land in the headphones as well; on a cue the phones answer only to the Phones dial
- The DAW return pair sits pinned on the left as L Out / R Out, and no longer scrolls away with the input strips
- The two cue routing codes were crossed with the cue mixes: editing one cue changed outputs routed to the other. Caught by ear and swapped
- L Out and R Out move as one while their Link button is lit — levels, mute and solo; pan stays per side to keep the stereo image. Unlink to trim a side; relinking snaps the right side back onto the left in every mix, not just the one on screen
- The mixer remembers itself: all three mixes, pans, phase, routing, the
link and the dials are saved per device under
~/.config/bidon quit — including a logout or shutdown killing the tray — and restored on the next start, then pushed to the hardware on connect - Cue A's routing pair is
0x23/0x24, not0x22/0x23: the code block has a gap, and an output sent to0x22plays a stuck full-level feed — which had the phones' left ear ignoring every fader on Cue A - Matrix rows without a fader (the iD24's DAW returns 3..6) are silenced on connect, so the hardware's boot-time cue contents cannot bleed in
- The Cut button joined the monitor row and the tray menu, synced with the front panel like the rest
- VU meters: every strip carries a segmented LED ladder with a peak-hold line, fed 30 times a second by the mixer's block metering — probed once on connect like the rest of the readback
- A new look: charcoal console theme with one warm amber accent running through faders, knobs, tabs and lit buttons; card-style strips; the output pair boxed as one panel
- The surface rebuilt the way console software lays it out. Strips read top to bottom: name, type-coloured chip, phase pill, a real fader — slot, cap and tick marks — with its meter, then a pan pot that double-clicks back to centre. The master panel leads with the device name and a status dot, then the monitor knob as the hero, phones under it, and the uppercase toggle grid at the bottom
- Mute and Solo pills on every strip, and a master fader per mix at the right edge scaling everything that mix sends. Neither exists in the hardware, so both are baked into what reaches the matrix — and both are remembered in the state file
- Faders tooltip their level while dragging and double-click to unity; the Driver Select and Routing windows fix themselves at content size
- Every abbreviated button explains itself on a hover pause, and button labels are centred on the pixels they actually ink — the typeface rides low in its line box, which made small buttons read as off-centre
- A device that stops answering — a suspend staling the USB handle, or a pulled cable — turns into a clean offline and a quiet retry every two seconds; when the interface returns, BiD reconnects and pushes the whole mixer back on its own. The status dot burns amber while it hunts
- Input strips link in twos as well — MIC 1+2, and the digital inputs pair by pair — each with its own LINK bar remembered in the state file, following the same rules as the output pair
- The sample rate the kernel negotiated shows under the connection status, read from ALSA's procfs rather than asked of the device
- Any pair — inputs or the outputs — can be summed to mono from the MONO half of its pair bar: both sides hear both channels, the pan pots rest while it is lit, and the choice is remembered
- The sample rate readout is a button: it pins the graph to any rate the card offers, through PipeWire, or hands the choice back to the applications
- The loopback pair joined the routing window: whatever source it plays — a cue, the main mix, or playback channels 11+12 looped straight back — arrives in the computer as inputs 11+12, ready to record or stream
- The clock has a face: its source — Internal or Optical — sits under the rate as a picker with a signal light, driven through ALSA; and with no stream running the rate is asked of the device itself
- The optical ports switch between ADAT and S/PDIF from the routing window; the device remembers the modes itself, so they are read on connect and only written when flipped
- The monitor section filled out behind right clicks: TALK picks what it talks with (Mic 1, Mic 2 or Digi 1), MONO picks centre, left-only or right-only and says so on its face, and DIM and ALT carry sliders for how far Dim drops and the alternate speakers' trim — all read from the device on connect, hidden when it does not answer
- The strips can be named for what they carry: double click a name, type, Enter. Emptying it brings the stock label back, and the names live in the state file with everything else
- Named presets: the whole desk — mixes, routing, links, names — saved under a name from the Presets menu, recalled with one click and pushed to the hardware on the spot, deleted from the same menu
- 0.2.0
- Control goes through the spare DFU interface, so audio keeps playing while connected
- System tray icon with close-to-tray and a menu carrying the monitor toggles
- Desktop entry and icon, installed by
make install - The interface now follows the window size instead of the size it started at
- Per channel pan, so a channel can be placed in the stereo image instead of being summed to the centre. Digital inputs start panned apart as pairs
- Digital input faders now address their own matrix cells; they were writing over the mic channels
- Headphone volume goes to the right entity
- Protocol notes in docs/PROTOCOL.md
- 0.1.6
- All known iD usb-id's are now known and implemented
- 0.1.4
- Now probes usb devices based on the supported id list and selects if possible
- Auto disconnects and re-attach to kernel when quitting the application
- Now should properly set all faders depending on the individual device inputs
- Small UI Fixes
- 0.1
- Initial Release based around the iD14 and iD14 MKII with most essential features implemented.
This project is licensed under the MIT License - see the LICENSE.md file for details
