Releases: knightinfected/PipeWireController
Release list
v0.6.0 — the dashboard, rebuilt
The dashboard is rebuilt: Overview and Mixer instead of five tabs, with the
view switcher in the window header so the dashboard is one click away from whatever
page you are on. Overview leads with your default output and your default input,
plus a new Favourites card — pin any output, input or virtual device and its
volume, mute and live meter stay on the dashboard.
A device row in the Mixer now says what kind of software device it is — filter
chain, signal path, equalizer, mic cleanup, loopback — and carries an
Output device picker. A virtual device has no ports, so those rows previously
had no routing control at all; sending an app to an equalizer was a one-way trip.
The app ships its own icons. They used to come entirely from your icon theme,
and that was not safe: on Breeze nine of them rendered as a red box, and the
Monitor page's icon exists in neither Adwaita nor Breeze, so it was broken for
everybody.
Bug: the Mixer listed the app's own plumbing as though it were applications.
Filter chains, loopbacks and virtual devices all look like a playing application to
the audio graph. Only real applications are listed now.
Bug: whole LSP plugin collections were never detected
(#13). LSP and Zam
were invisible everywhere, and on Fedora, openSUSE or RHEL there may have been
nothing listed at all. Reported by @GileonFletcher.
Pages also open a second column instead of stretching one narrow one, and the
dashboard refreshes about six times faster.
⚠️ libadwaita ≥ 1.7 is now required, which drops Ubuntu 24.04 LTS. The stated
requirement had been 1.4 and was wrong for some time. Where libadwaita is too old
the app now says so, in a window and in the terminal, instead of failing somewhere
inside a widget with nothing on screen.
Your settings are untouched. Nothing in this release needs migrating.
Full detail and screenshots in the
changelog.
v0.5.1 — app policy fixes
App Policies got the attention here. A rule now carries a direction, so one
app can have an output rule and an input rule — adding the second used to
silently replace the first (#7).
Rules also apply to what is already playing instead of waiting for the app to be
restarted, can be switched off without being deleted, and say so when they
cannot fire. Pattern and inverted matching are there too, behind Advanced.
Patchbay snapshots can now be updated in place (#5),
instead of deleting one and saving again under the same name.
Bug: the app would not start on a clean install — No module named 'cairo'.
pycairo is required but was only an optional dependency of python-gobject, so it
was missing on a fresh system. This affected every release since v0.4.0.
Your settings are untouched. Nothing in this release needs migrating.
On Arch: paru -Syu pipewire-control-center
Full detail in the CHANGELOG.
v0.5.0 — renamed to pipewire-control-center
The package, the command and the desktop entry are now
pipewire-control-center, with pwcc as a short alias. The
application is still called PipeWire Controller.
An unrelated project has held pipewire-controller on PyPI since February
2026 and installs the same /usr/bin binary and the same .desktop
filename — which could silently replace this app's launcher entry. Rather
than contest a name that was there first, this release moves out of the way.
Your settings are untouched. ~/.config/pipewire-controller/ and the
99-pipewire-controller.conf drop-ins keep their names, so every chain,
signal path, equalizer and preference carries over as-is.
Upgrading from a git checkout: the launcher is now
./pipewire-control-center. Remove any old ~/.local/bin/pipewire-controller
symlink and ~/.local/share/applications/pipewire-controller.desktop, or
you'll be left with a menu entry that does nothing.
On Arch: the AUR is not accepting package uploads at the moment, so the When that lifts,
package there is still 0.3.6.pipewire-controller stays on
as a transitional package, so an ordinary upgrade will move you across.
v0.4.0 — Signal Paths
Signal Paths — decide where audio comes in, what happens to it, and where it goes
A new page, and the first one that is about the shape of your audio rather
than about settings. A source is where sound enters — one app, a
microphone, or everything on the default output — and carries its own chain of
processing. A mix carries a chain of its own and feeds real devices.
Sources sit on the left, mixes on the right, and the sends between them are
drawn as curves, so a glance tells you what is going where.
One source and one mix is a straight line, which is what most setups are. The
second column earns its place once a chain has to split — one source corrected
four different ways for four different pieces of hardware, without building it
four times.
- Templates, from a plain speaker mix to a full broadcast chain. An empty
board is the catalog: four complete paths that build both halves in one
click, then twenty-six ready-made strips. Each card draws the chain it is
about to build, and anything wanting a plugin you do not have says so on the
card and is left out rather than producing a strip that will not start. - The board is handled directly, not through menus. Drag a stage along its
chain, or onto another card. Drag a card to rearrange a column, or onto the
opposite column to connect the two. Drag an app between strips. A click on a
stage takes it in or out of the signal; double-click or right-click opens it. - One process per chain, not one per plugin. Twenty effects are one entry
in your device list and one buffer hop, instead of twenty of each. - Equalizer bands can be moved while the audio plays — biquad filters
rather than the preset-file kind, so frequency, gain and Q take effect as you
change them. - Send one chain to several devices and they are combined into one output
for you. - Chains, sends and outputs can be exported and imported.
Also in this release: effect racks can feed other effect racks,
equalizers are no longer stereo-only (mono to 7.1), honest DSP load and
xrun numbers on the Monitor page, level meters that stay put on big setups,
and "Hide the whole sound card" so a hidden device is really gone
(#3).
Full details and screenshots in the changelog.
v0.3.6 — Live level meters, Equalizer and Microphone cleanup
Everything shows its level
Live level meters on every volume control — the Dashboard mixer, both device tabs, the Devices page and the equalizers. You can see at a glance which app is making noise, whether a device is really passing audio, and how loud it is. Meters are dB-mapped, so normal listening fills the bar instead of sitting near zero, and each carries a peak-hold marker.
They cost effectively nothing: PipeWire's own resampler reports the peaks, so a meter reads about 100 bytes per second rather than streaming audio. Meters run only while their row is on screen, can't keep a device awake, and never appear as nodes in the Patchbay.
Equalizer
Parametric-equalizer outputs you route audio through. Import an AutoEQ / APO ParametricEq.txt (browse, or drag the file onto the row), or dial the bands in by hand — each band has its own type, frequency, gain and Q, plus its own switch so you can hear one filter in isolation without deleting it. One click makes an equalizer the default output.
Live A/B compare (beta) switches an equalizer in and out while it keeps running, so playback never pauses.
Microphone cleanup
A clean copy of your microphone with echo and background noise removed (WebRTC). Noise suppression, automatic gain, a high-pass filter and voice-activity detection are individual switches, with extended-filter, delay-agnostic and transient suppression under Advanced. By default it uses whatever is playing on your speakers as the echo reference, so there is nothing to route.
Also
- Running equalizers and microphones are marked with an accent edge running the whole height of their block; stopped ones step back, and the inline mixer is laid out as the signal path.
- Fixed: text containing
&or<made a row's title or subtitle vanish entirely — stream names reported by apps, device descriptions, and anything you had typed yourself (equalizer, filter-chain and virtual-device names, app policies, HRIR filenames).
Full highlights with screenshots: CHANGELOG.md
v0.3.5 — bug fixes and additions
Card configuration is its own control — with a way out of a broken profile
A big fix to the Output/Input Devices card-profile switcher introduced in v0.3.2.
- Configuration switcher is now a dedicated row, one per card, instead of riding on one arbitrary device row. It no longer jumps between rows or disappears when a profile exposes several sinks at once (Pro Audio) or none at all (Off) — the switcher, and the way back, are always reachable.
- One-click Reset to a working profile when a card gets stuck. WirePlumber can save a profile that later can't work (e.g. an HDMI-surround profile saved while nothing is plugged into HDMI), leaving you with no audio and, before, no obvious way out.
- Smarter "unavailable" warning — the ⚠ now flags only genuinely unavailable profiles, so a playable-but-unprobeable profile like Pro Audio is no longer falsely marked.
Full changelog: v0.3.4...v0.3.5
v0.3.4 — Import existing virtual devices
Added
- Import existing devices (Virtual Devices page) — adopt loopback, combine, and null-sink drop-ins you hand-wrote in
~/.config/pipewire/pipewire.conf.d. Each is classified into the right kind (null sink · virtual mic · bus · combined), imported disabled, and the original drop-in is moved into a siblinginactive/folder so the main daemon loads it only once (no duplicate — and it's reversible). A file picker covers configs kept elsewhere; importing raises the PipeWire restart banner.
Changed
- The header-bar bookmark button is now labelled Device Presets next to the star, so it's clear what it does.
See the CHANGELOG for the full highlights reel.
v0.3.3 — Virtual-device fixes
Virtual-device fixes prompted by user feedback.
Fixed
- Virtual mics no longer auto-route to the default sink. The null-source playback stream now sets
node.autoconnect=false(matching the null-sink discard side and the Pro Audio map nodes), so WirePlumber can no longer link a virtual mic onto your speakers.
Added
- Mono 1.0 channel layout for virtual devices (null sinks, virtual mics, aggregates, buses). Editing an existing mono device now selects the correct layout in the dropdown.
See the CHANGELOG for the full highlights reel.
v0.3.2
Builds on v0.3.1 with a new Virtual Devices capability and a dashboard convenience.
Added
- Pro Audio channel map (Virtual Devices): two new device kinds — Pro Audio output map (channels → AUX) and Pro Audio input map (AUX → virtual mic) — that map a friendly channel layout onto the generic AUX channels a card exposes in its Pro Audio profile (e.g. a stereo sink whose FL/FR land on the interface's AUX0/AUX1). Arbitrary N-channel maps supported. Because WirePlumber won't auto-route onto Pro Audio nodes, the links are created explicitly by a per-instance systemd drop-in that re-runs on every start — so the mapping survives reboots and PipeWire restarts. Verified end-to-end on real hardware.
- Dashboard card configuration switcher: each card on the Output/Input Devices tabs now has a profile dropdown — switch a card's configuration (Analog Stereo Duplex, Pro Audio, HDMI, Off, …) straight from the dashboard, like pavucontrol's Configuration tab. Shown once per card.
- pyproject.toml: a proper PEP 621 project (hatchling backend, console entry point, dev tooling with pygobject-stubs + basedpyright + ruff). The app still runs with no build step; GTK4/libadwaita remain system dependencies.
Changed
- The virtual-device create/edit dialog is now a resizable window with a larger default size, so the full form fits without scrolling (scroll retained for small windows).
Fixed
- Pro Audio caveat note now wraps fully instead of ellipsizing to one line.
- The virtual-device Type dropdown no longer truncates its option descriptions.
v0.3.1
Bugfixes and a small UI addition on top of v0.3.0, from feedback by Wim Taymans (creator of PipeWire).
Fixed
- Quantum hard limit (
default.clock.quantum-limit): the 8192 ceiling was too low — only ~43 ms at 192 kHz. The dropdown now reaches 16384/32768 (PipeWire's real ceiling is 65536); the default stays 8192. The row now explains the frames-vs-rate relationship and the JACK-client caveat. - Max buffers per link (
link.max-buffers): corrected the misleading description — 16 was the oldversion < 3client cap, 64 is excessive, and the setting mostly concerns video buffers, not audio. Default is now 16 (choices 1/8/16/32/64).
Added
- "Custom…" entry on the Default/Minimum/Maximum quantum dropdowns for buffer sizes off the preset list (clamped to 1–65536; non-power-of-two allowed with a heads-up).
Special thanks to Wim Taymans for the review and feedback.