#!/usr/bin/env bash get_default_sink_label() { # Get the ID of the default sink (output device) default_sink=$(wpctl status 2>/dev/null | awk '/Sinks:/,/Sources:/' | awk '/\*/ {print $3}' | tr -d '.') if [ -z "$default_sink" ]; then echo "No default audio output device found" exit 1 fi # Get the description or fallback to node.name device_name=$(wpctl inspect "$default_sink" 2>/dev/null | awk -F '"' '/node.description/ {print $2}') if [ -z "$device_name" ]; then device_name=$(wpctl inspect "$default_sink" 2>/dev/null | awk -F '"' '/node.name/ {print $2}') fi # Map known device names to labels case "$device_name" in "Starship/Matisse HD Audio Controller Analog Stereo") label="Speakers" ;; "Yeti Stereo Microphone Analog Stereo") label="Earphones" ;; *) label="$device_name" ;; esac # Output the label #echo "{\"text\":\"$label\",\"alt\":\"$device_name\"}" printf '{"text":"%s","alt":"%s"}\n' "$label" "$device_name" } get_default_sink_label pactl subscribe 2>/dev/null | while read -r line; do # Filter for default sink or node changes if echo "$line" | grep -qE "Event 'change' on sink #"; then # Overwrite previous output get_default_sink_label fi done