Cambiar a audio HDMI cuando HDMI está conectado a una computadora portátil (14.04)


12

Estoy tratando de hacer que mi computadora portátil cambie el audio a HDMI cuando está enchufado, y vuelva a ser analógico estándar cuando se quite.

Configuré una regla udev para activar un script para realizar el cambio, sin embargo, tengo problemas para que funcione:

  • Parece que hasta que seleccione la salida de audio HDMI en la configuración de sonido, no se reconoce como un receptor disponible, también una vez que se selecciona la salida de audio HDMI, la salida analógica ya no aparece en la lista.

Mira lo siguiente:

# 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

El script que estoy usando para alternar la salida es el siguiente:

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

El script da un error acerca de que no hay tal sumidero cuando lo disparo antes de seleccionar HDMI en la configuración de sonido.


Respuestas:


9
  1. Verifique las tarjetas y perfiles disponibles

    pactl list cards
    
  2. Agregue el siguiente comando al script para cambiar el perfil antes de configurar las transmisiones de sumidero y movimiento predeterminadas

    pactl [options] set-card-profile  CARD PROFILE
    

(Por lo tanto, no es necesario cambiarlo manualmente desde la Configuración de sonido)

Referencia:

pactl -h Y man pactl


9

Basado en este enlace y este enlace ... probé y FUNCIONA BIEN ubuntu 14.04

deberías crear una regla en /etc/udev/rules.d/100-hdmi_sound.rules

con este contenido

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

luego crea

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

con tu contenido

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

Espero poder ayudar ... lo siento por mi inglés hablé español


4

Tuve algunos problemas para seguir esto. Copié el guión original y lo modifiqué según lo sugerido y ahora funciona.

Lo incluyo aquí para que sea más fácil de usar para otra persona.

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

Ahora, me gustaría activarlo con udev, pero no tengo idea de cómo hacerlo.


1
Esto no funciona en 16.04. Estoy trabajando en eso otra vez.
Joe

3

Los scripts proporcionados no funcionaron para mí con udev listo para usar en Ubuntu 14.04, tuve que agregar:

export DISPLAY=:0

al principio, convierta los dos comandos pacmd a pactl y finalmente ejecute el script usando sudo -s -u (usuario) de la regla 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

2

Bueno, todos los scripts proporcionados no funcionaron para mí (Ubuntu 16.04), pero encontré este indicador de aplicación que le permite cambiar la salida de sonido con solo un clic:

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

(nota: es necesario instalar el paquete appindicator primero: sudo apt-get install python-appindicator)

Solo pensé en dejar esto aquí para otros que podrían estar en la misma situación que yo, a pesar de que es una solución alternativa ... pero lo hace bastante fácil y es discreto ;-)


0

Una vez más, otra solución (probada en 16.04) basada en la anterior pero con algunas mejoras que funciona con la pactlorientación adecuada al servidor correcto (se puede mejorar para obtener automáticamente los nombres de las tarjetas y los perfiles, consulte pactl listo pactl infopor ahora).

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

La esencia relacionada está aquí .


Tenía un script similar que funcionaba, card0pero un día se cambió a card1modo que cambié el script y al día siguiente volvió a cambiar card0. Al final cambié el código a card*y todo está bien desde entonces. Solo un aviso si algo similar te sucede.
WinEunuuchs2Unix

0

Los scripts Udev se ejecutan como root, pero también debe saber qué administrador de pantalla está utilizando. Estas secuencias de comandos deberían funcionar, pero debe autorizar a este administrador de pantalla para que lo haga.

Encuentra el DM que estás usando:

pgrep -a Xorg

Vea la opción -auth, le mostrará el administrador de pantalla. Podría ser sddm ou lightdm en las últimas versiones de Ubuntu.

Esta línea debe exportarse como variable XAUTHORITY, como esta:

ls /car/run/sddm*

por ejemplo, esto podría ser una salida válida:

/var/lib/mdm/:0.Xauth (Esto será utilizado por el script)

Así es como debe verse su 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

Esto permitirá que su administrador de pantalla cambie la salida HDMI. Siga las instrucciones para crear los archivos de reglas de udev y hacer que el script sea ejecutable.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.