btw i use nix
1#!/usr/bin/env bash
2
3sink_ids=($(pactl list short sinks | cut -f 1))
4sinks=($(pactl list short sinks | cut -f 2))
5
6default_sink=$(pactl info | sed -En 's/Default Sink: (.*)/\1/p')
7
8for i in "${!sinks[@]}"; do
9 if [[ "${sinks[$i]}" = "${default_sink}" ]]; then
10 break
11 fi
12done
13
14if [[ "$1" == "back" ]]; then
15 j=-1
16else
17 j=1
18fi
19
20prev_i=$i
21
22while true; do
23 i=$(((i+j)%${#sinks[@]}))
24 echo $i
25 if ! pactl list sinks | sed -n "/Sink #${sink_ids[$i]}/,\$p" | grep "\[Out\]" | head -n 1 | grep "not available"; then
26 pactl set-default-sink "${sinks[$i]}"
27 break
28 fi
29 # break if no other sink
30 if [ $prev_i -eq $i ]; then
31 break
32 fi
33done
34