Ancora un altro script Switcher lavello
testato su Ubuntu 16.04
Ma questo ti consente di cambiare solo l'audio dell'applicazione desiderata.
UTILIZZO: focalizzare l'applicazione che si desidera modificare il suo sink ed eseguire questo script. Questo è tutto!!!
Questo script rileva l'applicazione attiva, trova tutti gli audio in riproduzione e passa al successivo sink disponibile.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Spiegare la sceneggiatura
Dobbiamo trovare il PID dell'applicazione in primo piano
Ma prima abbiamo bisogno dello xid
xprop -root _NET_ACTIVE_WINDOW
Quindi inserirlo qui $xid
per ottenere il pid dell'applicazione
xprop -id $xid _NET_WM_PID
Ora dobbiamo trovare gli input del sink relativi a quel PID
Innanzitutto linearizziamo l'output del comando pacmd list-sink-inputs
per elencare un input di sink per riga, mostrando il suo indice, sink e pid sulla stessa riga
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
analizziamolo passo dopo passo:
grep -E 'index:|sink:|process.id
mantieni solo le righe che contengono index:
, sink:
oprocess.id
tr '\n' ' '
unisce tutte le linee
tr -d '"'
rimuove tutti i "
personaggi. Necessario per ottenere il pid senza virgolette
sed -e 's/index:/\n/g'
sostituisce tutte le index:
occorrenze con un nuovo carattere di riga\n
tail -n +2
rimuove la prima riga perché è vuota
E il risultato è qualcosa del genere:
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
Analizziamo una riga per capire cosa significa:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
è l'indice di input del sink, 0
è l'indice di sink e 13752
alla fine è il pid dell'applicazione di appartenenza
Quindi ripetiamo ogni riga
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
E infine filtra solo il pid dell'input del sink che corrisponde al pid dell'app focalizzata
if [ $sink_input_pid = $app_pid ]; then
Estrazione dei dati
Con awk
possiamo ottenere gli elementi di cui abbiamo bisogno
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Ottieni il numero di lavandini, per sapere quando la rotazione dei lavandini dovrebbe ricominciare da 0.
sink_list_size=${#sink_list_array[@]}
Per trovare il prossimo sink, dobbiamo scorrere l'elenco dei sink, per sapere quale corrisponde a current_sink_index e per conoscere l'indice del sink successivo.
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
E infine, spostiamo l'input sink per giocare in next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Nota su Ubuntu 16.04:
Quando si configura il tasto di scelta rapida, non sono riuscito a farlo funzionare con il gestore dei collegamenti di Ubuntu. Quindi ho dovuto installare compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager