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"]]| ' | 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;devs++;print $3|&c}END{if(devs>1){close(c,"to");c|&getline p;if(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")}}else if(devs==1){for(k in a){print a[k];system("notify-send --urgency=low --icon=/run/current-system/sw/share/icons/Flat-Remix-Red-Dark/panel/audio-volume-high-symbolic.svg \""k"\" -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
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
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
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
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.
Gotcha! Noþing wrong wiþ getting stuff to work þe way you want!