web-dev-qa-db-fra.com

Passage en audio HDMI lorsque HDMI est branché sur un ordinateur portable (14.04)

J'essaie de forcer mon ordinateur portable à basculer l'audio vers HDMI lorsqu'il est branché, et de revenir à l'analogique standard lorsqu'il est supprimé.

J'ai configuré une règle udev pour déclencher un script afin d'effectuer le basculement, mais j'ai du mal à le faire fonctionner:

  • Il semble que tant que je n'ai pas sélectionné la sortie audio HDMI dans les paramètres de son, celui-ci ne soit pas reconnu comme un évier disponible. Même une fois que la sortie audio HDMI est sélectionnée, la sortie analogique n'est plus répertoriée.

Voir ci-dessous:

# 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

Le script que j'utilise pour basculer la sortie est le suivant:

#!/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

Le script indique une erreur concernant ce type de récepteur lorsque je le déclenche avant de sélectionner HDMI dans les paramètres audio.

12
Kingamajick
  1. Vérifier les cartes et profils disponibles

    pactl list cards
    
  2. Ajoutez la commande suivante au script pour modifier le profil avant de définir les flux de stockage et de transfert par défaut

    pactl [options] set-card-profile  CARD PROFILE
    

(Donc, pas besoin de changer manuellement les paramètres sonores)

Référence:

pactl -h & man pactl

9
user.dz

Basé dans ce lien et ceci lien ... j'ai testé et fonctionne bien Ubuntu 14.04

vous devriez créer une règle dans /etc/udev/rules.d/100-hdmi_sound.rules

avec ce contenu

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

puis créer

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

avec ton contenu

#!/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

J'espère pouvoir aider .. désolé pour mon anglais j'ai parlé espagnol

8
Sk.

J'ai eu un peu de difficulté à suivre cela. J'ai copié le script original et l'ai modifié comme suggéré et maintenant cela fonctionne.

Je l'inclus ici pour le rendre plus facile à utiliser pour quelqu'un d'autre.

#!/bin/bash
## From: https://askubuntu.com/questions/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

Maintenant, je voudrais juste le déclencher avec udev, mais je ne sais pas comment faire cela.

4
Joe

Les scripts fournis ne fonctionnaient pas pour moi avec udev prêt à l'emploi sous Ubuntu 14.04, je devais ajouter:

export DISPLAY=:0

au début, convertissez les deux commandes pacmd en pactl, puis exécutez le script en utilisant Sudo -s -u (utilisateur) à partir de la règle udev.

#!/bin/bash
## From: https://askubuntu.com/questions/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
3
Ken

Eh bien, tous les scripts fournis ne fonctionnaient pas pour moi (Ubuntu 16.04), mais j'ai trouvé cet indicateur d'application qui vous permet de modifier la sortie audio en un seul clic:

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

(Remarque: vous devez d'abord installer le package appindicator: Sudo apt-get install python-appindicator)

Je pensais que je laisserais ça ici à d'autres qui pourraient être dans la même situation que moi, même si c'est une solution alternative ... mais ça facilite les choses et c'est discret ;-)

2
Nat Azodnem

Encore une autre solution (testée dans la version 16.04) basée sur la version précédente mais avec quelques améliorations fonctionnant en utilisant le nom correct pactl pointant vers le bon serveur (il peut être amélioré pour obtenir automatiquement les noms des cartes et des profils, reportez-vous à pactl list ou pactl info).

#!/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

En relation Gist is here .

0
Treviño

Les scripts Udev s'exécutent en tant que root, mais vous devez également savoir quel gestionnaire d'affichage vous utilisez. Ces scripts devraient fonctionner, mais vous devez autoriser ce gestionnaire d’affichage à le faire.

Trouvez le DM que vous utilisez:

pgrep -a Xorg

Voir l'option -auth, il vous montrera le gestionnaire d'affichage. Cela pourrait être sddm ou lightdm dans les dernières versions d'Ubuntu.

Cette ligne doit être exportée en tant que variable XAUTHORITY, comme ceci:

ls /car/run/sddm*

par exemple, cela pourrait être une sortie valide:

/var/lib/mdm/:0.Xauth (Ceci sera utilisé par le script)

Voici comment votre script doit ressembler à:

#!/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

Cela permettra à votre gestionnaire d’affichage de modifier la sortie HDMI. Suivez les instructions pour créer les fichiers de règles udev et rendre le script exécutable.

0
LinuxHelper