Noch ein Sink Switcher Script
Getestet auf Ubuntu 16.04
Mit dieser Option können Sie jedoch nur das Audio der gewünschten Anwendung umschalten.
VERWENDUNG: Konzentrieren Sie sich auf die Anwendung, deren Senke Sie ändern möchten, und führen Sie dieses Skript aus. Das ist es!!!
Dieses Skript erkennt die Anwendung, die im Fokus steht, findet alle wiedergegebenen Audios und schaltet sie auf die nächste verfügbare Senke um.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Das Drehbuch erklären
Wir müssen die PID der Anwendung im Fokus finden
Aber zuerst brauchen wir die XID
xprop -root _NET_ACTIVE_WINDOW
Dann fügen Sie es hier ein $xid
, um die PID der Anwendung zu erhalten
xprop -id $xid _NET_WM_PID
Jetzt müssen wir die mit dieser PID verbundenen Senkeneingänge finden
Lassen Sie uns zuerst die Ausgabe des Befehls linearisieren, pacmd list-sink-inputs
um eine Senken-Eingabe pro Zeile aufzulisten, wobei der Index, die Senke und die PID in derselben Zeile angezeigt werden
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
Lassen Sie es uns Schritt für Schritt analysieren:
grep -E 'index:|sink:|process.id
nur halten Linien , die enthalten index:
, sink:
oderprocess.id
tr '\n' ' '
verbindet alle Zeilen
tr -d '"'
Entfernt alle "
Zeichen. Notwendig, um die PID ohne Anführungszeichen zu erhalten
sed -e 's/index:/\n/g'
Ersetzt alle index:
Vorkommen durch ein neues Zeilenzeichen\n
tail -n +2
Entfernt die erste Zeile, weil sie leer ist
Und das Ergebnis ist ungefähr so:
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
Analysieren wir eine Zeile, um zu verstehen, was dies bedeutet:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
ist der Senken-Eingabe-Index, 0
ist der Senken-Index und ist 13752
am Ende die PID der zugehörigen Anwendung
Dann durchlaufen wir jede Zeile
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
Und schließlich filtern Sie nur die PID der Senke-Eingabe, die mit der PID der fokussierten App übereinstimmt
if [ $sink_input_pid = $app_pid ]; then
Daten extrahieren
Mit können awk
wir die Elemente bekommen, die wir brauchen
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Holen Sie sich die Anzahl der Spülen, um zu wissen, wann die Drehung der Spülen von 0 an wieder aufgenommen werden soll.
sink_list_size=${#sink_list_array[@]}
Um die nächste Senke zu finden, müssen wir die Liste der Senken durchlaufen, um zu wissen, welche mit current_sink_index übereinstimmt, und um den Index der nächsten Senke zu kennen.
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
Und schließlich verschieben wir den Sink-Input, um in next_sink_index zu spielen
pacmd move-sink-input $sink_input_index $next_sink_index
Hinweis zu Ubuntu 16.04:
Bei der Konfiguration der Tastenkombination konnte ich nicht dafür sorgen, dass sie mit dem Verknüpfungsmanager von Ubuntu funktioniert. Also musste ich compizconfig-settings-manager installieren
sudo apt-get install compizconfig-settings-manager