Yet Another Sink Switcher Script
testowany na Ubuntu 16.04
Ale ten pozwala przełączać tylko dźwięk aplikacji, którą chcesz.
UŻYTKOWANIE: Skoncentruj aplikację, którą chcesz zmienić, i uruchom ten skrypt. Otóż to!!!
Ten skrypt wykrywa aktywną aplikację, znajduje wszystkie odtwarzane z niej pliki audio i przełącza je na następny dostępny zlew.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Wyjaśnienie skryptu
Musimy znaleźć PID aplikacji w centrum uwagi
Ale najpierw potrzebujemy xid
xprop -root _NET_ACTIVE_WINDOW
Następnie włóż go tutaj, $xid
aby uzyskać identyfikator aplikacji
xprop -id $xid _NET_WM_PID
Teraz musimy znaleźć wejścia do ujścia związane z tym PID
Najpierw zlinearyzujmy wynik polecenia, pacmd list-sink-inputs
aby wyświetlić jeden wejściowy obiekt sink w wierszu, pokazując jego indeks, obiekt sink i pid w tym samym wierszu
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
przeanalizujmy to krok po kroku:
grep -E 'index:|sink:|process.id
tylko utrzymać linie, które zawierają index:
, sink:
lubprocess.id
tr '\n' ' '
łączy wszystkie linie
tr -d '"'
usuwa wszystkie "
postacie. Niezbędne, aby uzyskać pid bez cytatów
sed -e 's/index:/\n/g'
zastępuje wszystkie index:
wystąpienia nowym znakiem wiersza\n
tail -n +2
usuwa pierwszy wiersz, ponieważ jest pusty
Rezultat jest mniej więcej taki:
180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
Przeanalizujmy jedną linię, aby zrozumieć, co to znaczy:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
jest indeksem wejścia-ujścia, 0
jest indeksem ujścia, a 13752
na końcu jest pid odpowiedniej aplikacji
Następnie iterujemy każdą linię
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
I na koniec filtruj tylko pid wejścia wejścia do zlewu, który odpowiada pidowi skoncentrowanej aplikacji
if [ $sink_input_pid = $app_pid ]; then
Wyodrębnianie danych
Dzięki awk
możemy uzyskać potrzebne elementy
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Uzyskaj liczbę zlewów, aby wiedzieć, kiedy obrót zlewów powinien rozpocząć się od 0.
sink_list_size=${#sink_list_array[@]}
Znajdując następny zlew, musimy iterować listę zlewów, aby wiedzieć, który z nich pasuje do current_sink_index i znać indeks następnego zlewu.
i=0
for sink in "${sink_list_array[@]}"; do
i=$((($i+1)%sink_list_size)) # i++ mod(#sinks)
if [ $sink = $current_sink_index ]; then
next_sink_index=${sink_list_array[i]}
break
fi
done
I na koniec, przesuwamy wejście sink do play in next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Uwaga na temat Ubuntu 16.04:
Podczas konfigurowania klawisza skrótu nie mogłem go uruchomić z menedżerem skrótów ubuntu. Musiałem więc zainstalować compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager