30 de Mayo, 2011

Mezclando entradas de audio con Pulseaudio

Es cierto que Pulseaudio ha sido fuente de frustraciones para muchos usuarios de Linux (me incluyo), pero gracias a que las mayores distribuciones lo van adoptando, cada vez funciona mejor :D.

Aquí en UK no tengo el mismo equipo que en España, y pensaba que no podía hacer sesiones en directo porque no tengo mesa de mezclas, micrófono, etc.

Pero tengo un portátil, con tarjeta de sonido (claro), y una webcam USB,... y pulseaudio es capaz de hacer un par de cosas interesantes con eso ;).

Voy a utilizar pactl, que está en el paquete pulseaudio-utils, y pavucontrol, que es una aplicación para gestionar el volumen y otros aspectos de pulseaudio. Creo que se puede hacer todo con pactl, pero no es una herramienta demasiado amigable :(.

La idea es coger la entrada de la tarjeta de sonido y la webcam, y enviarlas a un dispositivo de salida virtual que podremos utilizar como entrada para la aplicación que queremos que use la mezcla.

He utilizado el módulo null-sink, que por defecto descarta todo lo que le llega (lo manda a /dev/null), pero que nos proporciona un monitor que nos va a servir para grabar.

Primero cargamos ese módulo en la sesión de pulseaudio:

$ pactl load-module module-null-sink sink_name=mixmelive
22

Si todo funciona correctamente, pulseaudio nos devuelve el ID del módulo cargado. Le he puesto de nombre mixmelive, que usaremos más adelante.

En pavucontrol podemos comprobar que tenemos un nuevo dispositivo virtual de salida (como se ve en la siguiente imagen).

Dispositivo virtual de salida

Ahora necesitamos cargar un módulo loopback por cada entrada que deseemos mezclar, asociándolo al null-sink que ya hemos cargado:

$ pactl load-module module-loopback sink=mixmelive
23
$ pactl load-module module-loopback sink=mixmelive
24

Con esto tenemos dos nuevos flujos virtuales asociados a nuestro Null Output (gracias a usar el nombre mixmelive) en la pestaña de reproducción de pavucontrol, y en la pestaña de grabación tenemos dos flujos virtuales a los que tendremos que asignar a nuestras entradas.

Asignando entradas

En mi caso son Internal Audio Analog Stereo para la tarjeta del portátil, y WB-6250X Webcam Analog Mono para la webcam.

Hay que tener en cuenta que los dispositivos de entrada tienen amplificación vía pulseaudio, y habrá que ajustarlos para que suenen bien. Siempre se me olvida, y la entrada de la guitarra es mejor que no esté amplificada o se oirá realmente mal :P.

Ahora solo queda arrancar la aplicación con la que queremos capturar el audio, y en la pestaña de grabación de pavucontrol asignarle el monitor de Null Output o, desde la linea de comandos, usar la variable de entorno PULSE_SOURCE.

Por ejemplo:

$ PULSE_SOURCE=mixmelive.monitor arecord -f cd out.wav

Es cierto que mi portátil tiene potencia, pero no he visto que use CPU, así que parece un proceso bastante barato. Como ejemplo, una prueba: demo de mezcla con pulseaudio (se oye un poquito de estática de la guitarra, y la webcam registra la pua :P).

No tenía ni idea que estas cosas se podían hacer con pulseaudio, y la verdad me ha costado bastantes experimentos dar con esta solución, sin estar seguro de que sea la mejor :S.

Ahora me falta investigar cómo se puede aplicar alguno de los filtros LADSPA para añadir un buen plate reverb al conjunto y ya tengo el invento listo ;).

Anotación por Juan J. Martínez, clasificada en: pulseaudio, linux.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: