Basculer automatiquement entre les haut-parleurs internes et HDMI


18

Vous savez comment lorsque vous branchez un casque dans la prise auxiliaire de votre ordinateur portable, les haut-parleurs internes sont automatiquement coupés et les sons sortent de votre casque? Je veux exactement ça pour HDMI.

Je connecte parfois un moniteur avec des haut-parleurs intégrés à mon ordinateur portable pour regarder des vidéos. C'est très bizarre lorsque la vidéo est sur le moniteur (qui est placé à 3 m de mon bureau) mais le son sort des haut-parleurs internes de mon ordinateur portable (l'ordinateur portable est assis sur le bureau).

Bien sûr, je peux simplement accéder aux paramètres sonores et basculer le canal de sortie sur HDMI. Mais ensuite, plus tard, lorsque j'ai retiré le câble HDMI il y a des heures et qu'il pourrait même se trouver dans un endroit totalement différent, le son ne sera pas lu car le serveur de son tente toujours de le lire via HDMI mais il n'y a rien de connecté .

Le retour automatique aux haut-parleurs internes quand aucun appareil n'est connecté via HDMI est plus important mais passer à la sortie audio via HDMI lorsqu'un appareil est connecté serait toujours très agréable.

Cela a apparemment fonctionné avec 11.10 mais cela ne fonctionne pas avec 16.04.


Avoir une touche de raccourci pour basculer le son peut être une bonne solution pour vous. La deuxième réponse sur ce fil fait cela: askubuntu.com/questions/41858/…
WinEunuuchs2Unix

je suis toujours à la recherche d'une solution à cela aussi (le 16.04; aucune des solutions suggérées ne fonctionne). le problème est également discuté dans le forum de la menthe .
hiro protagoniste

@hiroprotagoniste Oui, moi aussi. Il semble que la réponse ici fonctionne dans la plupart des cas mais pas dans tous.
UTF-8

En fait, la commutation automatique fonctionnait dans Ubuntu 14.04, sauf si cela avait été désactivé par une mise à jour.
BurninLeo

Réponses:


8

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é hotplugtvque udev appelle. Ce même script peut être appelé à de nombreux endroits. Par exemple, pendant les tests, je l'ai utilisé dans lock-screen-timerun 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 rickpar 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.rulesn'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 rickpar votre nom d'utilisateur.

  • La exportligne 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-stereoajustements 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 -lpour 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 card0pour card1et 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 card0et en card1fonction du démarrage, révisez le programme pour faire référence card*afin de capturer les deux scénarios .


Je ne peux pas copier 70-persistent-net.rulescar il n'existe pas. /etc/udev/rules.dne contient qu'un seul fichier appelé 39-smfp_samsung.rules.
UTF-8

Eh bien, copiez 30-smfp_samsung.rules, nous n'avons pas besoin du contenu du fichier uniquement pour nous assurer que nous avons les bonnes autorisations pour notre nouveau fichier. La copie d'un fichier existant est le moyen le plus simple (pour moi en tout cas).
WinEunuuchs2Unix

1
Cela ne fonctionne pas sur mon système. @ Personne qui a déjà voté pour cette réponse: cela fonctionne-t-il sur vous? | J'ai d'abord essayé sans redémarrer mais cela n'a pas fonctionné. Il ne fonctionne pas non plus après le redémarrage. J'ai déconnecté HDMI et réglé le son sur les haut-parleurs internes avant de redémarrer. Après le redémarrage, j'ai joué de la musique et connecté mon câble HDMI. La musique sortait (seulement) des haut-parleurs intégrés. Devez-vous changer autre chose que les 2 occurrences du nom d'utilisateur? cat /sys/class/drm/card0-HDMI-A-1/statusmontre le bon état (j'ai essayé plusieurs fois).
UTF-8

@ UTF-8 J'ai ajouté une nouvelle section où vous pouvez tester la commutation sur la ligne de commande. Pouvez-vous l'exécuter et voir si des erreurs surviennent, s'il vous plaît?
WinEunuuchs2Unix

Il ne semble pas y avoir output:analog-stereo: pastebin.com/n5bHyhCm Cela le rend encore plus étrange car je m'attendrais à ce que le son soit toujours lu via HDMI. Captures d'écran de mes paramètres sonores lorsque HDMI est connecté et lorsque HDMI n'est pas connecté . Edit: J'ai déjà essayé cela mais il m'a fallu quelques minutes de plus pour poster ce commentaire car j'ai dû télécharger les captures d'écran.
UTF-8
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.