Reproducción
de una respuesta que publiqué en Barrapunto y que creo
interesante.
La cuelgo de aquí para consulta de generaciones posteriores :)
Quizás algún día me anime y lo convierta en un
mini-howto.
Pues no soy un
experto (ni en esto ni en nada), pero lo intentaré. Hace tiempo
que tengo pensado escribir un mini howto sobre esto, pero el ver a ALSA
ya dentro del kernel me echó para atrás. En cuanto ALSA
sea la salida estándar, se acabaron los problemas (esperemos).
Como decía, el problema del
cuelgue del plugin de flash no es un problema exclusivo del plugin. Es
cierto, como me puntualizan, que hay aplicaciones que detectan que el
dispositivo de sonido está siendo utilizado y desactivan el
sonido si es así. Pero eso no es solución. Es sólo
un parche (y a mi modo de ver bastante cutre).
El verdadero problema es que el
OSS
(Open Sound System) es un sistema de sonido muy muy muy básico.
Sólo es capaz de recibir un flujo de datos a través de
/dev/dsp y enviarlo a la tarjeta de sonido. Punto. Si nuestra tarjeta
es normalita (SB16-32-AWE, las SB PCI básicas, las VIA
integradas en placa, etc), sólo podrá reproducir un
sonido simultáneamente. Y como efecto secundario, si un programa
ya está utilizándola e intentamos mandar sonido desde
otro, éste último no sonará. Hay otras tarjetas
más "avanzadas" (la SB Live!, por ejemplo) que son capaces de
mezclar sonidos por hard. Esto es, que nosotros enviamos más de
un flujo de datos a /dev/dsp, y la propia tarjeta se encarga de
mezclarlos y hacer que suenen simultáneamente.
¿Cómo lidia cada programa con este
problema?
Pues depende, como todo. Los hay
"inteligentes" (como el mplayer) que detectan la imposibilidad de
reproducir sonido y lo desactivan. Pero otros (como el plugin de flash
5, el xmms, etc) simplemente esperarán a tener el sonido
disponible para ellos. NO se cuelgan (quiero dejar claro eso).
Simplemente están a la espera. De hecho, si dejas de reproducir
el sonido causante de la pausa, seguirán ejecutándose
como si nada.
¿Y qué pintan los servidores de
sonido entonces en todo esto?
Planteado un problema
(imposibilidad de algunas tarjetas de reproducir más de un
sonido simultáneamente), había que buscar una
solución. Esa solución son los "servidores de sonido".
Un servidor de sonido no es más que un
demonio que está a la escucha, y es capaz de recibir mil y un
flujos de sonido, mezclarlos y enviar la mezcla *como una sola salida*
a /dev/dsp. Sencillo y eficiente. La tarjeta seguirá
reproduciendo un solo sonido, pero ese sonido es la mezcla de todos.
Fácil, ¿no?. Pues no, no es tan
fácil. ;)
Resulta que para que una aplicación pueda
usar un servidor de sonido, ha de estar preparada para ello. Es decir,
no basta con que montemos un servidor para que mágicamente se
mezclen todas las salidas de nuestros programas. Hemos de decirle a los
programas en cuestión que utilizen el servidor *en lugar de* OSS
(/dev/dsp). Y depende del programa en concreto que esto sea posible.
Dicho esto, comentar que existen
(que yo conozca, es posible que haya muchos más) tres servidores
de sonido. Uno es "arts" (Analog Realtime Synthesizer), que es el
servidor de sonido predeterminado de KDE. El segundo es "esd" (Enlightened Sound Daemon), que es el que se usa por
defecto en Gnome y en Enlightenment, y el último es ALSA
(Advanced Linux Sound Architecture), desarrollado por SUSE y
estándar en los kernel 2.5 (y por tanto 2.6)
¿Por qué es "mala" la variedad en
este caso?.
Por una sencilla razón: la
falta de estandarización: Las aplicaciones de KDE hacen que su
salida sonora sea a través de arts, los de gnome a través
de esd, y el resto depende. Mplayer es capaz de usar tanto esd como
arts. Xmms también, aunque sólo viene integrado el
soporte para esd. Si quieres soporte arts deberás bajarte un
plugin (el paquete xmms-arts para debian). Otros muchos programas no
traen soporte para ninguno de ellos.
Para acabar de rematarla, tenemos el problema que
trae de cabeza a todos los usuarios novatos (y no tan novatos):
¿Por qué la caca del mplayer (por
poner un ejemplo, que es un gran programa) este me dice que no puede
reproducir sonido si no tengo abierto NADA salvo KDE?.
Pues muy fácil. Es el
servidor de sonido el que te está ocupando el sonido. O sea, la
pescadilla que se muerde la cola. Mientras el servidor esté
activo, estará ocupando /dev/dsp, como es lógico. Si tu
aplicación no está preparada para usar arts, no
será capaz de hacer sonar nada mientras arts esté
activo... y arts tarda 60 segundos en desactivarse por defecto (al
menos es así en debian). Muchos usuarios recurren a ponerle un
"0" al timeout de arts en el panel de control de KDE, pero eso no deja
de ser una solución rápida y mala. Lo que se
debería intentar hacer es hacer que *todas* las aplicaciones
usen el servidor de sonido. ¿Es esto posible?. Hasta donde yo
sé, sí es posible con arts. Con esd no tengo ni idea,
pero supongo que también.
¿Cómo hacer que una
aplicación no preparada para arts salga a través de
él?
Muy fácil. Para arrancar la
aplicación, usa el comando "artsdsp". Es decir, si quieres
arrancar mozilla para que la salida del plugin de flash (en realidad
cualquier sonido producido por mozilla) sea a través de arts,
escribe "artsdsp mozilla" en lugar de "mozilla". Toda la salida del
mozilla irá a arts en lugar de a /dev/dsp. Esto funciona en
todos los programas que probé excepto uno: Quake 3. No sé
por qué, pero si arrancas este juego con artsdsp, no
oirás
NADA. :(
Espero que haya servido para
aclarar algunas dudas. Supongo que lo colgaré de mi
minipágina de miniayudas para quien lo quiera leer:
http://davide.enredo.net.
Saludos.