◉ Pulse
knightinfected avatar
#64 today ▼ 11

knightinfected/PipeWireController

Python AI #filter-chain #gtk4 #hesuvi #hrir

GTK4/libadwaita control center for PipeWire — filter chains, HRIR virtual surround, drop-in config management. On the AUR: pipewire-controller

Created Jul 21, 2026
Stars
16
Today
+2
Forks
1
Quality
100/100
Momentum
20

README

Fetched from GitHub on Oct 30, 2026, 10:16 PM UTC · README.md

View original on GitHub

Third-party content — Open Source Pulse is not the owner of this repository.

This README belongs to knightinfected/PipeWireController and its contributors. We fetch it directly from the project’s public GitHub repository and display it for reference only. All text, code, images and trademarks remain the property of their respective authors. See the repository for its license terms. Copyright / takedown policy.

PipeWire Controller

The all-in-one audio control center for Linux, built on PipeWire.
Mix, route, process and tune all of your audio in one app, without hand-editing a config file.

Install · Features · Screenshots · Changelog · Discussions · Contributing · Working on · Support

AUR Debian and Ubuntu: .deb Fedora: .rpm openSUSE: .rpm GPL-3.0-or-later

The dashboard: default output and input, pinned favorites, and a live level meter on every slider

What do you want to do?

I want to… Go to
turn one app down, or move it to another device while it plays Dashboard → Mixer
balance my speakers, or turn down one side of my headphones Dashboard → Mixer: the Channels button on any row
keep the devices I use most one glance away Dashboard → Favorites: pin any output, input or virtual device
play on two devices at once Virtual Devices → Combined output
EQ my headphones with an AutoEQ profile Equalizer: drop the ParametricEq.txt on the list, then drag the curve to taste
stop my mic picking up echo and room noise Equalizer → Mic, then pick the clean mic as your input
hear 7.1 surround on headphones Surround Setup → Virtual 7.1 Headphones
set up real 5.1 or 7.1 speakers Surround Setup: a wizard with a test tone for each speaker
get better Bluetooth audio Session & Bluetooth: SBC-XQ, mSBC, and a codec per device
stop the pop or cut-off at the start of sounds Session & Bluetooth → never suspend devices
work out why the audio crackles Monitor: dropouts, DSP load and a live pw-top
start it with my computer, quietly in the background Preferences → Startup
put every setting back the way it was Tools → Reset all overrides

That's the everyday half. All features goes from here to the advanced end: signal paths, filter chains, channel maps, per-app rules and the server clock.

