viernes, 17 de diciembre de 2010

Configuración del servidor de audio Jack. Segunda parte

#########################
Notas de revisiones:
Rev 0: 19 diciembre 2010. Publicado.
Rev 1: 25 mayo 2011. Edición de mantenimiento.

#########################


Segunda parte. Dispositivos de entrada y de salida. Jack sobre varias tarjetas de audio

Si estás perdido en la tarea de configurar el servidor de audio jack, no empieces por aquí. Lee antes la primera y más importante parte.

Lo normal es que jack trabaje sobre una única tarjeta (el "interfaz") en la cual tendremos entradas y salidas suficientes para capturar y reproducir sonido. Sin embargo, se puede configurar jack para que utilice diferentes dispositivos de entrada y de salida.

También presentamos las utilidades alsa_in y alsa_out.

En las faq de jackaudio hay escrito algo sobre esto, yo intentaré elaborarlo un poquito más aun a riesgo de meter la pata.

Tarjetas y dispositivos

Alsa maneja los conceptos de "Tarjeta" (Card), "Dispositivo" (Device) y "Subdispositivo" (Subdevice). Cada tarjeta puede tener varios "dispositivos" y éstos a su vez, varios "subdispositivos". Jack necesita saber qué tarjeta y qué dispositivo usar así que dejamos de lado el "subdispositivo" (menos mal).

En general, una tarjeta soportada por alsa, se denomina numéricamente "hw:x,y", donde "x" es el número de tarjeta e "y" es el número de dispositivo, comenzando ambos desde cero. Muchas tarjetas tienen un dispositivo único y no hace falta especificarlo. Así, hw:0 es lo mismo que hw:0,0. Sin embargo hay otras tarjetas que tienen varios dispositivos, típicamente, las tarjetas "de consumo". Veamos esta imagen:



"arecord -l" muestra las tarjetas y dispositivos que sirven para captura y "aplay -l" los que se pueden usar para reproducción (he filtrado las líneas que contienen la palabra "subdispositivo"). En cada tarjeta puede haber dispositivos únicamente de captura, únicamente de reproducción, o dúplex. Los dispositivos dúplex (capaces de captura y reproducción simultánea) aparecen en la salida de ambos comandos.

Veis que la tarjeta 0, en este caso la M Audio Audiophile 24/96 (hw:M2496) nos lo pone fácil; sólo tiene un dispositivo y es válido tanto para captura como para reproducción.

La tarjeta 1 es la integrada, hw:Intel. Tiene dos dispositivos, uno para los puertos analógicos y otro para el puerto digital. Ambos son utilizables tanto para captura como para reproducción.

La tarjeta 2 es una tarjeta virtual. Paso palabra.

Con la tarjeta 3, la mítica SB Live!, la cosa se lía un poco. Si elegimos la interfaz "hw:Live" la cosa va bien pero nos encontramos con que sólo tenemos dos puertos de captura y dos puertos de reproducción. hw:Live es equivalente a hw:Live,0 y por tanto se usa el dispositivo que corresponde a "ADC Capture/Standard PCM Playback", que, por lo que se ve, enseña solamente estos 2 + 2 puertos.

¿Qué pasa con el resto de salidas del sistema surround? Pues que están en otro "dispositivo".

