El plugin Dmix del Alsa (para reproducir multiples sonidos al mismo tiempo)

Introducci�n

Los que posean placas onboard o placas de gama media, sabr�n que el alsa con su configuraci�n predeterminada no permite reproducir al mismo tiempo distintos sonidos. Un ejemplo seria tratar de utilizar el xmms para reproducir un mp3 y podes tener activos los sonidos de un cliente de mensajer�a instant�nea (licq, kopete, etc). O utilizar el xmms al mismo tiempo que se reproduce una pelicula con el mplayer, y poder escuchar el audio que ambos estan reproduciendo.
El plugin del que hablamos se llama "dmix" y permite, en lineas b�sicas, extender la funcionalidad del o los dispositivos PCM que tengamos. Si tenemos que definir al plugin del dmix, podriamos hacerlo diciendo que dicho plugin provee la mezcla en tiempo real de varios canales o fuentes.

Limitaciones

Por ahora, la unica limitacion de este plugin (actuando por si solo) es que los juegos emulados con el wineX o los juegos nativos de linux que utilizan la libreria libc con la funcion fopen() o similares para comunicarse con el driver de sonido del kernel (OSS Sound Driver) no pueden utilizarse al mismo tiempo con el xmms, el mplayer o las distintas aplicaciones que utilicen sonidos. Para solventar este problema de los programas que utilizan el OSS del kernel, existe el "aoss" pero desgraciadamente no todos los programas funcionan correctamente con esta aplicacion; sobre todo los juegos (emulados o no).
Existe otra posibilidad de realizar este proceso de adaptacion entre las llamadas a la libreria libc con las funciones fopen(). En esto esta trabajando Takashi Iwai, colaborador del proyecto Alsa. Lo que pretende es poder juntar las capacidades de este plugin y otro denominado dsnoop, de modo que puedan ser utilizados mediante el script aoss.


Archivos necesarios (o versiones mas recientes)


alsa-driver
alsa-lib
alsa-oss
alsa-utils

archivo de ejemplo del .asoundrc
xmms (opcional para reproducir mp3)
plugin del alsa para xmms
MPlayer (opcional para reproducir videos)

Dmix, el plugin


Para utilizar el plugin dmix, obviamente, necesitamos poseer el alsa compilado e instalado. Es recomendable tener la ultima version, dado que generalmente, siempre se estan reformando este plugin dentro del ALSA.
Como ejemplo, utilizaremos como ejemplo la version 1.0.3 del alsa (como root):

tar xvjf alsa-driver-1.0.3.tar.bz2
tar xvjf alsa-lib-1.0.3b.tar.bz2
tar xvjf alsa-oss-1.0.3a.tar.bz2
tar xvjf alsa-utils-1.0.3.tar.bz2

cd alsa-driver-1.0.3; ./configure; make; make install
cd alsa-lib-1.0.3b; ./configure; make; make install
cd alsa-oss-1.0.3a; ./configure; make; make install
cd alsa-utils-1.0.3; ./configure; make; make install

Ahora seteamos el volumen del master, que por default viene en "mute":
alsamixer

Y reiniciamos el demonio del ALSA:
/etc/init.d/alsasound restart

Luego de instalar el alsa driver, las librerias, la compatibilidad con el OSS y las utilidades, nos dedicamos a adaptar el ejemplo del archivo ".asoundrc" para que funcione el plugin dmix con nuestra placa de sonido. La configuraci�n siguiente pertenece al chipset nforce 2. Lo unico que deben hacer es reemplazar "nforce" en todos los lados que aparece por el que corresponda con su placa, algunos ejemplos:

Sound Blaster 16 = sb16
Intel8x0 (Realtek ALC650 rev 2) = intel8x0
Nforce 2 (Realtek ALC650 rev 3) = nforce

Generalmente se puede obtener el nombre correspondiente con: cat /proc/asound/card0/id

Archivo de configuraci�n de ejemplo:

#################################################
########## .asoundrc for nforce 2 (intel8x0)#############
#################################################

pcm.nforce-hw {
type hw
card 0
}

pcm.dsp0 {
    type plug
    slave.pcm "nforce"
}

# generalmente /dev/dsp es un enlace simbolico a /dev/dep0, con lo cual
# es indistinto poner pcm.dsp o pcm.dsp0, como en el caso de arriba

#pcm.dsp {
#    type plug
#    slave.pcm "nforce"
#}

pcm.!default {
type plug
slave.pcm "nforce"
}

pcm.nforce {
type dmix
ipc_key 1234
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 32768
}
}

ctl.nforce-hw {
type hw
card 0
}
#################################################


Componentes del archivo .asoundrc


En lineas generales, esto es lo importante a saber de ese archivo de configuracion:

  • Definici�n del control pcm a traves de la placa "nforce". Si bien esta placa utiliza el modulo intel8x0, tambien podemos, en el caso de tener la nforce2, poner nforce. Notemos el tipo (type) que es hardware.
pcm.nforce-hw {
type hw
card 0
}
  • Definici�n del dispositivo que se utilizar�a como esclavo. Luego se redirecciona el pcm esclavo (segundo dispositivo a reproducir) al encabezado "nforce". El tipo es plug indica que se conectara con el dispositivo nforce, declarado mas adelante.
pcm.dsp0 {
    type plug
    slave.pcm "nforce"
}
  • Esto sirve para definir que recurso utilizar� el programa que utilice el dispositivo predeterminado de sonido, ta como el xmms, cuya configuracion explicaremos luego en este articulo. El tipo es plug indica que se conectara con el dispositivo nforce, declarado mas adelante.
pcm.!default {
type plug
slave.pcm "nforce"
}
  • Dispositivo que abarca a los demas plug's. Aca definiremos toda la configuracion de nuestra placa de sonido.
  • El tipo ahora es "dmix", pues este plugin se encargar� de tomar las salidas de los programas que intenten reproducir sonidos y de mezclarlas hacia una unica via, nuestra salida de la placa de sonido.
  • El ipc_key es un numero unico que asignamos, que es para uso interno.
  • Luego declaramos una subfuncion "slave" que tiene como par�metros el pcm del dispositivo 0,0 (dispositivo primario de sonido). La otra opcion recalcable es el "buffer_size", que define el tama�o del buffer a utilizar (para mas info leer al pie de pagina la informacion sobre este par�metro).
  • Existen muchas otras opciones, como "rate" que define el sampleo de los archivos a reproducir. Puede ser de mucha utilidad si poseemos una placa de sonido que no es capaz de tener sampleos mayores a 44.1Khz (por ejemplo una Sound Blaster Awe 64 ISA). El problema que se presentaba a veces con (por ejemplo) el mplayer, es que cuando se trataba de reproducir un video cuyo sonido este sampleado en 48Khz, el mplayer se cerraba (y en eventuales ocaciones puede producir un "cuelgue" del driver alsa, no afectando al sistema, pero obligando a reiniciar la maquina para poder reproducir un sonido nuevamente). Entonces para evitar este problema si tenemos una placa que sabemos que no soporta el sampleo en 48Khz, definimos el sample rate en 44100 asi: rate "44100" debajo de buffer_size, o en otro lugar, siempre y cuando se encuentre dentro de la subfuncion slave.
pcm.nforce {
type dmix
ipc_key 1234
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 32768
}
}

  • Define una estructura que se complementa con la de pcm.nforce-hw. Es del tipo hardware y hace referencia a la primera placa de sonido en nuestro sistema, para el caso de querer hacer configuraciones de varias placas. Si poseemos una sola placa de sonido, siempre ir� "card 0".
ctl.nforce-hw {
type hw
card 0
}


Configuraci�n del xmms

Primero instalamos el xmms (si es que no lo tenemos) y el plugin del ALSA para el xmms.
Un ejemplo seria:

rpm -Uvh xmms-1.2.10-1.i386.rpm
rpm -Uvh xmms-devel-1.2.10-1.i386.rpm
rpm -Uvh xmms-alsa-1.2.10-1.i386.rpm

Ahora configuraremos el xmms de modo tal que utilice el dispositivo denominado "default"; y con esto permitir� a los dem�s programas reproducir mediante el dispositivo esclavo. De este modo podemos hacer cohexistir el xmms con el mplayer u otros programas que puedan utilizar el alsa.

Tomaremos como ejemplo, la configuraci�n para la placa de sonido Nforce 2, con chip Realtek ALC650 rev. 3 (generalmente las mothers con el chip nforce 2 traen como dispositivo de audio al ALC650). Pero el sistema es el mismo para todas las placas de sonido, pu�s como ver�n solo deben seleccionar el dispositivo de sonido "default", que no depende de la placa, sino que es una config predeterminada, que todos pueden seleccionar.

Con el boton derecho del mouse vamos al menu Opciones ==> Preferencias (del xmms).
Luego ahi nos encontraremos con la pantalla de plugins de Entrada/Salida de audio:



Aqui debemos seleccionar como Plugin de Salida al ALSA. Si no poseemos dicho plugin, debemos bajarlo de la pagina oficial del xmms ( plugin del ALSA del xmms )
Seguramente no estar� al principio por default, y lo deberemos seleccionar de la lista disponible:




Luego de eso, vamos a "Configurar" para poder setear correctamente el plugin del ALSA:



Y corroboramos que en "Dispositivo de audio" este seleccionado el "default". Con esto permitiremos que el xmms reproduzca mediante el dispositivo predeterminado, y que los demas programas lo hagan mediante el dispositivo esclavo, declarado en la configuraci�n que hemos explicado anteriormente, en el archivo ".asoundrc".


Configuracion del Licq (en general cualquier cliente de mensajeria instant�nea)

Ahora configuraremos el Licq para que, si es que lo deseamos, reproduzca los sonidos pertenecientes a los distintos eventos disponibles (mensaje de alerta, envio de mensajes, etc). En general cualquier cliente de mensajer�a instant�nea permite seleccionar el comando para reproducir los sonidos (amsn, kopete), o directamente reproduce los sonidos utilizando el dispositivo esclavo declarado en la configuraci�n del .asoundrc. Solo es cuestion de probar.

Configuremos el Licq:

Vamos a Menu ==> Opciones ==> Eventos
Y corroboramos que este activado "Activar tratamiento de eventos" y que en "comando" este puesto aplay, en ves del que viene siempre "play".
El comando play es reemplazado por aplay, debido a que el comando play utiliza la salida predeterminada, que es utilizada por el xmms; de modo que ocurre el mismo problema que el xmms y los juegos emulados o cualquiera que utilice la libreria libc con la funcion fopen():




Proximamente, pondr� un art�culo sobre el dmix/dsnoop que posiblemente solucione el problema de los juegos emulados, y el xmms; para que no exista limitaciones en cuanto a la reproduccion simult�nea de sonidos.


RODRIGO SAN ROMAN

[email protected]



Hosted by www.Geocities.ws

1