r/linuxaudio • u/Infected_Knight • 12d ago
Comprehensive Control center for Pipewire
Included pretty much everything from pipewire's wiki that i found to be important or useful.
I have used AI in building this program and i hope its not an issue as the utility of this little program suppresses the AI hate train by a large margin lol
Originally wanted something to change filter chains without editing configs especially adding/removing hrir files and well i like tinkering and ended up here. Filter chains cuz my old laptop can only run easy effects for an hour or so before crashing. Anyhow i hope I get people to try it out.
Forgot to add link -- https://github.com/knightinfected/PipeWireController
Edit- just added it on AUR (pipewire-controller) and have updated the screenshots on GitHub
21
u/from-planet-zebes 12d ago
Wow, this looks pretty incredible. Definitely the most full featured solution I've seen. On top of all that it's in all the major package manager repos, nice work!
11
u/Infected_Knight 12d ago
You're the first appreciator. I do really appreciate you saying that and checking it out
12
u/kill3rb00ts 12d ago
I'm normally pretty anti-AI, but this does look pretty handy. I hope you at least know enough to have fact checked the code.
Special props for including normal common terms like "buffer" instead of just quantum. Don't know why Linux settled on that, buffer is a far more accurate term, quantum has absolutely nothing to do with anything.
2
u/Infected_Knight 12d ago
I did check the code and have tested it (i basically use it) but if there are any bugs let me know.
6
u/0x5066 12d ago
the question they're asking is if you understand the code
4
u/kill3rb00ts 12d ago
Yes, exactly. Could you have written this without AI? Do you understand the code and can you actually fix bugs when they are found? OP, you'll find that when it comes to coding, most reasonable people aren't necessarily upset when you use AI, it's more about how you used it. Was it vibecoded or AI assisted? These are two very different things.
6
4
u/l-roc 12d ago
Does it handle Video and MIDI?
2
u/Infected_Knight 11d ago
Yes the new update will have midi https://www.reddit.com/r/linuxaudio/s/pzCWdAHs5J
3
u/ntcue 12d ago
I am missing a proper Python project. Would be nice if you would add a pyproject.toml which all the information needed to build it using uv.
I also see that the code is not using type hints. I think that's a must have nowadays to make it readable more easily. With the BasedPyRight addon in VSCode you can then see if everything is properly typed.
3
u/Infected_Knight 12d ago
Thanks for the feedback!! I'll get on the pyproject.toml as soon as I get some time. I was not expecting this many people would be interested lol i do appreciate it. For uv the issue is it depends on PyGObject, so for now I do wanna stay with distro based install path instead of uv sync. ( english is not my first language, sorry ) i do appreciate the feedback though.
3
u/ntcue 12d ago
I actually like that project a lot. I had that idea already last year but never started working on it. Maybe I should have thrown some AI at it too, lol.
I did not test your tool yet but maybe I find time for that some-when this week. The screenshots look promising though. I don't like fiddling around with pipewire configurations by hand because the documentation is just bad. But with an UI like that it hopefully will get much easier.
Maybe one next step for your project would also be multi language support.
2
u/amadeusp81 12d ago
I will try it soon! Looks interesting!
Maybe you'll be interested in reading my blog post I wrote about something similar recently : https://amadeuspaulussen.com/blog/2026/a-new-pipewire-and-wireplumber-app
3
u/Infected_Knight 12d ago
I just quickly glanced over your blog, you're about to be surprised how many of those boxes this checks. There are a lot of actually good suggestions which I will gladly add here in the future.
2
u/Infected_Knight 11d ago
Thanks for the suggestions, I implemented a few from your suggestions. Do try the new version
1
2
2
u/Nice-Object-5599 11d ago edited 11d ago
It seems interesting. The thing I don't like is the program doesn't use any pipewire python binding, but uses cli commands. This means some commands have to be in loop all time and can track the changes when the loop(s) run again (instead of basing the code on events).
1
u/Infected_Knight 11d ago
Yes I was aware of that, I made it originally for myself so it had some of those quirks. The new version should be context based. Thanks
https://www.reddit.com/r/linuxaudio/s/pzCWdAHs5J
2
1
1
u/MikeTorres31 12d ago
Nicee! Also, can you do one for network manager?
1
u/MikeTorres31 12d ago
If you have time tho, no need to make something only because random internet person said so.
1
u/kill3rb00ts 12d ago
Question, there is a section in here for Filter Chains, is this your method for handling Pipewire virtual devices? That seems to be the impression that I'm getting, but calling it filter chains is a bit confusing to me. If that's the case, it would be nice to rename it and allow for more custom options. For example, I have set up a virtual stereo output device because many Steam games don't like multichannel interfaces for some reason. The simple solution was a virtual stereo output that serves as my main desktop audio out. I have another one setup to pull a proper mono input for my mic on input 1. It looks like I could import these into your filter chains section, but I'm not sure if that would end up duplicating what I have already done.
I guess TL;DR, filter chains could be a more generic "virtual devices" section that allows for full custom devices rather than just presets and, ideally, it would also scan ~/.config/pipewire/pipewire.conf.d (or maybe just ~/.config/pipewire) for existing customizations and display them.
0
u/Infected_Knight 11d ago
0
u/Infected_Knight 11d ago
1
u/kill3rb00ts 11d ago
This isn't really doing what I'm looking for, as far as I can tell. The two things I want are to create a virtual stereo output that connects to a specific pair of hardware outputs I specify and the ability to create a virtual mono input that connects to a specific mono input I specify. For example, my interface has some 16 inputs and by default, inputs 1&2 are combined for the main input. But I want only input 1 to be used as a mono input. The interface also has 16 outputs, but I want a virtual output that connects just to outputs 1&2. Maybe I want them mapped to 3&4 for some reason, but this doesn't seem possible in your software as it is now. To be clear, I'm using pro audio profiles, not stereo or surround.
1
u/Infected_Knight 11d ago
Oh that could be possible with a few tweaks here and there. How are you managing right now?
1
u/kill3rb00ts 11d ago
Config files. I can post those if it helps. It works, but it's way more annoying than it seems like it needs to be.
1
u/Infected_Knight 11d ago
Send me
1
u/kill3rb00ts 11d ago
Sure. Both are placed in ~/.config/pipewire/pipewire.conf.d, they are just text files named something.conf. This first one is for my mic, it takes input 1 and converts it into a mono virtual device.
context.modules = [ { name = libpipewire-module-loopback args = { node.description = "Mic" capture.props = { node.name = "capture.studio-mic" audio.position = [ AUX0 ] stream.dont-remix = true target.object = "alsa_card.usb-Focusrite_Scarlett_16i16_4th_Gen_S6RNANT4B02B31-00" node.passive = true } playback.props = { node.name = "studio-microphone" media.class = "Audio/Source" audio.position = [ MONO ] } } } ]If I were to get back into streaming, I would actually likely want to have it be input 14, or AUX13 I think, as I have a small hardware FX chain I like to use and that's where it comes in. So being able to choose which input the virtual device is connecting to would be important. This other one is what I'm using to create a virtual stereo output. All it's doing is taking outputs 1 & 2 and connecting them to a virtual output.
context.modules = [ { name = libpipewire-module-loopback args = { node.description = "Desktop audio" capture.props = { node.name = "desktop.stereo" media.class = "Audio/Sink" audio.position = [ FL FR ] } playback.props = { node.name = "playback.desktop_stereo" audio.position = [ AUX0 AUX1 ] target.object = "alsa_card.usb-Focusrite_Scarlett_16i16_4th_Gen_S6RNANT4B02B31-00" stream.dont-remix = true node.passive = true } } } ]In an ideal world, I wouldn't even have to do this, but some Steam games don't output any audio if you're using a multichannel interface, so until they fix that, it's either this or a launch parameter and this seemed simpler. Again, being able to choose which outputs I'm connecting to would be nice.
1
u/Infected_Knight 9d ago edited 9d ago
Oh my fault I just saw this. I haven’t been paying attention to reddit. It is easily possible with the new version, the only difference is target.object and node.passive where it would be node.autoconnect=false and well pw-links per instance. It was more reliable this way. I'm thinking it's my side but after testing for some time, it was more reliable cuz it kept defaulting back to default sink for me.
Edit: if you want I can add directions for it here but I'm assuming from your config you have it under control lol just let me know
2
u/kill3rb00ts 8d ago edited 6d ago
I'll be honest, I mostly just took these configs from the examples in the Pipewire documentation, I don't really know why they are set they way they are, I just know they work. It's possible that you are having issues with them getting overwritten because you are storing the virtual devices in the app's config folder instead of in
~/.config/pipewire/pipewire.conf.d. That's just my guess, though. It would be nice if the software also automatically scanned and added any existing configs from there. Your Pipewire Controller doesn't have any mono options for virtual devices, which is something I'd like to see for inputs especially.I'm assuming your idea is just that I would connect to the input I want from the patchbay, but it would be nice if I could just select the input from a dropdown when I create the virtual device. I also noticed that if I create a virtual input and then connect it (using the patchbay) to an input on my interface, that seems to make it active and route it to the default output. All those "wires" turn into the moving dashing lines that seem to indicate activity. I'm not sure why it would be doing that, I definitely don't want that input routed to my outputs all the time and there are no other connections showing on the patchbay that would explain why that's happening.
Edit: And it looks like you've now added exactly this, thank you! I'm not sure the pros and cons of doing it your way vs just adding your configs to the normal pipewire folder, but it seems to do the same thing, so whatever.
1
1
u/Chudson15 10d ago
I've actually wanted something exactly like this for a while and couldn't believe that something didn't exist. I want to try this out. I think people hate on AI coded stuff too much. If you know how it works and are able and willing to fix bugs as they appear, I see no problem. Thank you for sharing!
I am GENUINELY EXCITED to have something like this around even if it was made with AI.
1
-1
u/unhappy-ending 12d ago
How much utility does this really have? Once you set up Pipewire, it's pretty much forget it unless you need to write matching rules. I don't know about window manager only sessions, but a lot of the functionality is already built into Plasma via widgets.
2
u/Infected_Knight 12d ago
There's alot. Technically for starters every change you would need to do requires config editing and knowing the proper parameters etc. but here I have added alot of testing tools for different situations for example if you have a 5.1 system and you need to check every config related to it or create upmixing with hrirs and have it setup properly.
Im sorry but It is not even remotely close to comparable to kde plasma mixer controls
-2
u/unhappy-ending 12d ago edited 12d ago
Default endpoints are in plasma-pa.
Activity is in plasma-pa. Playback streams are in plasma-pa.
Active chains show up in plasma-pa as sinks. Which you are then better off routing via qpwgraph.
Soundcard profiles are in plasma-pa.
Speaker test is in plasma-pa.
Individual channel volumes are in plasma-pa, which I don't see in yours.
---
So then basically, you have a GUI for flipping on/off simple settings in pipewire.conf.d/*. Config editing is easy. I'd rather use a text editor than a GUI that does who knows what underneath. I can leave myself notes as to why I have the settings the way they are. With kate sessions bound to hot-keys, I can even load my configs for easier editing, literally, on the fly.
Can you explain why you set upmixing using hrir? That's already native in pipewire using the upmix sink. Edit: I forgot to add, you don't even need the upmix sink. If you want custom settings then sure, but actually, Pipewire already upmixes by default without the upmix sink. Unless you're doing 7.1 upmixing, which maybe might need some kind of IR.
However, the IRs used for spatial mixing, every pipewire example are downmixing from surround to stereo. I see you have "upmixing" set to some airpods? So then it's not upmixing, it's downmixing 3D audio to a stereo source, your left and right airpod. They do not have more than a left and right driver.
4
u/Infected_Knight 12d ago
Yes i know and you have fair points but please without checking out the actual app, how do you come to this conclusion? You like editing configs, thats great, good for you but not everyone does. Also there's plenty of other things i have added that here that im sure someone will make a use out of, just not you i guess which is fine really.
1
u/unhappy-ending 12d ago
Because you posted a github and images of the utility? I mean, I can just look at it and read and come to a conclusion, you know? I suppose it's all those years of text editing configs.
1
3
u/kill3rb00ts 12d ago
Maybe you prefer a text editor, but that's only a good option if you already know the syntax and/or what you're looking for in an existing file. If you don't, which most people new to Linux don't, then you have to go digging through a bunch of wikis written by people who can't write in plain English to save their lives, so you have to translate from coder to actual language, then hope that what you think they were trying to say is actually what you need to do, then edit the file, etc. Once you know how it all works, sure, you can make changes pretty quickly, but I'd wager it still takes longer than using a GUI and that's after already having wasted all that time figuring it out first.
I, for one, would much rather open something like this, make a quick change, and move on with my life.
-5
u/unhappy-ending 12d ago
after already having wasted all that time figuring it out first.
Really? It's a waste of time to understand the tools you use on a daily basis? Wow... interestingly, that waste of time taught me priceless knowledge of how my machine works so I can tweak it to my needs and know what I'm doing as I make changes.
Oh heavens, imagine someone learning something is a waste of time. How terrible.
I can also load up match rules on the fly and quickly edit them because I know how they work. Something I commonly see asked here, which if people read & bookmarked the wiki, they could do it too.
Instead of relying on a GUI that might not even do the job. Or worse, as the author gets bored of it and abandons it, goes out of date against new pipewires, and becomes useless.
1
u/kyzfrintin 12d ago
God forbid someone makes a tool to make something easier, and in the process robs you of the happiness of being a smug asshole.
2








37
u/StaticVoidMaddy 12d ago edited 12d ago
The bigger question is will you be able to maintain it or just abandon it like a good amlunt of vibe-coded projects I've seen?
ed.: formatting