Passer à l'audio HDMI lorsque HDMI est branché sur un ordinateur portable (14.04)

12

J'essaie d'obtenir mon ordinateur portable pour basculer l'audio sur HDMI lorsqu'il est branché, et revenir à l'analogue standard lorsqu'il est retiré.

J'ai mis en place une règle udev pour déclencher un script pour effectuer la commutation, mais j'ai des problèmes pour le faire fonctionner:

  • Il semble que jusqu'à ce que je sélectionne la sortie audio HDMI dans les paramètres audio, elle n'est pas reconnue comme un récepteur disponible, également 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 donne une erreur sur aucun tel récepteur lorsque je le déclenche avant de sélectionner HDMI dans les paramètres sonores.

Kingamajick
la source

Réponses:

9
  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 le récepteur par défaut et le déplacement des flux

    pactl [options] set-card-profile  CARD PROFILE
    

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

Référence:

pactl -h & man pactl

user.dz
la source
9

Basé sur ce lien et ce lien ... j'ai testé et FONCTIONNE BIEN ubuntu 14.04

vous devez 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 votre 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 peut aider .. désolé pour mon anglais je parlais espagnol

Sk.
la source
4

J'ai eu un peu de mal à suivre ça. 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: /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

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

Joe
la source
1
Cela ne fonctionne pas en 16.04. J'y travaille encore.
Joe
3

Les scripts fournis ne fonctionnaient pas pour moi avec udev prêt à l'emploi sur Ubuntu 14.04, j'ai dû ajouter:

export DISPLAY=:0

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

#!/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
la source
2

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

(note: vous devez installer le paquet appindicator premier: sudo apt-get install python-appindicator)

Je pensais juste laisser cela ici pour d'autres qui pourraient être dans la même situation que moi, même si c'est une solution alternative ... mais cela rend les choses assez faciles et discrètes ;-)

Nat Azodnem
la source
0

Encore une autre solution (testée fonctionnant en 16.04) basée sur la précédente mais avec quelques améliorations qui fonctionnent en pactlpointant correctement vers le bon serveur (elle peut être améliorée pour obtenir automatiquement les noms des cartes et des profils, reportez-vous à pactl listou pactl infopour l'instant).

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

L' essentiel est ici .

Treviño
la source
J'avais un script similaire qui fonctionnait, card0mais un jour, il est passé à card1donc j'ai changé le script puis le lendemain, il est revenu card0. Finalement, j'ai changé le code en card*et tout va bien depuis. Juste un avertissement si quelque chose de similaire vous arrive.
WinEunuuchs2Unix
0

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, elle vous montrera le gestionnaire d'affichage. Il pourrait s'agir de 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 (Ce sera utilisé par le script)

Voici à quoi doit ressembler votre script:

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

LinuxHelper
la source