Umschalten auf HDMI-Audio, wenn HDMI an einen Laptop angeschlossen ist (14.04)

12

Ich versuche, meinen Laptop dazu zu bringen, den Ton nach dem Anschließen auf HDMI und nach dem Entfernen wieder auf Standardanalog umzustellen.

Ich habe eine udev-Regel eingerichtet, um ein Skript zum Durchführen des Wechsels auszulösen, aber ich habe Probleme, es zum Laufen zu bringen:

  • Es sieht so aus, als würde der HDMI-Audio-Ausgang nicht als verfügbare Senke erkannt, bis ich ihn in den Audio-Einstellungen auswähle. Sobald der HDMI-Audio-Ausgang ausgewählt ist, wird der analoge Ausgang nicht mehr aufgeführt.

Siehe unten:

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

Das Skript, mit dem ich die Ausgabe umschalte, sieht folgendermaßen aus:

#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Das Skript gibt einen Fehler über keine solche Senke aus, wenn ich es auslöse, bevor ich HDMI in den Toneinstellungen auswähle.

Kingamajick
quelle

Antworten:

9
  1. Suchen Sie nach verfügbaren Karten und Profilen

    pactl list cards
    
  2. Fügen Sie dem Skript den folgenden Befehl hinzu, um das Profil zu ändern, bevor Sie die Standardeinstellung für Senken und Verschieben von Streams festlegen

    pactl [options] set-card-profile  CARD PROFILE
    

(Sie müssen es also nicht manuell in den Soundeinstellungen umschalten.)

Referenz:

pactl -h & man pactl

user.dz
quelle
9

Basierend auf diesem Link und diesem Link ... habe ich getestet und funktioniert einwandfrei Ubuntu 14.04

Sie sollten eine Regel in erstellen /etc/udev/rules.d/100-hdmi_sound.rules

mit diesem Inhalt

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

dann erstelle

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

mit deinem Inhalt

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Ich hoffe, kann helfen ..sorry für mein Englisch, das ich Spanisch sprach

Sk.
quelle
4

Ich hatte ein bisschen Probleme damit. Ich habe das ursprüngliche Skript kopiert und wie vorgeschlagen geändert und jetzt funktioniert es.

Ich füge es hier ein, um es anderen leichter zu machen, es zu benutzen.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Jetzt möchte ich es nur mit udev auslösen, aber ich weiß nicht, wie ich das machen soll.

Joe
quelle
1
Dies funktioniert nicht in 16.04. Ich arbeite wieder dran.
Joe
3

Die bereitgestellten Skripte funktionierten mit udev out of the box unter Ubuntu 14.04 nicht. Ich musste hinzufügen:

export DISPLAY=:0

Konvertieren Sie zu Beginn die beiden pacmd-Befehle in pactl und führen Sie das Skript schließlich mit sudo -s -u (user) aus der udev-Regel aus.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi
Ken
quelle
2

Nun, alle bereitgestellten Skripte haben bei mir nicht funktioniert (Ubuntu 16.04), aber ich habe diese App-Anzeige gefunden, mit der Sie die Soundausgabe mit nur einem Klick ändern können:

https://github.com/lkettenb/sound-output-switcher

(Anmerkung: Sie müssen das appindicator Paket installieren zuerst: sudo apt-get install python-appindicator)

Ich dachte nur, ich lasse das hier für andere, die sich vielleicht in der gleichen Situation wie ich befinden, obwohl es eine alternative Lösung ist ... aber es macht es ziemlich einfach und diskret ;-)

Nat Azodnem
quelle
0

Wieder eine andere Lösung (getestet in 16.04), basierend auf der vorherigen, aber mit einigen Verbesserungen, die mit dem richtigen pactlHinweis auf den richtigen Server funktionieren (es kann verbessert werden, um automatisch die Namen der Karten und Profile abzurufen)pactl list oder pactl infofür jetzt).

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

export LANG=C
export PULSE_SERVER="unix:/run/user/$USER_ID/pulse/native"

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

Verwandte Kern ist hier .

Treviño
quelle
Ich hatte ein ähnliches Skript, das funktionierte, card0aber eines Tages wurde es auf umgestellt, card1sodass ich das Skript änderte und am nächsten Tag wieder auf card0. Am Ende habe ich den Code auf geändert card*und seitdem ist alles in Ordnung. Nur einen Kopf hoch, wenn dir etwas Ähnliches passiert.
WinEunuuchs2Unix
0

Udev-Skripte werden als root ausgeführt, Sie müssen jedoch auch wissen, welchen Anzeigemanager Sie verwenden. Diese Skripte sollten funktionieren, aber Sie müssen den Display Manager dazu berechtigen.

Finden Sie den DM, den Sie verwenden:

pgrep -a Xorg

Wenn Sie die Option -auth aktivieren, wird der Anzeigemanager angezeigt. Es könnte sich um sddm oder lightdm in den neuesten Ubuntu-Versionen handeln.

Diese Zeile muss wie folgt als XAUTHORITY-Variable exportiert werden:

ls /car/run/sddm*

Dies könnte beispielsweise eine gültige Ausgabe sein:

/var/lib/mdm/:0.Xauth (Wird vom Skript verwendet)

So muss Ihr Skript aussehen:

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

if [ "$HDMI_STATUS" = connected ];
then
    sudo -u $USER pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
exit 0

Dadurch kann Ihr Display-Manager den HDMI-Ausgang ändern. Befolgen Sie die Anweisungen, um die udev-Regeldateien zu erstellen und das Skript ausführbar zu machen.

LinuxHelper
quelle