Audio routing for PipeWire, built around endpoints instead of around the graph.
Viola shows sound cards, virtual devices and the applications that are playing as cards. Routing means pointing one card at another. Ports, links, monitor ports and driver groups are implementation details you never have to learn.
Early. Viola currently connects to PipeWire, builds the endpoint model and renders it — it does not change any routing yet. The pieces that write to the graph land next, together with the reconciler that keeps what you asked for and what the graph actually does from drifting apart.
If you need working audio routing today, use Sonusmix or a patchbay such as qpwgraph.
- Play one source through several outputs at once
- Give an application an output of its own that survives restarts and new streams, rather than a one-off move of a single stream
- Name applications properly: an Electron app shows up as Discord, not Chromium
- Create virtual devices that other applications can select
- Join several microphones into one, or feed any audio into a virtual microphone
- React to things happening — a headset connecting, an application launching — without hand-written WirePlumber Lua
Two rules constrain all of it. Viola cooperates with WirePlumber instead of replacing it, and it never claims a route is working when it isn't.
- PipeWire 1.0 or newer, with WirePlumber as the session manager
- GTK 4.16, libadwaita 1.6
With Nix, the development shell has everything:
nix develop
meson setup build
meson compile -C build
meson test -C build
Otherwise install the dependencies yourself: a Rust toolchain, meson, ninja,
blueprint-compiler, and the development headers for GTK 4, libadwaita and
libpipewire.
Running it uninstalled:
meson devenv -C build
violad &
viola
violad is the daemon that owns the PipeWire connection and, later, every
object Viola creates. It has to be a separate process: virtual devices belong to
the client that made them, so if routing lived in the window, closing the window
would tear down your audio setup. viola is the graphical client and can be
closed, killed or absent without affecting anything.
docs/design.md covers the endpoint model, the daemon split,
how application identity is resolved, and how Viola handles the graph being
changed behind its back.
The spike/ directory holds shell scripts used to verify PipeWire behaviour
before implementing it. They are not part of the application.
GPL-3.0-or-later. See COPYING.
