Wechseln Sie automatisch zwischen internen und HDMI-Lautsprechern

18

Wissen Sie, wie beim Anschließen von Kopfhörern an die AUX-Buchse Ihres Laptops die internen Lautsprecher automatisch stummgeschaltet werden und der Ton über Ihre Kopfhörer ausgegeben wird? Ich möchte genau das für HDMI.

Manchmal schließe ich einen Monitor mit eingebauten Lautsprechern an meinen Laptop an, um Videos anzusehen. Es ist sehr seltsam, wenn sich das Video auf dem Monitor befindet (der 3 m von meinem Schreibtisch entfernt ist), aber der Ton aus den internen Lautsprechern meines Laptops kommt (der Laptop sitzt auf dem Schreibtisch).

Natürlich kann ich einfach zu den Toneinstellungen gehen und den Ausgangskanal auf HDMI umschalten. Aber später, als ich vor einigen Stunden das HDMI-Kabel entfernt habe und möglicherweise sogar an einem anderen Ort war, wird der Ton nicht wiedergegeben, da der Soundserver immer noch versucht, ihn über HDMI abzuspielen, aber nichts daran angeschlossen ist .

Das automatische Zurückschalten auf die internen Lautsprecher, wenn kein Gerät über HDMI angeschlossen ist, ist wichtiger, aber das Umschalten auf die Tonausgabe über HDMI, wenn ein Gerät angeschlossen ist, wäre immer noch sehr schön.

Dies hat anscheinend mit 11.10 funktioniert, aber nicht mit 16.04.

UTF-8
quelle
Ein Tastenkürzel zum Umschalten des Sounds ist möglicherweise eine gute Lösung für Sie. Die zweite Antwort auf diesen Thread lautet
WinEunuuchs2Unix
Ich bin immer noch auf der Suche nach einer Lösung (am 16.04; keine der vorgeschlagenen Lösungen funktioniert). das problem wird auch im mint forum diskutiert .
Hiro Protagonist
@ Hiroprotagonist Ja, ich auch. Es scheint, dass die Antwort hier in den meisten Fällen funktioniert, aber nicht in allen.
UTF-8
Eigentlich hat das automatische Umschalten in Ubuntu 14.04 funktioniert, sofern dies nicht durch ein Update deaktiviert wurde.
BurninLeo
1
Möglicherweise wird beim Verbinden / Trennen die HDMI-Tonausgabe automatisch
Tom Brossman,

Antworten:

8

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, hotplugtvdas udev aufruft. Dasselbe Skript kann jedoch an vielen Stellen aufgerufen werden. Während des Tests habe ich es beispielsweise verwendet, lock-screen-timerwenn 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 rickdurch Ihre eigene Benutzer-ID ersetzen , dh UTF-8usw.

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.rulesin 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, rickdurch Ihren Benutzernamen zu ersetzen .

  • Die erste exportZeile ist wahrscheinlich nicht notwendig, aber ich habe sie nur zur Sicherheit eingefügt.
  • Wenn Sie mehrere Soundkarten oder etwas anderes als hdmi-stereoTweaks 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 -lum 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 card0zu card1und 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 card0und card1abhängig vom Start zu überarbeiten, überarbeiten Sie das Programm so, dass card*beide Szenarien erfasst werden .

WinEunuuchs2Unix
quelle
Ich kann nicht kopieren, 70-persistent-net.rulesweil es nicht existiert. /etc/udev/rules.denthält nur eine einzige Datei mit dem Namen 39-smfp_samsung.rules.
UTF-8
Na ja, kopieren Sie 30-smfp_samsung.rules, wir brauchen den Dateiinhalt nicht nur, um sicherzustellen, dass wir die richtigen Berechtigungen für unsere neue Datei haben. Kopieren einer vorhandenen Datei ist der einfachste Weg (für mich sowieso).
WinEunuuchs2Unix
1
Auf meinem System funktioniert es nicht. @ Person, die diese Antwort bereits hochgeladen hat: Funktioniert sie bei Ihnen? | Ich habe es zuerst ohne Neustart versucht, aber es hat nicht funktioniert. Es funktioniert auch nach dem Neustart nicht. Ich hatte HDMI getrennt und den Ton vor dem Neustart auf die internen Lautsprecher eingestellt. Nach dem Neustart habe ich Musik abgespielt und mein HDMI-Kabel angeschlossen. Die Musik kam immer noch (nur) aus den eingebauten Lautsprechern. Müssen Sie etwas anderes als die 2 Vorkommen des Benutzernamens ändern? cat /sys/class/drm/card0-HDMI-A-1/statuszeigt den korrekten Status an (ich habe es mehrmals versucht).
UTF-8
@ UTF-8 Ich habe einen neuen Abschnitt hinzugefügt, in dem Sie das Umschalten in der Befehlszeile testen können. Können Sie dies ausführen und sehen, ob bitte Fehler auftreten?
WinEunuuchs2Unix
Es scheint keine zu geben output:analog-stereo: pastebin.com/n5bHyhCm Dies macht es noch seltsamer, weil ich dann erwarten würde, dass der Ton immer über HDMI abgespielt wird. Screenshots meiner Toneinstellungen, wenn HDMI angeschlossen ist und wenn HDMI nicht angeschlossen ist . Bearbeiten: Ich habe es bereits versucht, aber es hat ein paar Minuten gedauert, bis ich diesen Kommentar gepostet habe, da ich die Screenshots hochladen musste.
UTF-8