Multitarjetas con Jack (Experimento con olor a Workaround)

mod
#1 por Irwin J. Cespedes el 11/09/2011
Hola a todos, hoy vengo con un pequeño experimento y a la vez a una solución (a medias) de un problema que tiene QJACKCTL, la poca capacidad de hacer correr varias tarjetas al mismo tiempo con Jack. Aunque si hay una solución para tal problema. Sin embargo, a pesar de ser algo simple, requerirá de unos pequeños pasos que demostraré a continuación.

Primero, los ingredientes:
Jack (preferiblemente Jack2, por razones a explicar)
ALSA (Instalado por defecto en casi todas las distros, si no es que todas)
2 o más Interfaces o Tarjetas de Sonido que sean soportadas por ALSA (PCI, USB, FireWire, etc)
Cablería necesaria
Un vaso de café

Segundo, saber que vamos a hacer. Al iniciar Jack, usando QJACKCTL, como todo el tiempo a la hora de ir al Patchbay, ustedes verán como siempre esto:

Connections%252520-%252520JACK%252520Audio%252520Connection%252520Kit.png

Donde "System" son las entradas y salidas de la interface que por defecto esta seleccionada. En mi caso son, mi computadora tiene una configuración de 2/2 IO (2 entradas/2 salidas), pero tengo ademas una interface USB aparte basada en el Chipset Realtek AC97 la cual gustaría de mover junto a la tarjeta 5.1 que normalmente utilizo. Así, lograría crear una tarjeta virtual con 4/4 IO, compartiendo reloj entre ambas, y por supuesto expandiendo la capacidad del equipo. Entonces haremos lo siguiente, Vamos al terminal, y hacemos esto: Insertamos el poderoso código: cat /proc/asound/cards, para ver los números asignados por ALSA para interface.

Screenshot-Terminal.png

Apuntamos la salida, tomamos un sorbo de café, y es aquí donde vamos a hacer alquimia.

Presentado "alsa_in" y "alsa_out"

"alsa_in" y "alsa_out" son los pequeños programas que nos dejaran hacer este truco. Ellos hacen que JACK se de cuenta que hay más dispositivos disponibles para usar con la interface ALSA, y que puede disponer de ellos. Los mismos vienen por defecto en el paquete "jackd", por lo cual no habrá que recompilar absolutamente nada. Las razones por la que es altamente recomendable usar JACK2 en ves de JACK1, es por que JACK2 posee la capacidad de Syncing, primordial cuando se hacen estos trucos, para no oír esos molestos pops y clicks que ocurren cuando las tarjetas no están sincronizadas por algún reloj. Entonces, después de esta pequeña inmersión, abrimos QJACKCTL, ponemos a correr a Jack, y luego usamos este par de códigos:

alsa_in%252520alsa_out.png

Terminal escribió:
alsa_out -d 'hw:0' -r 44100 -j 'Realtek AC97'


y

Terminal escribió:
alsa_in -d 'hw:0' -r 44100 -j 'Realtek AC97'


Donde alsa_in y alsa_out nos permitirán arrancar otra interface, aparte de la que ya esta corriendo para disponer de ella con JACK y, por supuesto, poder usarse desde una interface de control gráfica como QJACKCTL.

Los demás parámetros hacen los siguiente: -d es el hardware a usar, -r es la velocidad de muestreo con la que el hardware va a trabajar (Si se quiere no se pone, pero lo puse para que no variara mucho entre tarjeta y tarjeta, y no ocurran los condenados desfases en la grabación y la reproducción) y por último -j es para asignarle un nombre en para ubicarse en los softwares de edición en GNU/Linux, o para localizarla en QJACKCTL. El resto de parámetros están en la hoja de ayuda de alsa_in y alsa_out aquí, o en el terminal escribiendo man alsa_in.

Volviendo al asunto, luego de haber metido esos dos códigos en el terminal, nos vamos al Patchbay de QJACKCTL y vemos que ha sucedido.

Connections%252520-%252520alsa_in.png

