Encore un autre script de commutateur d'évier
testé sur Ubuntu 16.04
Mais celui-ci vous permet de basculer uniquement l'audio de l'application que vous souhaitez.
UTILISATION: Concentrez l'application dont vous souhaitez modifier le récepteur et exécutez ce script. C'est ça!!!
Ce script détecte l'application mise au point, recherche tous les fichiers audio en cours de lecture et les fait passer au récepteur disponible suivant.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Expliquer le script
Nous devons trouver le PID de l'application sur le focus
Mais d'abord, nous avons besoin du xid
xprop -root _NET_ACTIVE_WINDOW
Insérez-le ici $xid
pour obtenir le pid de l'application
xprop -id $xid _NET_WM_PID
Maintenant, nous devons trouver les entrées de puits liées à ce PID
Commençons par linéariser la sortie de la commande pacmd list-sink-inputs
pour répertorier une entrée de récepteur par ligne, en affichant son index, son récepteur et son pid sur la même ligne
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
analysons-le étape par étape:
grep -E 'index:|sink:|process.id
ne conserver que les lignes qui contiennent index:
, sink:
ouprocess.id
tr '\n' ' '
rejoint toutes les lignes
tr -d '"'
supprime tous les "
caractères. Nécessaire pour obtenir le pid sans guillemets
sed -e 's/index:/\n/g'
remplace toutes les index:
occurrences par un nouveau caractère de ligne\n
tail -n +2
supprime la première ligne car elle est vide
Et le résultat est quelque chose comme ceci:
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
Analysons une ligne pour comprendre ce que cela signifie:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
est l'indice récepteur-entrée, 0
est l'indice récepteur, et 13752
à la fin, est le pid de l'application d'appartenance
Ensuite, nous parcourons chaque ligne
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
Enfin, ne filtrez que le pid de l'entrée du récepteur qui correspond au pid de l'application ciblée
if [ $sink_input_pid = $app_pid ]; then
Extraire des données
Avec awk
nous pouvons obtenir les éléments dont nous avons besoin
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Obtenez le nombre de puits, pour savoir quand la rotation des puits doit redémarrer à partir de 0.
sink_list_size=${#sink_list_array[@]}
Pour trouver le prochain puits, nous devons parcourir la liste des puits, pour savoir lequel correspond à current_sink_index et connaître l'indice du prochain puits.
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
Et enfin, nous déplaçons l'entrée de l'évier pour jouer dans next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Remarque sur Ubuntu 16.04:
Lors de la configuration de la touche de raccourci, je n'ai pas pu le faire fonctionner avec le gestionnaire de raccourcis d'ubuntu. J'ai donc dû installer compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager