#!/bin/bash until pactl info &>/dev/null; do sleep 0.5 done sleep 3 WOB_SOCK="${XDG_RUNTIME_DIR}/wob.sock" prev_vol="" prev_muted="" get_vol() { pactl get-sink-volume @DEFAULT_SINK@ 2>/dev/null | grep -oP '\d+(?=%)' | head -1 } get_muted() { pactl get-sink-mute @DEFAULT_SINK@ 2>/dev/null | grep -q yes && echo 1 || echo 0 } pactl subscribe 2>/dev/null | grep --line-buffered "^Event 'change' on sink #" | while read -r _; do # First read vol1=$(get_vol) muted1=$(get_muted) # Wait and read again — if still changing (app connecting) the values won't match sleep 0.25 vol2=$(get_vol) muted2=$(get_muted) # Skip if unstable [ "$vol1" != "$vol2" ] || [ "$muted1" != "$muted2" ] && continue # Skip if nothing changed from last shown value [ "$vol2" = "$prev_vol" ] && [ "$muted2" = "$prev_muted" ] && continue prev_vol="$vol2" prev_muted="$muted2" if [ "$muted2" = "1" ]; then echo 0 > "$WOB_SOCK" else echo "$vol2" > "$WOB_SOCK" fi done