What's new in v0.6.3

  • Search the whole app: the search button at the top of every page, or Ctrl+K, finds any page, setting, device, app or thing you've set up, and takes you straight to it.
  • Bug fix: the line under the sidebar's header now meets the one under the page's header, on every theme (#32).

v0.6.2

  • Equalizer, redesigned: drag the curve and hear it live, then compare it with the saved one at matched loudness.
  • Devices, redesigned: every device in one list; pick one to see what plays into it, where it goes, and its settings.
  • Patchbay, reworked: connect whole devices or channel ranges in one go, and arrange the graph by signal flow.
  • Balance and per-channel volume for every output, input and app.
  • Preferences: start at login, start minimized in the background, light or dark.
  • Narrow and tiled windows: the window now goes down to 360 pixels wide, and most pages fit it.
  • Live updates: Devices and the Equalizer follow changes as they happen, instead of polling.
  • RPM packages for Fedora 43 to 45 and openSUSE Tumbleweed, beside the .deb.
  • 17 bug fixes. Every change, and every earlier release, is in the changelog.

A look inside

Equalizer: your equalizers beside the selected one's curve and bands Equalizer
Drag the curve and hear it as you go. Compare with the saved curve, or with no EQ, at the same loudness. AutoEQ import, presets, and echo and noise removal for your mic.
Devices: every device in a list, beside the selected one Devices
Every device in one list. Pick one to see what's playing into it and where it goes, with its port, profile, settings and a test chime.
Patchbay: the live graph arranged by signal flow, one output selected Patchbay
The live graph of your session. Connect a whole device or a range of channels at once, arrange it by signal flow, and save it as a snapshot.
Signal Paths board Signal Paths
Draw where your audio goes: sources on the left, mixes on the right, effects on each. Start from 26 templates.
Mixer Mixer
Every app and device, with live meters. Move a stream to another device while it plays, or set the balance of each channel.
Preferences: appearance and the four volume slider styles Preferences
Light or dark, four volume slider styles, and start at login, minimized to the background.
Virtual Devices Virtual devices
Null sinks, virtual mics, one output that plays on several cards, buses, and per-channel maps.
Surround Setup Surround
A wizard for real 5.1 and 7.1 speakers, and HRIR virtual surround for headphones.
Three pages in a phone-width window: Devices, one device, and an equalizer Narrow windows
Tiled, or as narrow as 360 pixels: the list and the item you pick take turns.

Also: server clock and quantum, stream processing, per-app routing rules, LADSPA/LV2 effect racks, filter chains, device presets and a live performance monitor. All features · Every screenshot

Install

Arch, CachyOS, EndeavourOS, Manjaro (AUR)
paru -S pipewire-control-center   # or: yay -S pipewire-control-center
Debian 13+, Ubuntu 26.04 LTS+ (.deb)

Debian 12, Ubuntu 24.04 and Linux Mint 22 are too old, and apt will refuse the package. To check yours first, run apt-cache policy gir1.2-adw-1: the Candidate line needs to show 1.7 or newer.

Download the .deb from the latest release, then, in the folder you saved it to:

sudo apt install ./pipewire-control-center_0.6.3_all.deb

The ./ matters. It doesn't update itself, so install the next release's .deb the same way. If you ran it from a checkout before, remove the old menu entry first:

rm -f ~/.local/bin/pipewire-control-center ~/.local/bin/pwcc \
    ~/.local/share/applications/io.github.knightinfected.PipeWireControlCenter.desktop
Fedora 43+, openSUSE Tumbleweed (.rpm)

Download the .rpm for your system from the latest release, then run the line for your distro in the folder you saved it to.

On Fedora, take the file ending in your release, fc43, fc44 or fc45 (rpm -E %fedora prints which):

sudo dnf install ./pipewire-control-center-0.6.3-1.fc44.noarch.rpm

On openSUSE Tumbleweed:

sudo zypper install --allow-unsigned-rpm ./pipewire-control-center-0.6.3-1.tumbleweed.noarch.rpm

The packages aren't signed, which is why zypper needs --allow-unsigned-rpm. They don't update themselves, so install the next release's .rpm the same way. If you ran it from a checkout before, remove the old menu entry first, as in the Debian section above.

Running from source, on any distro

Install the dependencies:

# Fedora
sudo dnf install pipewire pipewire-utils wireplumber pipewire-pulseaudio \
    pulseaudio-utils gtk4 libadwaita gobject-introspection python3-gobject \
    python3-numpy python3-soundfile
# Debian / Ubuntu (Ubuntu: add libspa-0.2-modules-extra for LV2 and SOFA)
sudo apt install pipewire wireplumber pipewire-pulse pulseaudio-utils \
    gir1.2-gtk-4.0 gir1.2-adw-1 python3-gi python3-gi-cairo python3-numpy \
    python3-soundfile
# Arch
sudo pacman -S --needed pipewire wireplumber pipewire-pulse gtk4 libadwaita \
    python-gobject python-cairo python-numpy python-soundfile

Elsewhere you need GTK 4, libadwaita, PyGObject with its cairo support (python3-gobject-cairo on openSUSE), numpy, soundfile, and pactl for switching Bluetooth codecs (pulseaudio-utils). Then:

git clone https://github.com/knightinfected/PipeWireController.git
cd PipeWireController && ./pipewire-control-center

For a pwcc command and an app-menu entry:

mkdir -p ~/.local/bin ~/.local/share/applications
ln -sf "$PWD/pipewire-control-center" ~/.local/bin/
ln -sf "$PWD/pipewire-control-center" ~/.local/bin/pwcc
sed "s|^Exec=.*|Exec=$HOME/.local/bin/pipewire-control-center|" \
    io.github.knightinfected.PipeWireControlCenter.desktop \
    > ~/.local/share/applications/io.github.knightinfected.PipeWireControlCenter.desktop

If a new terminal can't find pwcc, log out and back in once.

Optional extras: noise-suppression-for-voice (the RNNoise mic template), lsp-plugins-ladspa (more LADSPA plugins), and PipeWire built with libmysofa (the SOFA surround templates).

Requirements

PipeWire 1.0+, WirePlumber 0.5+ and libadwaita 1.7+, which rules out Debian 12, Ubuntu 24.04 and Linux Mint 22 (built on Ubuntu 24.04). Python 3.10+, and no build step.

Questions

Will it mess up my config? No. It never edits the files your distro ships. Its changes go into files of its own, listed below. Tools → Reset all overrides removes every setting it wrote, and anything you built, like a chain or a virtual device, comes off its own page.

Do I need to restart anything? Some changes apply instantly. When one needs a restart, a banner names the service and restarts it for you. Filter chains, virtual devices and equalizers each run as their own process, so changing one never interrupts the rest of your audio.

Something's broken. Please open an issue. I use this daily, which means I mostly find the bugs I happen to walk into, and every PipeWire setup is different. Even a one-line report helps more than you'd think.

Where things are written

Uninstalling the package leaves your settings alone. To remove those too, these are the only places the app writes:

What Where
Settings drop-ins ~/.config/pipewire/{pipewire,client,pipewire-pulse}.conf.d/99-pipewire-controller.conf and ~/.config/wireplumber/wireplumber.conf.d/99-pipewire-controller.conf
Everything you build ~/.config/pipewire-controller/: chains, signal paths, equalizers, virtual devices, snapshots, HRIRs, rules, preferences
The runner unit ~/.config/systemd/user/pwctl-chain@.service, its links in pipewire.service.wants/, and any pwctl-chain@*.service.d/ folders
Start at login, only while it's on ~/.config/autostart/io.github.knightinfected.PipeWireControlCenter.desktop
The app-menu entry, if you made one from a checkout ~/.local/share/applications/io.github.knightinfected.PipeWireControlCenter.desktop

There's one exception. Import existing devices on the Virtual Devices page moves the drop-in it adopts into an inactive/ folder next to it, so PipeWire doesn't load it twice. Move the file back to undo that. Importing a filter chain copies it and leaves your file where it was.

The unrelated pipewire-controller app from PyPI also keeps a settings.json in ~/.config/pipewire-controller/. If you use both, delete only what's listed above.

Support

Sponsor on GitHub Donate via PayPal

Right now PipeWire Controller is a one-person project: I design it, build it, test it, package it and answer every issue myself. If it has earned a place on your desktop, sponsoring it or a one-off donation means more of my time goes into it. Bug reports, ideas and feedback count just as much. The app is GPL-3.0 and stays that way: nothing is ever locked behind a donation.

Want to help with code? Read CONTRIBUTING.md first.

If you like tinkering like me…

…here are some cool GitHubs to visit for sound tools:

…and some goated repos for presets, HRIRs, and DDCs:


Licensed GPL-3.0-or-later. The icons in pwctl/icons/ are from the GNOME icon-development-kit, under CC0 1.0. Thanks to Wim Taymans, creator of PipeWire, for reviewing the app.

Rendered by GitHub from the repository’s README. Scroll to read the full file.
First trending

Jul 22, 2026

first spotted on the list

Best rank

#15

highest position reached

Appearances

2

times on the trending list

Quality score

100

out of 100

Momentum

20

trend strength indicator

Star velocity

0.16

stars per day since creation

Activity — last 60 days

daily counts, collected every 6 hours
  • Stars
  • Forks
  • Merged PRs
  • Issues
  • Closed issues

Collecting activity data since launch — check back in a few days.

Star history

total stars per snapshot
1314151617knightinfected/PipeWireController · Jul 22, 2 PM UTC: 14 starsknightinfected/PipeWireController · Jul 22, 7 PM UTC: 16 stars2:04 PM4:45 PM7:26 PM

Rank history

position on trending · lower is better
#1#10#20#30#40#50#60#70Jul 22, 2 PM UTC: rank #15Jul 22, 7 PM UTC: rank #642:04 PM4:45 PM7:26 PM

3D card for your website

Live HTML card with a glass surface and pointer tilt. Paste the iframe on any website.

<iframe src="https://www.notionpulse.cc/embed/knightinfected/PipeWireController" width="420" height="240" style="border:0;max-width:100%;background:transparent" loading="lazy" title="knightinfected/PipeWireController — trending on Open Source Pulse"></iframe>

Stars badge

Show current stars in your README or profile. Auto-updates every 6 hours.

knightinfected/PipeWireController stars badge
Markdown
[![knightinfected/PipeWireController](https://www.notionpulse.cc/api/badge/knightinfected/PipeWireController.svg)](https://www.notionpulse.cc/repo/knightinfected/PipeWireController)
HTML
<a href="https://www.notionpulse.cc/repo/knightinfected/PipeWireController"><img src="https://www.notionpulse.cc/api/badge/knightinfected/PipeWireController.svg" alt="knightinfected/PipeWireController stars badge" /></a>

Repository of the Day

#15 Repository of the Day

Repository of the Week

#15 Repository of the Week

Repository of the Month

#15 Repository of the Month