aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/home/.local/bin/automute
diff options
context:
space:
mode:
Diffstat (limited to 'home/.local/bin/automute')
-rwxr-xr-xhome/.local/bin/automute123
1 files changed, 123 insertions, 0 deletions
diff --git a/home/.local/bin/automute b/home/.local/bin/automute
new file mode 100755
index 0000000..20b04f4
--- /dev/null
+++ b/home/.local/bin/automute
@@ -0,0 +1,123 @@
+#!/usr/bin/env sh
+
+pid_file="/tmp/automutepid"
+
+pid_exists() {
+ test -r "$pid_file"
+}
+
+is_running() {
+ if pid_exists; then
+ ps "$(cat "$pid_file")" >/dev/null 2>&1 || return 1
+ else
+ return 1
+ fi
+}
+
+mute() {
+ pw-cli set-param "$1" Props '{mute: true}'
+}
+
+unmute() {
+ pw-cli set-param "$1" Props '{mute: false}'
+}
+
+pid2index() {
+ pw-dump | jq --argjson targetid "$1" 'map(select(.info.props."application.process.id" == $targetid and .info.params.PropInfo != null)) | .[].id'
+}
+
+list_sink_input_ids() {
+ pw-dump | jq 'map(select(.info.params.PropInfo != null and .info.params.PropInfo[].id=="mute" and .info.props."application.process.id" != null)) | .[].id'
+}
+
+unmute_all() {
+ for i in $(list_sink_input_ids); do
+ unmute "$i"
+ done
+ exit
+}
+
+trap unmute_all INT TERM
+
+mute_all() {
+ for i in $(list_sink_input_ids); do
+ mute "$i"
+ done
+}
+
+do_automute() {
+ while :; do
+ focus_pid="$(xdotool getwindowfocus getwindowpid)"
+ if [ "$focus_pid" ] && [ "$unfocus_pid" != "$focus_pid" ]; then
+ focus_index=$(pid2index "$focus_pid")
+ if [ "$unfocus_pid" ]; then
+ unfocus_index=$(pid2index "$unfocus_pid")
+ fi
+ if [ "$focus_index" ]; then
+ if [ "$unfocus_index" ]; then
+ mute "$unfocus_index"
+ else
+ mute_all
+ fi
+ unmute "$focus_index"
+ unfocus_pid="$focus_pid"
+ fi
+ fi
+ sleep 0.25
+ done
+}
+
+start() {
+ do_automute &
+ echo "$!" >"$pid_file"
+ notify-send "Automute started!"
+}
+
+stop() {
+ pid_exists || exit 1
+ pid="$(cat "$pid_file")"
+ # kill with SIGTERM, allowing finishing touches.
+ kill "$pid"
+ # even after SIGTERM, ffmpeg may still run, so SIGKILL it.
+ sleep 3
+ is_running && kill -9 "$pid"
+ rm -f "$pid_file"
+ notify-send "Automute stopped!"
+}
+
+toggle() {
+ if is_running; then
+ echo "Stopping automute"
+ stop
+ else
+ echo "Starting automute"
+ start
+ fi
+ echo
+ status
+}
+
+status() {
+ if is_running; then
+ echo "Automuting is running with PID $(cat "$pid_file")"
+ else
+ echo "Automute inactive"
+ fi
+}
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ toggle)
+ toggle
+ ;;
+ status)
+ status
+ ;;
+ *)
+ toggle
+ ;;
+esac