Corriendo jack y pulseaudio sin conflictos en la misma tarjeta de audio

Hace unos años usé una distro de linux llamada Musix mantenida por Marcos Guglielmetti, para experimentar y aprender a hacer música. Fue allí que conocí el ecosistema de software para música de linux. Ardour, audacity, zynaddsubfx, lmms, fluidsynth, etc, etc. Aprendí mucho enfrentando el reto de correr software de audio en linux. Muchas veces jack no funcionaba bien y había que configurarlo a mano, el servidor Xorg siempre daba problemas, y mi computadora de bajo rendimiento apenas dejaba hacer algo. En los últimos años todo ha ido mejorando en el software para música en linux. Hace unos meses descubrí FoxDot, que es un paquete que integra Python con Supercollider para hacer live coding de música fácilmente. Pero resultó que al iniciar Supercollider, el audio de todo mi sistema (ubuntu) quedaba interrumpido por que Supercollider se conecta a jack y jack ocupa la tarjeta de audio de la computadora. Esto es una de las cosas que más me molestaban en linux. No se podía hacer algo tan simple y cotidiano como ver un tutorial en un video en internet mientras se experimenta con un programa de audio como Ardour. Para quienes sean nuevos en esto explico un par de cosas. Jack es un sistema para conectar entradas y salidas de audio. Así se puede conectar, digamos, zynaddsubfx (un sinstetizador) con audacity para grabar el sonido y al mismo tiempo conectarlo a las bocinas de la computadora para escucharlo mientras se graba. O conectar el micrófono con una pista de grabación en ardour y a la vez conectar el teclado midi/usb a fluidsynth y ponerlo a grabar en otra pista en ardour mientras toco encima de un ritmo de batería en lmms o hydrogen. Es simplemente un sistema de tuberías de sonido. Con qjackctl se puede configurar jack y conectar los programas de audio de forma visual y sencilla.   Por otro lado, Pulseaudio es el sistema de audio más común actualmente en sistemas tipo linux. Este sistema usualmente no se utiliza en todo su potencial sino que es similar al sistema de audio de windows, que no permite nada mas que poner en mute y manejar volúmenes. Pulseaudio funciona bastante bien últimamente y no hay que configurar nada de cajón. Hasta que se topa uno con jack. Afortunadamente ahora pulseaudio se suspende cuando jack inicia y se reactiva cuando finaliza. Con esto, jack y pulseaudio se excluyen mutuamente. No pueden coexistir ya que ambos buscan ocupar la tarjeta de sonido (alsa) sin permitir que otro programa la use. Pulseaudio por sí sólo es bastante potente, flexible y está muy bien hecho. Pulseaudio puede también conectar fuentes y sumideros (igual que las entradas y salidas de jack) de sonido pero no encontré una GUI como qjackctl que permita hacerlo visualmente. Incluso con esa capacidad pulseaudio podría dejar obsoleto a jack, aunque no sé si tenga las capacidades de tiempo real. Hay un módulo para pulseaudio que permite crear entradas y salidas en jack (en ubuntu el paquete se llama pulseaudio-module-jack). Luego, con la ayuda de alguien en el chat de la comunidad CLiC entendí cómo conectar pulseaudio con jack. Pude ir un poco más allá y logré hacer el siguiente script:
#!
pacmd load-module module-jack-sink channels=2 sink_name=pa2jack client_name=pa2jack connect=false
pacmd load-module module-jack-source channels=2 source_name=jack2pa client_name=jack2pa connect=false

pactl load-module module-loopback latency_msec=10 source=jack2pa sink=0 source_dont_move=true 
pactl load-module module-loopback latency_msec=10 source=0 sink=pa2jack source_dont_move=true sink_dont_move=true

pacmd load-module module-jack-sink channels=2 sink_name=mic2jack client_name=mic2jack connect=false
pactl load-module module-loopback latency_msec=10 source=1 sink=mic2jack source_dont_move=true sink_dont_move=true

pacmd set-default-sink 0
 
  • Las primeras 2 líneas crean un sink (piénsenlo como una bocina que acepta conexiones para emitir sonido) y un source (piénsenlo como un micrófono o un programa que genera sonido y debe conectarse a una bocina). El sink (pa2jack) va a enviar sonido a jack, recibirá todo el sonido del sistema de pulseaudio de ubuntu y será puesto como un input en jack, es decir algo que se puede conectar a otro programa para alimentarle de sonido. El source (jack2pa) va a crear una salida en jack para enviar sonido a pulseaudio y va a ser la salida general de jack.
  • Las siguientes 2 líneas hacen las conexiones en pulseaudio usando el módulo “module-loopback”. Allí se conecta un source a un sink. En este caso se conecta nuestra salida general de jack (“jack2pa”) con el canal general de pulseaudio (“0”)  y se conecta el audio general de pulseaudio (“0”) con la entrada que hicimos “pa2jack”.
  • La siguiente línea crea un sink llamado mic2jack que quedará en jack como una entrada. Luego con el módulo module-loopback se conecta el micrófono manejado por pulseaudio (source=1) con la entrada puesta en jack (sink=mic2jack).
  • La última línea deja a las bocinas de la computadora como salida general por defecto por que las líneas previas hacen pensar a pulseaudio que todo el audio debe ira pa2jack con lo que ya no es escucharía nada en la computadora por haber redirigido el audio general en pulseaudio.
Para probar esta configuración se puede abrir, por ejemplo zynaddsubfx y conectarlo a jack2pa y luego en la ventana de zynaddsubfx al tocar las teclas debería enviar sonido a las bocinas de la computadora   Lo he probado también con el micrófono, grabando en audacity y ardour con efectos ladspa de por medio y funciona perfecto, con baja latencia, aunque con algunos xruns por allí (pero no tantos como los que tenía con mi computadora vieja en musix), y lo mejor de todo mientras veo tutoriales y pongo backing tracks en youtube. En mi experiencia pulseaudio y jack siempre eran enemigos desde siempre, pero resulta ser muy sencillo integrarlos. Por cierto, también tuve que poner el sample rate a 48000 en jack y en supercollider para que sonara bien FoxDot. Este blog post también me ayudó a comprender mejor las posibilidades de Pulseaudio. En este conectan diferentes aplicaciones a diferentes destinos, para transmitir en una videoconferencia y al mismo tiempo escuchar en la computadora. Osea que pulseaudio permite controlar a nivel de programa/cliente y claro a nivel de las tarjetas de sonido conectadas a la computadora.