8 de junio de 2013

Brico: Cambiando la salida de audio-vídeo al momento.

Hace tiempo que conecté la salida de HDMI del ordenador a la televisión para usarlo también de media center. Si alguno lo ha hecho sabrá que es un rollo cambiar a mano la salida de vídeo y audio a HDMI cada vez que quieres ver una película o jugar en la TV en vez de en el ordenador. Pero como buenos linuxeros sabemos que todo tiene arreglo.

Lo primero, que tenemos:
Tenemos una tarjeta de vídeo con salida HDMI conectada a un televisor y DVI a el monitor que usamos normalmente. Ademas tenemos una tarjeta de sonido conectada a los altavoces del ordenador pero queremos que al ver la televisión el sonido salga por HDMI.

Y que queremos:
Cambiar la salida de sonido y de vídeo sin tener que entrar a cambiar la configuración de monitores o pulseadio, simplemente pulsando una tecla.

Pues vamos al tema. Para cambiar la salida de vídeo podemos usar el software de configuración de nuestra tarjeta, como nvidia-settings, aticonfig etc... pero es mas sencillo y mas engorroso con disper, un switcher rápido de salida de vídeo. Para instalarlo es tan simple como:

sudo apt-get install disper

Una vez instalado veamos que nos da:

desmontando@linux:~/scripts$ disper -l
display DFP-0: Acer AL2021  resolutions: 640x400, 640x480, 800x600, 1024x768, 1152x864, 1280x1024, 1600x1200 display DFP-1: LG Electronics LG TV  resolutions: 640x480, 720x480, 720x576, 800x600, 1280x720, 1152x864, 1920x1080, 1024x768, 1360x768


Como vemos nos saca un listado de todos los dispositivos y modos disponibles. Con las opciones del comando podemos sacar solo el display y modo activos:

desmontando@linux:~/scripts$ disper -l
backend: nvidia
associated displays: CRT-0, CRT-1, DFP-0, DFP-1 metamode: DFP-0: nvidia-auto-select @1600x1200 +0+0 scaling: default, default, default, default xinerama info order:


En la linea metamode tenemos el modo activo que en este caso corresponde al monitor DFP-0 con resolución 1600x1200. si cambiamos la salida será:

desmontando@linux:~/scripts$ disper -l
backend: nvidia
associated displays: CRT-0, CRT-1, DFP-0, DFP-1
metamode: DFP-1: nvidia-auto-select @1920x1080 +0+0
scaling: default, default, default, default
xinerama info order:


Para cambiarlo con disper, podemos consultar la ayuda. En ella vemos que con las opciones -s y -S podemos habilitar solo la salida primaria o secundaria a nuestro gusto. Además con -r establecemos la resolución nativa. Con -q le decimos que no saque nada (quiet). En mi caso he optado por usar la resolución para detectar el monitor activo. En caso de usar la misma resolución en ambos monitores debería usar el ID (DFP-X).

Así que ya tenemos:
disper -p -q | metamode | awk '{print $4}' para obtener la salida activa.
disper -S -q -r 1920x1080 para activar solo la TV.
disper -s -q -r 1600x1200 para activar solo el monitor.


Vamos con el sonido, este me ha costado algo mas. Para manejar pulseaduio por consola disponemos del comando pacmd (este ya está instalado). Al igual que con las salidas de vídeo lo primero es determinar cuantas salidas de audio tenemos, para ello:

pacmd list-sinks

Nos sacará un montón de información, sobre todo si tenemos algo reproduciéndose. Lo mejor es para todo y filtrar por lo que realmente nos interes, el index:

desmontando@linux:~/scripts$ pacmd list-sinks | grep index
    index: 0
  * index: 1


Como vemos tenemos 2 dispositivos, el que está marcado con asterisco es el activo en mi caso la tarjeta integrada, es decir, la salida a los altavoces del ordenador. La index 0 es la salida HDMI. Para cambiarlo el comando es:

pacmd set-default-sink X

Pero claro, eso solo sirve si no hay nada reproduciendo, si hay algo tendríamos que cerrar el reproductor y volverlo a abrir para que cambiara la salida, o bien cambiar nosotros la salida a mano. Para ver los streams que hay reproduciendo en pulseaudio:

pacmd list-sink-inputs

Como ya tenemos claro que salidas queremos en cada momento solo nos queda juntar todo en un script. Es algo sencillo, o tenemos audio y vídeo al monitor del ordenador o audio y vídeo por HDMI en el televisor. No quiero mas modos u opciones. El script quedaría:

#!/bin/sh
PAINS=`pacmd list-sink-inputs | grep index | awk '{print $2}'`
STATUS=`disper -p -q | grep metamode | awk '{print $4}'`
case $STATUS in
@1600x1200)
disper -S -q -r 1920x1080
SINK=0
;;
@1920x1080)
disper -s -q -r 1600x1200
SINK=1
;;
esac
pacmd set-default-sink $SINK
for INS in $PAINS
do
        pacmd move-sink-input $INS $SINK
done


Una vez creado el script simplemente le damos permisos de ejecución, y tras probarlo a mano le asignamos una tecla rápida en los atajos de teclado. A partir de ahora solo tendremos que pulsar una tecla cada vez que queramos cambiar las salidas de audio y vídeo.

No hay comentarios:

Publicar un comentario