#!/usr/bin/env bash set -Eeuo pipefail source_ids=() current_index=-1 while IFS=$'\t' read -r id is_default; do [[ -n "$id" ]] || continue source_ids+=("$id") [[ "$is_default" == true ]] && current_index=$((${#source_ids[@]} - 1)) done < <( wpctl status -n | awk ' /^Audio$/ {in_audio = 1; next} /^Video$/ {in_audio = 0; in_sources = 0} in_audio && /Sources:/ {in_sources = 1; next} /Filters:/ {in_sources = 0} in_audio && in_sources && match($0, /[0-9]+\./) { id = substr($0, RSTART, RLENGTH - 1) print id "\t" (index($0, "*") ? "true" : "false") } ' ) ((${#source_ids[@]} > 0)) || exit 0 next_index=$(((current_index + 1) % ${#source_ids[@]})) next_source_id="${source_ids[$next_index]}" wpctl set-default "$next_source_id" source_name=$( wpctl inspect "$next_source_id" \ | awk -F' = ' '/node.nick/ {gsub(/^"|"$/, "", $2); print $2; exit}' ) [[ -n "$source_name" ]] || source_name="Input $next_source_id" notify-send -a Waybar -u low -r 9102 "Audio input changed" "$source_name"