Cambia entre altavoces internos y HDMI automáticamente

18

¿Sabes cómo cuando conectas los auriculares al conector auxiliar de tu computadora portátil, los altavoces internos se silencian automáticamente y el sonido sale de tus auriculares? Quiero exactamente eso para HDMI.

Conecto un monitor con altavoces integrados a mi computadora portátil para ver videos, a veces. Es muy extraño cuando el video está en el monitor (que se encuentra a 3 m de distancia de mi escritorio) pero el sonido sale de los altavoces internos de mi computadora portátil (la computadora portátil se encuentra en el escritorio).

Por supuesto, puedo ir a la configuración de sonido y cambiar el canal de salida a HDMI. Pero luego, más tarde, cuando quité el cable HDMI hace horas e incluso podría estar en una ubicación totalmente diferente, el sonido no se reproducirá porque el servidor de sonido aún intenta reproducirlo a través de HDMI pero no hay nada conectado a él. .

Cambiar de nuevo automáticamente a los altavoces internos cuando no hay ningún dispositivo conectado a través de HDMI es más importante, pero cambiar a la salida de sonido a través de HDMI cuando un dispositivo está conectado aún sería muy bueno.

Esto aparentemente funcionó con 11.10 pero no funciona con 16.04.

UTF-8
fuente
Tener una tecla de acceso directo para alternar el sonido podría ser una buena solución para usted. La segunda respuesta en este hilo hace eso: askubuntu.com/questions/41858/…
WinEunuuchs2Unix
Todavía estoy buscando una solución para eso también (el 16.04; ninguna de las soluciones sugeridas funciona). El problema también se discute en el foro mint .
Hiro protagonista
@hiroprotagonist Sí, yo también. Parece que la respuesta aquí funciona en la mayoría de los casos, pero no en todos.
UTF-8
En realidad, el cambio automático funcionaba en Ubuntu 14.04, a menos que una actualización lo hubiera deshabilitado.
BurninLeo

Respuestas:

8

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 hotplugtvque udev llama. Sin embargo, este mismo script se puede llamar en muchos lugares. Por ejemplo, durante las pruebas lo usé en lock-screen-timerdonde 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 rickcon 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.rulesno 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 rickcon su nombre de usuario.

  • La exportlínea inicial probablemente no sea necesaria, pero la he incluido solo para estar seguro.
  • Si tiene varias tarjetas de sonido, o hdmi-stereoobviamente 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 -lpara 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 card0a card1y 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 card0y card1dependiendo del arranque, revise el programa a la referencia card*para capturar ambos escenarios .

WinEunuuchs2Unix
fuente
No puedo copiar 70-persistent-net.rulesporque no existe. /etc/udev/rules.dsolo contiene un solo archivo llamado 39-smfp_samsung.rules.
UTF-8
Bueno, copie 30-smfp_samsung.rules, no necesitamos el contenido del archivo solo para asegurarnos de tener los permisos correctos para nuestro nuevo archivo. Copiar un archivo existente es la forma más fácil (para mí de todos modos).
WinEunuuchs2Unix
1
No funciona en mi sistema. @ Persona que ya votó por esta respuesta: ¿Funciona en tu? El | Primero lo intenté sin reiniciar, pero no funcionó. Tampoco funciona después de reiniciar. Tenía HDMI desconectado y configuré el sonido en los altavoces internos antes de reiniciar. Después de reiniciar, reproduje algo de música y conecté mi cable HDMI. La música aún (solo) salió de los altavoces incorporados. ¿Tiene que cambiar algo más que las 2 ocurrencias del nombre de usuario? cat /sys/class/drm/card0-HDMI-A-1/statusmuestra el estado correcto (lo intenté varias veces).
UTF-8
@ UTF-8 He agregado una nueva sección donde puede probar el cambio en la línea de comando. ¿Puedes ejecutar esto y ver si salen errores por favor?
WinEunuuchs2Unix
Parece que no output:analog-stereo: pastebin.com/n5bHyhCm Esto lo hace aún más extraño porque entonces esperaría que el sonido siempre se reproduzca a través de HDMI. Capturas de pantalla de mi configuración de sonido cuando HDMI está conectado y cuando HDMI no está conectado . Editar: ya lo intenté, pero me tomó unos minutos más publicar este comentario porque tuve que subir las capturas de pantalla.
UTF-8