Contexte
J'ai eu un problème similaire pendant la suspension / reprise lorsque le son passait du téléviseur HDMI aux haut-parleurs d'un ordinateur portable. À la reprise, le son resterait sur les haut-parleurs de l'ordinateur portable et je devrais réinitialiser manuellement le périphérique de sortie sur le téléviseur dans System Settings
-> Sound
.
Ce fut l'une de mes premières expériences ennuyeuses avec la mise à niveau d' Ubuntu 14.04 vers 16.04 et la racine a été mise à niveau vers PulseAudio 8 fourni avec 16.04 LTS
Après de nombreuses recherches, j'ai créé un script appelé TV-sound
. Bien que je ne branche et ne débranche pas le téléviseur comme vous, j'ai fait des recherches sur Google et créé une variante du script pour fonctionner dans votre situation. Je l'ai testé et ça marche.
Étape 1: créer un script pour basculer l'audio entre les appareils connectés
Nous allons créer un script appelé hotplugtv
que udev appelle. Ce même script peut être appelé à de nombreux endroits. Par exemple, pendant les tests, je l'ai utilisé dans lock-screen-timer
un environnement où le son revenait à l'ordinateur portable pendant le verrouillage de l'écran.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Lorsque l'éditeur s'ouvre avec un écran vide, copiez et collez ce qui suit dans celui-ci:
#! /bin/bash
# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
# so use /sys/class/dmcard* instead.
if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
# log-file "HDMI TV connected" ~/bin/log-hotplugtv;
/bin/sleep 2;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
# log-file "HDMI TV disconnected" ~/bin/log-hotplugtv;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi
exit 0
Vous devrez remplacer les deux occurrences de rick
par votre propre identifiant utilisateur, c'est UTF-8
-à- dire , etc.
Je sais que cela peut être plus professionnel avec un nom d'utilisateur défini automatiquement sur une variable bash, mais je ne suis pas encore compétent :( Quoi qu'il en soit, enregistrez le fichier et quittez gedit
.
Étape 2: créer des règles udev
udev surveille les événements de connexion à chaud lorsque vous branchez et débranchez votre moniteur HDMI. Tapez ce qui suit pour créer une nouvelle règle.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
REMARQUE: si le fichier 70-persistent-net.rules
n'existe pas dans votre répertoire, copiez-y tout autre fichier. Nous n'avons pas besoin du contenu du fichier, juste des autorisations de fichier pour nous assurer que les nôtres sont les mêmes.
L'éditeur affichera un tas de texte non pertinent, le mettra en surbrillance et le supprimera. Mettez ensuite en surbrillance le code ci-dessous et collez-le dans l'éditeur:
# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/hotplugtv"
Enregistrez le fichier et quittez.
Pour activer la règle (sans redémarrer), nous devons recharger udev:
sudo udevadm control --reload-rules
Vous pouvez maintenant brancher et débrancher votre moniteur / téléviseur HDMI et les commutateurs sonores de manière appropriée.
Caveat
Sur mon système, le son revient automatiquement aux haut-parleurs de l'ordinateur portable lorsque HDMI est débranché. Sur votre système, ce n'était pas le cas. D'autres améliorations du code peuvent être nécessaires si le son ne parvient pas aux haut-parleurs de votre ordinateur portable lorsque HDMI est débranché. Veuillez répondre via un commentaire ci-dessous comment les choses fonctionnent / ne fonctionnent pas.
Test rapide en CLI
Vous pouvez rapidement tester le code sur le terminal en utilisant:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Passer à HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Revenez aux haut-parleurs intégrés:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
N'oubliez pas de remplacer rick
par votre nom d'utilisateur.
- La
export
ligne initiale n'est probablement pas nécessaire mais je l'ai incluse juste pour être sûre.
- Si vous avez plusieurs cartes son, ou autre chose que des
hdmi-stereo
ajustements sont évidemment nécessaires pour trouver les paramètres corrects avant d'écrire votre script.
Déchiffrer le nom de votre appareil dans PulseAudio
Le code ci-dessous utilise deux fois la même commande. Une fois lorsque le son est réglé sur un téléviseur HDMI externe. Une deuxième fois lorsque le son est réglé sur les haut-parleurs intégrés de l'ordinateur portable. Chaque fois que vous voyez le nom que PulseAudio utilise:
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 28
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 30
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
Lorsque vous avez plusieurs cartes son
Utilisez la commande aplay -l
pour voir si vous avez des cartes supérieures au numéro 0. Si c'est le cas, vous devrez utiliser le numéro de carte approprié dans vos scripts. Par exemple:
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: 92HD91BXX Analog [92HD91BXX Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 0/1
Subdevice #0: subdevice #0
Dans l'exemple ci-dessus, tous les numéros de carte sont 0 avec différentes sources de sortie. Si vous avez des haut-parleurs USB, ils peuvent avoir un numéro de carte différent de 0.
Modifier le 2 décembre 2016
Pour une raison inconnue, le script a été cassé aujourd'hui. Le code ci-dessus se lisait: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status" mais j'ai dû changer card0
pour card1
et le code ci-dessus a été révisé en tant que tel. Je ne peux pas expliquer ce qui a changé sur mon système autre que les mises à jour régulières d'Ubuntu depuis le 26 novembre 2016.
Modifier le 14 décembre 2016
Le code ci-dessus devait être à nouveau changé en: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Au lieu de réviser le code entre card0
et en card1
fonction du démarrage, révisez le programme pour faire référence card*
afin de capturer les deux scénarios .