Hintergrund
Ich hatte ein ähnliches Problem beim Anhalten / Fortsetzen, als der Ton von HDMI-Fernseher auf Laptop-Lautsprecher umgeschaltet wurde. Nach dem Fortsetzen würde der Ton auf den Laptop-Lautsprechern bleiben und ich müsste das Ausgabegerät manuell auf den TV-Eingang zurücksetzen System Settings
-> Sound
.
Dies war eine meiner ersten ärgerlichen Erfahrungen mit dem Upgrade von Ubuntu 14.04 auf 16.04, und der Root war das Upgrade auf PulseAudio 8, das mit 16.04 LTS geliefert wird
Nach langem Suchen habe ich ein Skript namens erstellt TV-sound
. Obwohl ich den Fernseher nicht wie Sie ein- und ausstecken kann, habe ich einige Google-Suchen durchgeführt und eine Variation des Skripts erstellt, um in Ihrer Situation zu funktionieren. Ich habe es getestet und es funktioniert.
Schritt 1: Erstellen Sie ein Skript, um Audio zwischen verbundenen Geräten umzuschalten
Wir werden ein Skript namens erstellen, hotplugtv
das udev aufruft. Dasselbe Skript kann jedoch an vielen Stellen aufgerufen werden. Während des Tests habe ich es beispielsweise verwendet, lock-screen-timer
wenn der Ton während der Bildschirmsperre wieder auf Laptop zurückgesetzt wurde.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Wenn der Editor mit einem leeren Bildschirm geöffnet wird, kopieren Sie Folgendes und fügen Sie es ein:
#! /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
Sie müssen die beiden Vorkommen von rick
durch Ihre eigene Benutzer-ID ersetzen , dh UTF-8
usw.
Ich weiß, dass dies professioneller sein kann, wenn der Benutzername automatisch auf eine Bash-Variable gesetzt wird, aber ich bin noch nicht so geschickt :( Wie auch immer, speichere die Datei und beende sie gedit
.
Schritt 2: Erstellen Sie udev-Regeln
udev überwacht Hotplug-Ereignisse, wenn Sie Ihren HDMI-Monitor ein- und ausstecken. Geben Sie Folgendes ein, um eine neue Regel zu erstellen.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
HINWEIS: Wenn die Datei 70-persistent-net.rules
in Ihrem Verzeichnis nicht vorhanden ist, kopieren Sie dort eine andere Datei. Wir brauchen nicht den Dateiinhalt, sondern nur die Dateiberechtigungen, um sicherzustellen, dass unsere identisch sind.
Der Editor zeigt eine Reihe irrelevanter Texte an, hebt sie hervor und löscht sie. Markieren Sie dann den folgenden Code und fügen Sie ihn in den Editor ein:
# 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"
Speichern Sie die Datei und beenden Sie sie.
Um die Regel (ohne Neustart) zu aktivieren, müssen wir udev neu laden:
sudo udevadm control --reload-rules
Jetzt können Sie Ihren HDMI-Monitor / Fernseher anschließen und entfernen, und der Ton wird entsprechend umgeschaltet.
Vorbehalt
Auf meinem System wird der Ton automatisch auf die Laptop-Lautsprecher zurückgesetzt, wenn der HDMI-Stecker abgezogen wird. Auf deinem System hat es nicht geklappt. Weitere Verbesserungen des Codes sind möglicherweise erforderlich, wenn die Lautsprecher Ihres Laptops nicht mit Ton versorgt werden, wenn HDMI nicht angeschlossen ist. Bitte antworten Sie per Kommentar unten, wie die Dinge funktionieren / nicht funktionieren.
Schnelles Testen in CLI
Sie können den Code am Terminal schnell testen, indem Sie Folgendes verwenden:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Wechseln Sie zu HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Wechseln Sie zurück zu den eingebauten Lautsprechern:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
Denken Sie daran, rick
durch Ihren Benutzernamen zu ersetzen .
- Die erste
export
Zeile ist wahrscheinlich nicht notwendig, aber ich habe sie nur zur Sicherheit eingefügt.
- Wenn Sie mehrere Soundkarten oder etwas anderes als
hdmi-stereo
Tweaks haben, müssen Sie natürlich die richtigen Parameter herausfinden, bevor Sie Ihr Skript schreiben.
Entschlüsseln Sie Ihren Gerätenamen in PulseAudio
Der folgende Code verwendet denselben Befehl zweimal. Einmal, wenn der Ton auf einen externen HDMI-Fernseher eingestellt ist. Ein zweites Mal, wenn der Ton auf die eingebauten Lautsprecher des Laptops eingestellt wird. Jedes Mal, wenn Sie den Namen sehen, verwendet PulseAudio:
$ 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>
Wenn Sie mehrere Soundkarten haben
Verwenden Sie den Befehl, aplay -l
um festzustellen, ob Sie Karten mit einer höheren Nummer als 0 haben. In diesem Fall müssen Sie die entsprechende Kartennummer in Ihren Skripten verwenden. Beispielsweise:
$ 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
Im obigen Beispiel sind alle Kartennummern 0 mit unterschiedlichen Ausgabequellen. Wenn Sie USB-Lautsprecher haben, können diese eine andere Kartennummer als 0 haben.
Bearbeiten 2. Dezember 2016
Aus einem unbekannten Grund wurde das Skript heute gebrochen. Above - Code verwendet zu lesen: "$ (cat / sys / class / drm / card0-HDMI-A-1 / Status" aber ich musste ändern card0
zu card1
und der Code oben ist als solche überarbeitet ich nicht erklären kann , was sich geändert. auf meinem System außer den regulären Ubuntu-Updates seit dem 26. November 2016.
Bearbeiten 14. Dezember 2016
Der obige Code musste wieder auf "$ (cat / sys / class / drm / card0-HDMI-A-1 / status" zurückgeschaltet werden. Anstatt den Code zwischen card0
und card1
abhängig vom Start zu überarbeiten, überarbeiten Sie das Programm so, dass card*
beide Szenarien erfasst werden .