A pure wireplumber way to switch audio devices, no pactl
from communist@lemmy.frozeninferno.xyz to linux@lemmy.ml on 02 Oct 03:55
https://lemmy.frozeninferno.xyz/post/57838547

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;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

#linux

threaded - newest

everett@lemmy.ml on 02 Oct 07:56 next collapse

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.

Sxan@piefed.zip on 02 Oct 11:29 collapse

I want your luggage!

calliope@retrolemmy.com on 02 Oct 11:44 collapse

I’d never get my clothes out

MonkderVierte@lemmy.zip on 02 Oct 08:50 next collapse

Why is there a --height/width in there? Are you controlling a GUI? And what is a .oga file?

communist@lemmy.frozeninferno.xyz on 02 Oct 08:58 collapse

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

MonkderVierte@lemmy.zip on 02 Oct 09:01 collapse

Ah. I understood cli-only in “pure”.

communist@lemmy.frozeninferno.xyz on 02 Oct 09:09 collapse

you could make it cli only by replacing tofi with a cli menu

INeedMana@piefed.zip on 02 Oct 10:09 next collapse

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 debug

communist@lemmy.frozeninferno.xyz on 02 Oct 10:59 collapse

I 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

INeedMana@piefed.zip on 02 Oct 11:05 collapse

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

Sxan@piefed.zip on 02 Oct 11:33 next collapse

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.

communist@lemmy.frozeninferno.xyz on 02 Oct 15:55 collapse

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.

Sxan@piefed.zip on 03 Oct 01:00 collapse

Gotcha! Noþing wrong wiþ getting stuff to work þe way you want!

boredsquirrel@slrpnk.net on 02 Oct 20:41 next collapse

Could you lint that please. This is unreadable XD

communist@lemmy.frozeninferno.xyz on 02 Oct 21:14 collapse

I worked hard to make it this unreadable

balsoft@lemmy.ml on 03 Oct 10:56 collapse

I don’t think it’s much worse than what you have to do with pulseaudio, TBH. Here is my Haskell take on switching devices: github.com/balsoft/…/Pulseaudio.hs, and Rust take on displaying device status changes as notifications: github.com/balsoft/simple-osd-daemons/…/main.rs .

Both are also long and hacky