Llevaba ya mucho tiempo sin escribir por aquí algo... y para desengrasarme un poco voy con una recetilla muy simple pero que puede ser de mucha utilidad: supongamos que entras en una página que reproduce audio mediante streaming y que quieres capturar ese audio. Si abres un programa de captura comprobarás que no se captura ese sonido... necesitamos algún tipo de tarjeta "virtual" que nos permita capturar lo que reproduce, esto es: audio loopback.

Instalando (quick'n'dirty)

Los señores de ALSA crearon hace tiempo un modulito que permitía justamente esto, el aloop, pero lamentáblemente no se compila por defecto, esto hace que distribuciones como Debian no lo traigan de serie, por tanto, nuestro primer paso es compilar el modulito. Empezamos descargándonos el archivo alsa-drivers de ALSA FTP (el link es FTP pero el drupal lo cambia a HTTP porque es muy listo). Lo suyo sería que fuese el de la misma versión que tengamos en nuestro sistema. Si no sabéis qué versión usáis, ejecutad lo siguiente:
$ cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.16.
De todas formas, yo tengo la versión 1.0.16 y me he instalado el módulo en su versión 1.0.17 (porque era la que tenía a mano) y no he tenido warnings ni nada por el estilo... Una vez descargado, descomprimimos y compilamos:
$ unp alsa-driver-1.0.16.tar.bz2
$ ./configure --with-cards=loopback --with-sequencer=yes
$ make
Ahora podríamos hacer un make install pero yo no lo hago por una sencilla razón: instala más módulos de los estrictamente necesarios. Para no "tocar" más de lo necesario hago lo siguiente (como root):
#  cp drivers/snd-aloop.ko /lib/modules/$(uname -r)/kernel/sound/drivers/
# depmod -ae
Y ya está... ahora a saber cómo usarlo...

Instalando(Debian way)

[TO-DO]

Usando aloop

Lo primero es cargar el módulo:
# modprobe snd-aloop
Ahora configuramos la tarjeta (realmente este paso no es necesario para ciertas aplicaciones: las que usen alsa-lib, pero nunca está de más), para ello debemos saber qué tarjetas tenemos funcionando (esto ya lo podemos hacer como usuario):
$ cat /proc/asound/cards
 0 [A5451          ]: ALI5451 - ALI 5451
                      ALI 5451 at 0x8400, irq 9
 1 [pcsp           ]: PC-Speaker - pcsp
                      Internal PC-Speaker at port 0x61
 2 [Loopback       ]: Loopback - Loopback
                      Loopback 1
Como podemos ver, la tarjeta virtual Loopback es la 2, esto nos permite escribir lo siguiente en el archivo ~/.asoundrc (si no existe lo creáis) y añadimos lo siguiente:
pcm.aloop {
	type hw
	card 2
}

ctl.aloop {
	type hw
	card 2
}
Con esto ya tenemos listos dos canales PCM, que en este caso serían (en nomenclatura ALSA): hw2,0 y hw2,1. Lo que reproduzcamos por uno de ellos, lo podremos capturar por el otro, lo único que hay que tener en cuenta es que el formato de captura debe coincidir con el del audio que se está reproduciendo. Si queréis un ejemplo podéis hacer lo siguiente: capturamos uno de los extremos del loopback:
$ arecord -D hw:2,1 -c 2 test.wav
Y ahora podemos reproducir cualquier archivo (en estéreo, puesto que estamos capturando 2 canales), seleccionando dispositivo de reproducción hw:2,0:
 $ aplay -D hw:2,0 music.wav
Y ya está.... así de fácil! :)

Rizando el rizo: múltiples tarjetas loopbacks

Bien, ya sabemos crear una tarjeta virtual con sus 8 subcanales PCM listos (si, no lo he comentado antes, pero mezcla hasta 8 canales), pero... ¿qué pasa si queremos más de una tarjeta loopback?. La solución es fácil: al cargar el módulo podemos especificar cuántas tarjetas virtuales queremos (hasta un máximo de ocho):
 # rmmod snd-aloop
# modprobe snd-aloop index=2,3 enable=1,1 pcm_substreams=4
En el ejemplo anterior primero descargamos el módulo y después lo volvemos a cargar de la siguiente manera:
  • index: índices de las nuevas tarjetas a crear, esto es: las tarjetas loopback serán hw:2.x y hw:3.x.
  • enable: tarjetas virtuales a habilitar. Un 0 la deja deshabilitada y un 1 la activa (realmente no se para que sirve esto ya que no entiendo porqué alguien va a crear una tarjeta virtual que no pueda usar. Simplemente poned tantos unos como tarjetas vayáis a añadir).
  • pcm_substreams: número de subcanales que tendrá cada tarjeta virtual. En este caso serán 4 subcanales por tarjeta.

Enlaces

Aunque está un poco anticuada... la página de aloop module puede ser útil...


blog comments powered by Disqus