Pequeña guía para configurar ALSA (Advanced Linux Sound Architecture) a partir de los fuentes.
Cualquier mejora, comentario o sugerencia es bienvenida: usa el formulario correspondiente.
Esta obra está bajo una licencia de Creative Commons.
Versión: 1.02
De 1.0 a 1.01: incluída apreciación de ./configure --help (por trompa). Arreglado pequeño problema con dobles guiones.
De 1.01 a 1.02: añadida solución para poder escuchar sonidos de diferentes fuentes de manera simultánea. Incorporado comentario acerca del correcto uso de la filosofía de usuarios y grupos.
Fecha: 31 Julio 2004
ALSA (Advanced Linux Sound Architecture) viene por defecto en todos los núcleos de la rama 2.6 y está llamado a sustituir a OSS (Open Sound System). No es el objetivo de este documento discutir el porqué del cambio ni los beneficios o las desventajas. Para más información, consultad las páginas del proyecto ALSA.
El presente documento es una guía para instalar los drivers de sonido ALSA. La configuración del autor del mismo (y por tanto los ejemplos), corresponden a un DELL Inspiron 8600 (Multimedia audio controller: Intel Corp. 82801DB (ICH4) AC'97 Audio Controller (rev 01) -> módulo snd-intel8x0) donde está instalada una FC1 con núcleo 2.6.5 y ALSA 1.0.4. Por supuesto, se trata de una recopilación de la información que me ha servido para instalar satisfactoriamente ALSA en mi equipo, básandome, de manera primordial, en la información que aparece en Installing ALSA from source.
Los drivers y diferentes utilidades referentes a ALSA se pueden encontrar en paquetes binarios ya compilados. Como no tenemos control alguno sobre esos paquetes, la presente guía versará se basará en los fuentes procedentes del proyecto ALSA. Para más información sobre binarios precompilados:
Partimos de que nuestro sistema se soporta sobre un núcleo de la rama 2.6 y no tenemos mayores problemas salvo el sonido, que o bien no funciona, o bien queremos actualizarlo. Para ver qué versión de los drivers tenemos instalados:
% cat /proc/asound/version Advanced Linux Sound Architecture Driver Version 1.0.4. Compiled on Apr 24 2004 for kernel 2.6.5.
Nuestra tarjeta de sonido está soportada por ALSA. Se puede chequear en ALSA Soundcard Matrix. Para ver la información de hardware de nuestro equipo, consultad /proc/asound/. En mi caso particular:
% cat /proc/asound/cards 0 [I82801DBICH4 ]: ICH - Intel 82801DB-ICH4 Intel 82801DB-ICH4 at 0xf4fff800, irq 11
NOTA: en caso de que aparezcan varias tarjetas detectadas y eso cree conflictos, sólo las que tengan asignadas una IRQ serán físicamene las tarjetas de audio.
Para la instalación básica, que es la que cubre esta guía, necesitaremos 3 paquetes: alsa-driver, alsa-libs y alsa-utils.
Esta opción es en principio la más cómoda, pero es la que puede traer mayor número de complicaciones debido a las diferentes versiones que pululan por ahí. El núcleo 2.6.5 trae la versión 1.0.2rc2 (creo recordar) y ya está disponible la 1.0.4, que no es que se lleven muy bien. Como bien remarcan en Updating ALSA Kernel drivers lo que viene en el núcleo es el paquete alsa-driver. Si el módulo soundcore está compilado con el núcleo, no es necesario recompilar:
% /sbin/modinfo soundcore description: Core sound module author: Alan Cox license: GPL alias: char-major-14-* vermagic: 2.6.5 preempt PENTIUMM gcc-3.3 depends:
Es la opción más completa y la que más libertad proporciona. Básicamente se trata de compilar los drivers para el núcleo en el que estemos trabajando, de manera que éste sólo tiene la configuración mínima (pego la parte correspondiente de mi .config):
# Sound # CONFIG_SOUND=m # # Advanced Linux Sound Architecture # # CONFIG_SND is not set # # Open Sound System # # CONFIG_SOUND_PRIME is not set
En este apartado se seguirá la instalación de los citados paquetes, si bien NO hay que instalar el paquete alsa-driver si se van a utilizar los drivers que vienen con el núcleo.
En la página web del proyecto alsa podemos conseguir los paquetes mencionados anteriormente. Además, también están disponibles los módulos de compatibilidad con OSS así como herramientas y firmware. Todos los paquetes se hallan empaquetados con TAR y comprimidos con BZIP2. Los descargamos a nuestra máquina a un directorio temporal (por ejemplo, /usr/src/alsa):
% mkdir /usr/src/alsa % cp dir_donde_están_los_paquetes/alsa* /usr/src/alsa
Para desempaquetar y descomprimir los paquetes:
% tar jxvf alsa-driver-xxx.tar.bz2
Y así con todos los paquetes que tengamos.
Para los que gusten de tirar de CVS, se recomienda echar un vistazo a AlsaCVS.
Un par de cosas básicas a tener en cuenta para evitar problemas:
Primero instalar alsa-driver, luego alsa-lib y después alsa-utils y lo que sea menester. Recomendable tener privilegios de superusuario, aunque no sea imprescindible en todo el proceso.
Leer el fichero INSTALL que aparece en todos los directorios creados al desempaquetar.
La que tiene más miga es la de alsa-driver (que NO hay que hacerla si se utilizan los del núcleo). Como estamos en /usr/src/alsa, basta con:
% cd alsa-driver-xxx
En el fichero INSTALL (así como ejecutando ./configure --help) se puede obtener información actualizada acerca de las diferentes opciones que se pueden elegir en la compilación. Un ejemplo de las más importantes:
Soporte PnP ISA (activado por defecto). Para desactivarlo: --with-isapnp=no
Soporte de secuenciador (OFF por defecto). Para activarlo: --with-sequencer=yes
Soporte emulación OSS/Free (ON por defecto). Para desactivarlo --with-oss=no
Modo depuración (OFF por defecto). Para activar todo: --with-debug=full. Para activar la detección de la tarjeta: --with-debug=detect
Si tenemos los fuentes del núcleo en un directorio diferente a /usr/src/linux, se usará --with-kernel=<directorio_núcleo> para indicar la ruta correcta.
Si sabemos qué módulo/s usa nuestra tarjeta, lo/s indicaremos con --with-cards=<módulo_que_sea>
En el caso particular de mi tarjeta (Intel Corp. 82801DB (ICH4) AC'97 Audio Controller (rev 01)):
% ./configure --with-kernel=/usr/src/linux-2.6.5 --with-isapnp=no --with-cards=intel8x0 --with-sequencer=yes % make % make install % ./snddevices
El script snddevices crea los dispositivos de audio en /dev/snd aunque nos podemos saltar este paso si nuestro núcleo está compilado con soporte DEVFS.
% /sbin/modprobe snd-intel8x0
Así comprobamos que se puede cargar correctamente el módulo para la tarjeta elegida.
El script /utils/alsasound es útil para las distribuciones basadas en Red Hat (como Fedora, que usan scripts de inicio tipo System V), ya que permite cargar al inicio la configuración.
NOTA IMPORTANTE: ALSA está por defecto enmudecido, así que hay que manipular adecuadamente los controles de volumen para poder oir algo. No está de más que los altavoces estén físicamente encendidos.
De forma más directa, aunque conviene echar un vistazo al fichero INSTALL por si acaso.
% cd alsa-lib-xxx % ./configure % make install
Aquí hay que tener cuidado con el directorio que se elige por destino y ser congruente con lo instalado anteriormente. Para ello hay que añadir --prefix=/usr:
% cd alsa-utils-xxx % ./configure –prefix=/usr % make install
% modprobe snd-intel8x0;modprobe snd-pcm-oss;modprobe snd-mixer-oss;modprobe snd-seq-oss
Una vez instalado el entramado de ALSA, hay que ajustar los ficheros de configuración para que estén acordes con nuestros dispositivos. En los núcleos de la rama 2.6, ya no se utiliza /etc/modules.conf sino /etc/modprobe.conf para cargar los módulos al arrancar la máquina. La configuración de los módulos que necesitan ser cargados para cada tarjeta se puede encontrar en ALSA Soundcard Matrix, así como otros parámetros dependientes de la tarjeta. Para la mía en concreto, la configuración es:
# ALSA portion alias char-major-116 snd alias snd-card-0 snd-intel8x0 # module options should go here # OSS/Free portion alias char-major-14 soundcore alias sound-slot-0 snd-card-0 # card #1 alias sound-service-0-0 snd-mixer-oss alias sound-service-0-1 snd-seq-oss alias sound-service-0-3 snd-pcm-oss alias sound-service-0-8 snd-seq-oss alias sound-service-0-12 snd-pcm-oss
Nota para los debianitas: esta información debe guardarse en /etc/modprobe.d/ (/etc/modprobe.d/alsa por ejemplo) y ejecutar update-modules
Nota para usuarios de RedHat y similares: existe una utilidad llamada alsaconf (/usr/sbin/alsaconf) que permite detectar la tarjeta de manera automática y que actualiza el fichero /etc/modprobe.conf.
Parece que ya está todo bien configurado, así que se trata de escuchar algo por los altavoces. La correcta instalación habrá creado el fichero /etc/init.d/alsasound (si no, bastará con copiarlo desde /usr/src/alsa/alsa-driver-XXX/utils y darle los permisos necesarios, chmod 755, como superusuario) que será el encargado de salvar y cargar la configuración que hayamos definido. Para que se ejecute cuando es debido, podemos recurrir a la utilidad chkconfig para que lo ejecute en los runlevels adecuados:
% /sbin/chkconfig --add alsasound
Para ver cómo ha quedado:
% /sbin/chkconfig --list alsasound
Ahora podemos optar bien por reiniciar la máquina, bien por arrancar el servicio en cuestión. Como dicen por ahí, lo de reiniciar no está hecho para usuarios/as de GNU/Linux, así que mejor arrancamos el servidor nosotros/as mismos/as:
% /etc/init.d/alsasound start
Para empezar a usar la tarjeta, deberemos desenmudecer los canales que actualmente lo están. Para ello se cuenta con la utilidad alsamixer:
% alsamixer
Como mínimo deberemos ajustar los canales Master y PCM, además de los que sean pertinentes para la utilización de cada uno/a. Para poder grabar la configuración actual, existe el programa alsactl, que guarda y carga la configuración al apagar y encender el sistema respectivamente. Dicho programa es llamado por el script alsasound.
Para poder aprovechar al máximo las posibilidades de nuestro hardware, echad un vistazo a la página sobre asoundrc, donde se explica cómo modificar los ficheros de configuración correspondientes, localizados en $HOME/.asoundrc (para el usuario en particular) y /etc/asound.conf (de manera general).
Primero conviene mirar la última información disponible tanto en la FAQ del proyecto Alsa, como en las AlsaTips. Además, es bueno trabajar con la última versión estable disponible.
A continuación se presenta una lista con problemas típicos:
Problemas de permisos (ejecutar como superusuario):
% chmod 666 /dev/snd/*
Para los drivers de OSS:
% chmod 666 /dev/mixer* /dev/midi* /dev/dsp* /dev/sequencer*
Sin embargo, ésta no es la forma correcta de actuar debido a los problemas de seguridad que genera porque no respeta la filosofía de usuarios y grupos. Lo que habría que hacer es dar los permisos pertinentes al grupo audio de acceso a los dispositivos e incorporar a ese grupo a todos los usuarios que quieran disfrutar de sonido.
Diagnóstico general.
Existe un script llamado aadebug que muestra información necesaria sobre Alsa y en caso de fallo, el motivo del mismo con el, objetivo de facilitar su solución. Más infromación en la página de Aadebug. Básicamente se trata de copiar el script a un fichero de texto y hacerlo ejecutable. Si tenemos el fichero de texto llamado aadebug con el script en cuestión:
% chmod +x aadebug
% ./aadebug
Para todos aquellos que poseen una tarjeta de sonido limitada (como la mía), es posible que el sistema se quede bloqueado porque dos aplicaciones intentan utilizar la salida de la tarjeta de sonido de forma simultánea. La solución a ese problema es utilizar el plugin dmix para la salida digital PCM. Para más información sobre dmix, consultad la página del plugin dmix y la página de los plugins de PCM.
La solución a este problema se ataja con los ficheros de configuración de ALSA que son .asoundrc para cada usuario y /etc/asound.conf para el sistema en general. A continuación reproduzco los míos, ya que para una configuración más fina es necesario leer la documentación asociada:
$ cat .asoundrc pcm.intel8x0 { type hw card 0 } ctl.intel8x0 { type hw card 0 } $ cat /etc/asound.conf pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 8192 rate 44100 } bindings { 0 0 1 1 } } pcm.dsp0 { type plug slave.pcm "dmixer" } pcm.!default { type plug slave.pcm "dmixer" } pcm.default { type plug slave.pcm "dmixer" } ctl.mixer0 { type hw card 0 }
Sobre ALSA:
Sobre la migración a la rama 2.6 del núcleo: