J'ai un ordinateur portable avec une station d'accueil. Sur cette station d'accueil, je branche un casque audio + micro USB. Il m'arrive très souvent de débrancher cet ordinateur portable de sa station d'accueil. À chaque rebranchement, je suis obligé de refaire la configuration PulseAudio afin de définir mon casque et son micro comme périphérique de sortie et d'entrée. Ce n'est plus possible, il faut rendre ça automatique.
La méthode consistant à utiliser udev pour passer des commandes à PulseAudio via pamcmd
ou pactl
ne fonctionne plus. Avant, il suffisait de lancer un script udev qui se fork en arrière-plan, ce qui permettait à PulseAudio de continuer son déroulement, donc de détecter le matériel audio puis à notre script de passer des commandes PulseAudio concernant ce matériel. Désormais, au moins dans Debian Stretch, l'implémentation habituelle d'udev est remplacée par celle de systemd-udevd
. Ainsi, un fork (+ sleep) est désormais pris en compte par systemd-udevd et bloque la découverte du matériel par PulseAudio. Cela se constate avec sudo systemctl status udev.service
(on constate l'arborescence des processus sous systemd-udevd, dont notre sleep).
Passons à la méthode que j'utilise :
On crée le fichier ~/.config/pulse/default.pa
avec le contenu suivant :
.include /etc/pulse/default.pa
load-module module-switch-on-connect
pactl load-module module-switch-on-connect
;À partir d'ici, PulseAudio basculera automatiquement sur tout nouveau périphérique audio qui sera connecté. Le dernier périphérique audio branché à un instant T sera celui qui sera utilisé. En entrée comme en sortie. Or, mon dock monte aussi un périphérique audio (probablement lié au port HDMI). Si jamais cette interface monte après mon casque, PulseAudio l'utilisera. Nous allons empêcher cela via un script udev dans /usr/local/bin/headset-delay.sh
:
#!/bin/bash
logger -t /usr/local/bin/headset-delay.sh HEADSET ON
sleep 2
logger -t /usr/local/bin/headset-delay.sh HEADSET CONFIGURED
sudo chmod +x /usr/local/bin/headset-delay.sh
;On ajoute une règle udev qui exécute le script précédent dès que le casque est branché dans /etc/udev/rules.d/01-headset.rules
(les ID se trouvent dans /var/log/kern.log quand on branche le casque) :
ACTION=="add", ATTR{idVendor}=="1395", ATTR{idProduct}=="0029", RUN+="/usr/local/bin/headset-delay.sh"