summaryrefslogtreecommitdiff
path: root/.local/bin/audio_cyclesink
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/audio_cyclesink')
-rwxr-xr-x.local/bin/audio_cyclesink77
1 files changed, 77 insertions, 0 deletions
diff --git a/.local/bin/audio_cyclesink b/.local/bin/audio_cyclesink
new file mode 100755
index 0000000..52b2661
--- /dev/null
+++ b/.local/bin/audio_cyclesink
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# cycle between wireplumber(pipewire) audio sinks
+
+parse_sinks()
+{
+ isaudio=
+ isadsink=
+
+ while read -r line
+ do
+ case "$line" in
+ Audio)
+ isaudio=true
+ ;;
+ ├─\ Sinks:)
+
+ [ "$isaudio" = true ] &&
+ isadsink=true
+ ;;
+ ├─*:)
+ [ "$isadsink" = true ] &&
+ break
+ ;;
+ *)
+ # skip if not inside audio sink
+ [ "$isadsink" != true ] &&
+ continue
+
+ # skip "blank" lines
+ [ -z "${line#│}" ] &&
+ continue
+
+ # clean up input
+ line="${line#│ }"
+ line="${line%%.*}"
+
+ sinks="${sinks}${line}:"
+
+ ;;
+ esac
+ done
+
+ printf "%s" "${sinks%:}"
+ unset isaudio isadsink
+}
+
+cycle_sink()
+{
+ read -r sinks
+ default_sink=
+ next_sink=
+
+ IFS=:
+ for sink in $sinks
+ do
+ case "$sink" in
+ \**)
+ default_sink="${sinks#* }"
+ ;;
+ *)
+ if [ -n "$default_sink" ]
+ then
+ next_sink="${sink# }"
+ break
+ fi
+ ;;
+ esac
+ done
+
+ # if default sink is last one use first sink
+ : "${next_sink:="${sinks%%:*}"}"
+
+ wpctl set-default "$next_sink"
+}
+
+wpctl status | parse_sinks | cycle_sink