Para acceder a estos puertos podemos usar "hw:Live,0" para captura (es decir, "dispositivo de entrada" y "hw:Live,3" para reproducción (dispositivo de salida). Eso sí, tendremos que ir descubriendo qué "puerto escribible" de jack corresponde a qué salida física y, por supuesto, el mezclador interno y los niveles de los canales deberán de estar configurados correctamente en alsamixer.

En el pantallazo se puede observar cómo el menú desplegable en los dispositivos de entrada y salida se corresponden con las salidas de arecord -l y aplay -l respectivamente.



Por supuesto, también podemos intentar usar dispositivos de entrada y salida de tarjetas diferentes, pero no es muy recomendable. Para eso es mejor usar alsa_in y alsa_out.

alsa_in y alsa_out


Ejemplo de uso:

Jack está ejecutándose sobre el interfaz hw:M2496 pero nos vendría bien un canal estéreo de la SB Live! para monitorización. Podríamos usar:

alsa_out -jSBlive -dhw:Live,0

La opción -j es opcional. Ver: man alsa_out

Otras opciones

En el archivo ~/.asoundrc podemos crear dispositivos virtuales aunque esto es algo que supera mis conocimientos y mi experiencia. Ver el clásico "el cheapo howto" http://quicktoots.linuxaudio.org/toots/el-cheapo/ y la documentación de alsa para algunos ejemplos.

16 comentarios:

  1. Tengo una pregunta para ti, Pablo. Intento el comando de alsa_out y me sale que no existe el comando. El típico command not found. ¿Hay que instalar algún paquete adicional?

    La verdad es que esto tiene buena pinta y, además, me puede hacer falta pronto. Casualmente tengo una SBLive!, pero USB, y me vendría bien para monitorizar tocando en directo, porque mi M-Audio sólo tiene una salida estéreo.

    Un saludo.

    ResponderEliminar
  2. Hola José. A mí me funciona sin más. En lucid son ejecutables instalados por el paquete jackd. ¿Qué distro Linux y versión y qué versión de jack tienes instalada (jackd -V)?

    ResponderEliminar
  3. Saludos amigo Pablo, siempre en la brecha y dando caña. Enhorabuena por el post.

    Y felices fiestas.

    ResponderEliminar
  4. Hola Pablo
    respecto a lo de "otras opciones" hay en el wiki de Musix una entrada interesante en castellano.
    http://www.musix.org.ar/wiki/index.php/2-tarjetas-es

    ResponderEliminar
  5. Estoy en Karmic todavía, en ambos ordenadoress (al final tuve que actualizar el portátil, que lo tenía todavía en Jaunty, pero se terminó el soporte técnico y actualicé a Karmic).

    La versión de jackd que tengo es esta:

    jackd version 0.116.1 tmpdir /dev/shm protocol 24

    Otra de esas cosas por las que hay que actualizarse, porque se pierde uno cosas como esta.

    Gracias Pablo. Un saludo y felices fiestas por si no vuelvo antes.

    ResponderEliminar
  6. Hola Igny, gracias por tus ánimos! Felices fiestas a tí también!

    Hola Anónimo, gracias por el aporte!

    Hola José, es verdad. Estas utilidades son bastante nuevas. En el jackd que viene con lucid ya están. Lo puedes solucionar compilando jackd. Probablemente también sirva "tomar prestado" el jackd de lucid cambiando temporalmente el /etc/apt/sources.list. Con prudencia pero sin miedo.

    Saludos, Pablo

    ResponderEliminar
  7. Saludos Pablo. Quería comentar una cosa y es que tengo una interfaz de audio e-mu 0202 usb la cual nos dio algunos problemas en 8.04 que tu me resolvistes. En esta ocasion y desde 10.10 no hay ningun problema o eso parece, aun estoy empezando y solo estoy leyendo pero jackd inicia bien con ella y lo que te quería comentar es que parece ser que obtengo mejores resultados de latencia configurando jack a 88200 Hz y 128 de buffer, esto me da una latencia de 2,9 ms. sin xruns mientras que si lo configuro a 44100 y 64 de buffer también me da unos 2,9 ms. de latencia pero me empieza a hacer xruns. A eso me refiero. Todo esto es a pelo, solo con jack pues aun no he instalado ardour pero si me he autoincluido en el grupo de usuarios de "audio" en el cual no estaba incluido y aplicado ulimit -r y ulimt -l
    obteniendo 99 y unlimited.
    La cosa pinta bien...

    Gracias, esto seria muy complicado sin personas como tu.

    Saludos

    ResponderEliminar
  8. Hola Miquel, perdona la tardanza.

    Pues sí, pinta muy bien. 88200 Hz es un poco exagerado, creo yo. Los archivos en wav serán el doble de grandes y no van a sonar mejor que a 44100 Hz. Yo pienso que 44100 Hz y 128 cuadros por periodo es una muy buena configuración. Incluso 256 cuadros. Es más, dependiendo de cómo hagas la monitorización es conveniente trabajar con latencias más altas para no sobrecargar el sistema. Lo importante es que no tengas xruns mientras grabas (sobretodo) o reproduces.

    ResponderEliminar
  9. gracias por la info es bueno saber de gente como tu interesado en ayudar a los demas .... bueno pues te cuento gracias a tu info logre iniciar jack pero una cosa es iniciar jack y otra hacerlo funcionar como deseas... esta es mi configuracion jack http://i54.tinypic.com/r7vin7.jpg lo que deseo es iniciar jack para poder grabar el audio interno (el que se reproduce cuando ves algun vidio en youtube o reproduces musica en amarok) con RecorditNow pero existe un apartado en el setup de recorditnow que no logro entender... cuales son los o el jack ports,, y los demas parametros??? ni dea,,, espero y me puedas ayudar de antemano muchas gracias por la info de arriba saludos

    ResponderEliminar
  10. Hola.

    Explico cosas básicas primero:

    Con respecto a su integración con jack podemos hacer una clasificación (muy a lo bruto) de tres tipos de programas:

    1) Los que no funcionan con jack de ninguna manera, al menos por ahora.

    2) Los que no funcionan por jack por defecto pero se pueden convertir en clientes de jack.

    3) Los que funcionan con jack por defecto.

    Con "funcionar con jack" quiero decir que son clientes del servidor de audio jack, dicho de otra forma, presentan puertos de "jack audio" de grabación, reproducción o ambos a la vez (dependiendo del tipo de programa). Estos puertos los puedes ver (o no) en la ventana de conexiones de Jack Control, pestaña audio, y los puedes conectar a tu antojo. En este caso, desde los puertos de salida del cliente reproductor a los puertos de entrada del cliente grabador.

    Si no ves puertos de captura del cliente "recorditnow", significa ni más ni menos que recorditnow no es un cliente de jack audio.

    Dicho de otra forma, lanzar el servidor jack sólo tiene sentido cuando los programas que vas a usar son clientes de jack. Tienes dos opciones:

    1) No usar jack. Aquí no te puedo ayudar, y menos con KDE, pero supongo que se podrá.

    2) Usar un grabador cliente de jack y un reproductor cliente de jack.

    Con respecto a los reproductores, la mayoría pertenecen al grupo 2 que hemos visto antes, o sea, la mayoría se pueden "jackificar". Ver http://semicorchux.blogspot.com/2009/12/reproductores-de-multimedia-traves-de.html

    Con respecto a los grabadores, me temo que recorditnow pertenezca al grupo 1. Pero tienes grabadores sencillos completamente "jack-aware". Ver http://semicorchux.blogspot.com/2010/04/grabadores-sencillos-jack-timemachine-y_24.html

    ResponderEliminar
  11. Aclaro que no conozco recorditnow. Es posible que se pueda configurar para que sea cliente de jack audio. Tienes que llegar a ver sus puertos en la ventana de conexiones de Jack Control.

    ResponderEliminar
  12. Hola buenas me presento Soy Andrea y no se como empezar .....


    Y com buen novato me da problemas Jack que no se conecta como debe con mi tajeta M44

    La verdad no entiendo pq una vez es hw:0 y otrra es hw:1.

    Pero es que incluso configurndo cada vez las salida corecta no salen las conexiones para poder grabar o trabajar con los programas que necesitan Jack.

    Me puedes auydar?? donde busco informacion coerente y facil sobre este tema parece q lo q me pasa mi no le pasa a nadie. Sera la tarjeta q tengo q estar rota ???
    como lo puedo saber?

    Tb lo absurdo es q de repente funciona perfectamente y otra me abre dos ventanas emergentes de mensaje y me da estos errores

    D-BUS: El servidor JACK no puede iniciarse.

    No puede conectarse al servidor JACK como cliente.
    - La operación global falló.
    - No puede conectarse al servidor.
    Por favor revise la ventana de mensajes para mas información.

    y en la verntana de mensaje aparece esto


    17:03:38.586 D-BUS: El servidor JACK no puede iniciarse. Disculpa
    Cannot connect to server socket err = No existe el archivo o el directorio
    Cannot connect to server socket
    jack server is not running or cannot be started
    Mon Apr 30 17:03:38 2012: Starting jack server...
    Mon Apr 30 17:03:38 2012: JACK server starting in realtime mode with priority 10
    Mon Apr 30 17:03:38 2012: control device hw:0
    Mon Apr 30 17:03:38 2012: control device hw:0
    Mon Apr 30 17:03:38 2012: [1m [31mERROR: Failed to acquire device name : Audio0 error : Cannot allocate memory [0m
    Mon Apr 30 17:03:38 2012: [1m [31mERROR: Audio device hw:0 cannot be acquired... [0m
    Mon Apr 30 17:03:38 2012: [1m [31mERROR: Cannot initialize driver [0m
    Mon Apr 30 17:03:38 2012: [1m [31mERROR: JackServer::Open() failed with -1 [0m
    Mon Apr 30 17:03:38 2012: [1m [31mERROR: Failed to open server [0m
    Mon Apr 30 17:03:39 2012: Saving settings to "/home/andrea/.config/jack/conf.xml" ...
    17:04:11.820 No puede conectarse al servidor JACK como cliente. - La operación global falló. - No puede conectarse al servidor. Por favor revise la ventana de mensajes para mas información.
    Cannot connect to server socket err = No existe el archivo o el directorio
    Cannot connect to server socket
    jack server is not running or cannot be started


    La verdad estoy desesperado y no quiero volver al Windows.
    Un saludo y un gracias de antemano

    ResponderEliminar
  13. Qué tal Pablo. Bueno, antes que nada, te agradeceré treméndamente tu blog, ya que desde hace tiempo me ha permitido utilizar Ardour (no voy a decir si satisfactoriamente o no) en mi SBLive!

    Tengo una pequeña pregunta. Cuando trabajo con Jack, no me interesa saber si hubo una xRun (siempre las hay), y por ende, que el ícono se ponga de COLOR ROJO. Podrá parecer algo trivial, pero yo prefiero que siempre se mantenga del mismo color, así que mi pregunta sería ¿Existe alguna forma de que Jackctl no me informe los XRuns, y si acaso activar el "Modo Tolerante" solucionará mi problema sin afectar en lo más mínimo mi trabajo con Jack?

    ResponderEliminar
  14. Por cierto, no se si has hablado sobre SBLive!, pero por si no lo has hecho, sería excelente que informàramos la sencillísima forma de hacerla funcionar de modo multichannel con jack. Avísame si quieres que lo haga!

    ResponderEliminar
  15. Andrea, tu consulta fue atendida en hispasonic. Dejo el enlace como referencia:

    http://www.hispasonic.com/foros/problemas-jack/400764

    Juan Carlos,
    Gracias por tus amables palabras :). La verdad, nunca me había puesto a investigar qué es lo que hace el "modo tolerante" ni si podría ser conveniente en algun caso ignorar los xruns. Pero ya que lo preguntas, vamos a verlo. Según "man jackd":

    --softmode
    Ignore xruns reported by the ALSA driver. This makes JACK less likely to
    disconnect unresponsive ports when running without --realtime.

    Parece que es lo que estás buscando. No obstante, sería más interesante eliminar su causa en lugar de ignorarlos (aunque no es tan fácil).

    Respecto al segundo comentario, Sí claro! Puedes ponerlo aquí mismo como comentario, o cómo hacemos?

    ResponderEliminar