summaryrefslogtreecommitdiff
path: root/.local/bin/audio_cyclesink
diff options
context:
space:
mode:
authorsinanmohd <pcmsinan@gmail.com>2023-03-17 11:42:54 +0530
committersinanmohd <pcmsinan@gmail.com>2023-03-17 11:43:26 +0530
commit4f06cc87a2a26b3f7be22268f095c00c88bf49f9 (patch)
tree6401008bada71f5622af6486de8dcf3afeef0d29 /.local/bin/audio_cyclesink
parentaa10491d42c08cf624ca217a84a6f9f614e54e41 (diff)
audio_cyclesink, audio_mutemic: initial commit
mute mic and cycle between wireplumber(pipewire) audio sinks
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