Como ven, ya aparecen ambas tarjetas. System, la cual es la principal del sistema, y Realtek AC97, la cual es la interface externa que habilite mediante alsa_in y alsa_out. Algo importante, es que si no necesitas las salidas, y solo necesitas las entradas, o viceversa, solo tienes que usar un solo código. alsa_in para la grabación y alsa_out para la reproducción.

Finalmente, si quieren automatizar el proceso, pueden escribirse un script para poder arrancar ambas tarjetas desde QJACKCTL al hacer uso de la opción de arranque mediante él mismo

Scripting_Jack.png

Por último, si lanzan los comandos desde el terminal, se verán cuando existe un delay entre JACK y los Pines (o interfaces) para así tener un control total de la situación. También se pueden usar las tarjetas que se quieran, tomando en cuenta el limite físico de la máquina.

Bueno, espero les haya gustado el truco. Yo lo he usado solo con las salidas, ya que lo mío es para audio en vivo, y no tanto para grabación. Aún así, el truco sirve en ambos campos.

¡Pura Vida! :-)

Gracias a Pablo_F por haberme pasado el dato de alsa_in y alsa_out hace casi un año. Había dejado esto en la pizarra de TODO, aunque hace pocos días volví a tomar cartas en el asunto

Ruta 27, Mi nuevo tema hecho en GNU/Linux: https://soundcloud.com/altiplane/ruta-27

También soy Altiplane, esta es mi música.

Subir
#2 por DosSantos el 11/09/2011
Yo por mi parte he utilizado alsa_in para grabar con 3 tarjetas de sonido... el resultado bueno, pero al grabar no habia sincronia entre las pistas de la tarjeta principal y las otras dos, pero como era una bateria, pues, se busco un golpe de caja y a mano lo cuadramos... el resultado??? dentro de un mes espero que este en la calle...


Saludos
Subir
#3 por Pablo_F el 11/09/2011
Buen aporte Irwin! Sólo un par de puntualizaciones:
Alguien escribió:

...Así, lograría crear una tarjeta virtual con 4/4 IO, compartiendo reloj entre ambas...


Creo que esto no es correcto. Según tengo entendido, aunque alsa_in/out intenta sincronizar lo mejor posible (supongo que calculando desfases y haciendo correcciones sobre la marcha), cada tarjeta usa su propio reloj, lo cual no se puede cambiar por software. Por ningún software. Para usar un reloj único con dos tarjetas, habría que quitar el oscilador de una de ellas y en su lugar cablear desde el oscilador de la otra. Por ejemplo, en esta página [1] se explica cómo montar una multitarjeta con dos SB Live! y un reloj único. (Hay que tener en cuenta que cuando se escribió esto alsa_in/out no existía y lo que explica es cómo crear un dispositivo virtual por medio de uno o dos archivos de configuración de alsa).

Por otro lado, no creo que jack2 sea mejor que jack1 con respecto a la sincronización de alsa_in/out.

Además, es mucho mejor que elijas las tarjeta por nombre, no por número. Tal como lo tienes en los pantallazos, hw:0 es la CMI8738 y hw:1 la Intel (estoy leyendo el nombre entre corchetes en /proc/asound/cards) pero esto puede cambiar en diferentes arranques según sople el viento, de forma que hw:0 será la Intel y hw:1 la CMI8738 (a no ser que las hayas fijado en un archivo de configuración de alsa pero eso es un poco engorroso). Entonces, puedes usar el comando:

alsa_out -dhw:CMI8738 -jnombre_que_quieras_dar

Lo mismo, en el campo "interfaz" de qjackctl puedes usar hw:Intel en lugar de hw:1 (o el número de tarjeta que sea).

Creo que es mejor no forzar la frecuencia de muestreo y alsa_out tomará la que esté manejando jack.

Para matar el proceso usa mejor "killall alsa_out alsa_in", kill a secas necesita un número (el PID o número de identificación del proceso) y killall pide el nombre del proceso.

Por otro lado, dices que la tarjeta que normalmente usas es la Intel, que es 5.1, no? Entonces mira a ver si tiene un dispositivo "multiplayback". Mira la salida de

arecord -l && aplay -l

