Skip to content

Repository files navigation

Viola

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.

Viola showing sound cards and a playing application

Status

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.

What it is meant to do

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

Requirements

  • PipeWire 1.0 or newer, with WirePlumber as the session manager
  • GTK 4.16, libadwaita 1.6

Building

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.

Design

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.

Licence

GPL-3.0-or-later. See COPYING.

About

Effortless audio routing for Linux. Route apps to any output, combine devices, create virtual mics - no patchbay required. Rust + GTK4 on PipeWire.

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages