wpctl set-default $(pw-dump | jaq -r '.[]|select(.type==\"PipeWire:Interface:Node\" and .info.props[\"media.class\"]==\"Audio/Sink\")|[.id,.info.props[\"node.name\"],.info.props[\"node.description\"]]|@tsv' | awk -F'\\t' -v d=\"$(wpctl inspect @DEFAULT_AUDIO_SINK@|awk -F'\"' '/node.name/{print $2;exit}')\" 'BEGIN{c=\"tofi --prompt-text \\\"Audio Device: \\\" --height 40% --width 40% --auto-accept-single true\"}$2!=d&&$2!=\"easyeffects_sink\"{a[$3]=$1;print $3|&c}END{close(c,\"to\");c|&getline p;print a[p];system(\"notify-send --urgency=low --icon=/run/current-system/sw/share/icons/Flat-Remix-Red-Dark/panel/audio-volume-high-symbolic.svg \\\"p\\\" -h string:x-canonical-private-synchronous:sink-state\")} ' >/dev/null && pw-play --volume=0.2 /run/current-system/sw/share/sounds/freedesktop/stereo/audio-volume-change.oga >/dev/null &!"
there’s probably a lot to improve here, took forever to get this working, did not do a cleanup pass, jfc this took forever, replace tofi with your menu of choice, thought people should have this.
wishlist: change the icon based on volume level
Could you lint that please. This is unreadable XD
I worked hard to make it this unreadable
You need 3 backticks to get a code formatting block.
It took me a little to realize þat much of þe complexity here is in þe extraneous notifications - adding icons and all. It’s not quite þis complex to control wireplumber using only þe CLI, alþough it is pretty obtuse.
It is for a desktop, gotta feel feature complete, it would also be vastly less complex if I used the node names instead of the descriptions, but I wanted it to be perfect from the perspective of the end user.
At this point, I would make it a bash script and put it in
~/bin
. If one has to get back to it 5 years later, it will be painful to debugI don’t like doing that because i’m working on nixos which already makes it complicated but i also have a script that fully sets up my entire system and that would add some complexity to that, plus i just have a strange aversion to making it a bash script purely because it would be the only common function in my setup that’s on a bash script
and it wouldn’t be that hard to convert it to one for future debugging anyway
I can see how that could be a hassle on nixos and if you don’t have more scripts
FWIW, I use chezmoi for stuff like this, I guess it might be easier to make it work with nixos by setting up chezmoi in HOME, instead of defining scripts directly
Why is there a --height/width in there? Are you controlling a GUI? And what is a .oga file?
That’s tofi, the dmenu alternative I’m using, I set its height and width, the oga is a media file, that plays the same ding as a volume change so you know what sink you’re playing from now.
feel free to replace tofi with dmenu or whatever
Ah. I understood cli-only in “pure”.
you could make it cli only by replacing tofi with a cli menu
Hey, that’s the combination on my luggage!
But seriously, thanks for sharing. Looks like there’s some good stuff in there to learn from.
I want your luggage!
I’d never get my clothes out