Antecedentes
Tuve un problema similar durante la suspensión / reanudación cuando el sonido cambiaba de TV HDMI a altavoces portátiles. Al reanudar el sonido permanecería en los altavoces de la computadora portátil y tendría que restablecer manualmente el dispositivo de salida a TV en System Settings
-> Sound
.
Esta fue una de mis primeras experiencias molestas con la actualización de Ubuntu 14.04 a 16.04 y la raíz fue actualizar a PulseAudio 8 que viene con 16.04 LTS
Después de mucho buscar, creé un script llamado TV-sound
. Aunque no enchufo ni desconecto el televisor como usted, hice algunas búsquedas en Google y creé una variación del guión para que funcione en su situación. Lo he probado y funciona.
Paso 1: crea un script para cambiar el audio entre dispositivos conectados
Crearemos un script llamado hotplugtv
que udev llama. Sin embargo, este mismo script se puede llamar en muchos lugares. Por ejemplo, durante las pruebas lo usé en lock-screen-timer
donde el sonido volvió a la computadora portátil durante el bloqueo de pantalla.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Cuando el editor se abre con una pantalla en blanco, copie y pegue lo siguiente en él:
#! /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
Deberá reemplazar las dos ocurrencias de rick
con su propia identificación de usuario, es decirUTF-8
, etc.
Sé que esto puede ser más profesional con el nombre de usuario configurado automáticamente en una variable bash, pero aún no soy tan hábil :( De todos modos, guarde el archivo y salga gedit
.
Paso 2: crear reglas de udev
udev monitorea los eventos de conexión en caliente cuando conecta y desconecta su monitor HDMI. Escriba lo siguiente para crear una nueva regla.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
NOTA: Si el archivo 70-persistent-net.rules
no existe en su directorio, copie cualquier otro archivo allí. No necesitamos el contenido del archivo, solo los permisos del archivo para garantizar que el nuestro sea el mismo.
El editor mostrará un montón de texto irrelevante, lo resaltará y lo eliminará. Luego resalte el código a continuación y péguelo en el editor:
# 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"
Guarda el archivo y cierra.
Para habilitar la regla (sin reiniciar) necesitamos volver a cargar udev:
sudo udevadm control --reload-rules
Ahora puede conectar y desconectar su monitor / TV HDMI y el sonido cambiará adecuadamente.
Consideración
En mi sistema, el sonido vuelve automáticamente a los altavoces de la computadora portátil cuando HDMI está desconectado. En su sistema no lo hizo. Es posible que se requieran mejoras adicionales al código si el sonido no llega a los altavoces de su computadora portátil cuando HDMI está desconectado. Responda a través del comentario a continuación cómo funcionan / no funcionan las cosas.
Pruebas rápidas en CLI
Puede probar rápidamente el código en la terminal utilizando:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Cambiar a HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Vuelva a los altavoces integrados:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
Recuerde reemplazar rick
con su nombre de usuario.
- La
export
línea inicial probablemente no sea necesaria, pero la he incluido solo para estar seguro.
- Si tiene varias tarjetas de sonido, o
hdmi-stereo
obviamente se necesitan algo más que ajustes para descubrir los parámetros correctos antes de escribir su script.
Descifrando el nombre de su dispositivo dentro de PulseAudio
El siguiente código usa el mismo comando dos veces. Una vez cuando el sonido se configura en un televisor HDMI externo. Una segunda vez cuando el sonido se configura en los altavoces integrados de la computadora portátil. Cada vez que vea el nombre que utiliza 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>
Cuando tienes múltiples tarjetas de sonido
Use el comando aplay -l
para ver si tiene tarjetas mayores que el número 0. Si es así, necesitará usar el número de tarjeta apropiado en sus scripts. Por ejemplo:
$ 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
En el ejemplo anterior, todos los números de tarjeta son 0 con diferentes fuentes de salida. Si tiene altavoces USB, pueden tener un número de tarjeta diferente a 0.
Editar 2 de diciembre de 2016
Por alguna razón desconocida, el guión se rompió hoy. Por encima de código usado para leer: "$ (cat / sys / class / DRM / card0-HDMI-A-1 / estado", pero que tenía que cambiar card0
a card1
y el código anterior se ha revisado como tal, no puede explicar lo que ha cambiado. en mi sistema, aparte de las actualizaciones regulares de Ubuntu desde el 26 de noviembre de 2016.
Editar 14 de diciembre de 2016
El código anterior debía cambiarse nuevamente a: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". En lugar de revisar el código entre card0
y card1
dependiendo del arranque, revise el programa a la referencia card*
para capturar ambos escenarios .