Puede ser que la misma tarjeta tenga varios "dispositivos", unos dúplex (aparecen en ambos listados), otros sólo captura (sólo aparecen en "arecord -l") y otros sólo reproducción (sólo aparecen en "aplay -l"). Si tienes un dispositivo multiplayback puedes elegir por separado el dispositivo de entrada y el de salida, en qjackctl. Por ejemplo, hw:Intel,0 para la entrada y hw:Intel,1 para la salida (dispositivos 0 y 1 de la tarjeta Intel). De esta forma jack podría ver los canales que faltan, ya que el dispositivo 0 (que es el que se toma por defecto cuando no se especifica en el segundo número de la nomenclatura hw:x,y) es normalmente dúplex e incluye dos canales de captura y dos de reproducción (los frontales).

Ojo, esta configuración multidispositivo y la numeración de los mismos es diferente en cada tarjeta. Por eso tienes que mirar las salidas de arecord -l y de aplay -l. Las pros y semipros suelen tener un único dispositivo dúplex.

Saludos, Pablo

[1] http://quicktoots.linuxaudio.org/toots/el-cheapo/
Subir
#4 por vagar el 11/09/2011
Buen trabajo, compañeros. :ook:

Ars longa, vita brevis.
Mi colección de enlaces web en diigo.

Subir
mod
#5 por Irwin J. Cespedes el 11/09/2011
Pablo_F escribió:
(...)cada tarjeta usa su propio reloj, lo cual no se puede cambiar por software. Por ningún software. Para usar un reloj único con dos tarjetas, habría que quitar el oscilador de una de ellas y en su lugar cablear desde el oscilador de la otra.(...)


Oops, un problema de palabras. Completamente cierto, es imposible que compartan un reloj a menos que se linkeen de forma física.

De hecho, en las salidas del terminal a la hora de usar alsa_in/alsa_out, aparece algo que dice Delay=xxx ms, que parece que es el ajuste que hace el programa para centrar el reloj. Imagino que eso es.

Ahora, la salida del arecord -l && aplay -l

Terminal escribió:
**** List of CAPTURE Hardware Devices ****
card 0: CMI8738 [C-Media CMI8738], device 0: CMI8738-MC6 [C-Media PCI DAC/ADC]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: CMI8738 [C-Media CMI8738], device 2: CMI8738-MC6 [C-Media PCI IEC958]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Intel [HDA Intel], device 0: ALC660-VD Analog [ALC660-VD Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
**** List of PLAYBACK Hardware Devices ****
card 0: CMI8738 [C-Media CMI8738], device 0: CMI8738-MC6 [C-Media PCI DAC/ADC]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 0: CMI8738 [C-Media CMI8738], device 1: CMI8738-MC6 [C-Media PCI 2nd DAC]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: CMI8738 [C-Media CMI8738], device 2: CMI8738-MC6 [C-Media PCI IEC958]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Intel [HDA Intel], device 0: ALC660-VD Analog [ALC660-VD Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0


Hablando de la tarjeta que uso por defecto, es la CMI 8737, la cual es 5.1, y si tiene multiplayback. la misma tiene varios "pines" entonces ella aparece como "hw:0,1 y hw:0,2". Yo la he usado en modo multiplayback con ALSA, pero con JACK hay que hacer el mismo proceso. El punto del experimento era usar la externa y la interna juntas. Aunque, el mismo se puede aplicar como dices.

Por el resto, sera pulir la salida del experimento, que resulto ser muy agradable de hacer, y valió la taza de café

Ruta 27, Mi nuevo tema hecho en GNU/Linux: https://soundcloud.com/altiplane/ruta-27

También soy Altiplane, esta es mi música.

Subir
mod
#6 por Irwin J. Cespedes el 11/09/2011
Como puntuación a los moderadores, ¿por qué nos quitaron el BBcode [code][/code]?

Off Topic Off

Ruta 27, Mi nuevo tema hecho en GNU/Linux: https://soundcloud.com/altiplane/ruta-27

También soy Altiplane, esta es mi música.

Subir
Respuesta rápida

Regístrate o para poder postear en este hilo