Modelo arquitectónico de ALSA
(Advanced Linux Sound Architecture)
Subsistema pcm
por David García Garzón (Vokimon), david punto garcia en upf punto edu
Nota:
Este manual está en construcción y es muy posible que haya
erratas y secciones incompletas.
Si quieres ayudar, puedes ver algunos temas a
resolver activando la hoja de estilo Default with TODO's.
Normalmente en el menu Ver o Visualizar de tu navegador.
Subsistema pcm
Características
Los datos que circulan por un flujo pcm representan
audio digital muestra a muestra (Pulse Code Modulation) aunque
también se soportan otros formatos basados en representación espectral
como mp3.
Aún con esta limitación, hay muchas formas de representar el audio digital,
por lo que la representación que se use es una característica de cada flujo.
Ello incluye:
- Canales:
- Frecuencia de muestreo:
- Codificación:
Dispositivos predefinidos
ALSA establece algunos nombres de conveniencia para dispositivos pcm.
De esta manera nos evitamos montarlos a mano a base de plugins.
Cuando especificamos un dispositivo fuente o sumidero de audio,
ALSA permite especificar dispositivos alternativos, no solo las tarjetas de áudio.
La lista de dispositivos que podemos hacer servir es:
- Dispositivo por defecto (default)
- Es que que tenemos configurado por defecto.
- Al menos que lo redefinamos, corresponde al dispositivo plughw por defecto.
- No tiene parametros
- Dispositivo nulo (null)
- Este dispositivo es un pozo ciego
- En lectura, ofrece silencio.
- En escritura, ignora lo escrito.
- No tiene parametros
- Dispositivos Hardware (hw)
- Dan acceso directo a los controladores de las tarjetas instaladas en el ordenador.
- Los parametros son:
- CARD: Tipo de tarjeta
- DEV: Numero de dispostivo
TODO: Aclarar si el numero es dentro del tipo o es absoluto
- SUBDEV: Numero de puerto dentro de la tarjeta (para tarjetas con varios puertos de salida).
- Al especificar el DEV y el SUBDEV, -1 indica cualquiera disponible.
- La nomenclatura que siguen es: hw:<device>,<device>,<device>
- Ejemplos:
hw
hw:0
hw:0,0
hw:supersonic,1
hw:soundwave,1,2
hw:DEV=1,CARD=soundwave,SUBDEV=2
- Dispositivo hardware con conversiones automáticas (plughw)
- Envuelve el accesso directo al controlador final con un plugin de conversion automática
(tipo plug).
- Permite un uso más fácil pero tiene penalización de latencia y eficiencia.
- Recibe los mismos parámetros que un dispositivo hw
- Dispositivo de conversión automática (plug)
- Dispositivo de memoria compartida (shm)
- Se usa para conectarse con dispositivos remotos (Ver Contactando con dispositivos remotos).
- TODO
- Dispositivo de bifurcación (tee)
- Una bifurcación permite desviar el flujo hacia un fichero a la vez que
hacia una segunda conexion slave.
- Parametros
- SLAVE: Dispositivo encapsulado
- FILE: Fichero a donde se redirigirán los datos
- FORMAT: Formato de los datos en el fichero (por ejemplo, raw)
- Dispositivo de fichero (file)
- Es equivalente a una bifurcación en la que el slave es el dispositivo nulo null
- Los parametros son los mismos pero no hace falta indicar el slave.
- Dispositivo de mezcla (dmix)
- TODO: descripción
- Parámetros:
- SLAVE: Dispositivo encapsulado (default hw:0,0
- FORMAT: Formato de los datos en el fichero (por defecto, S16_LE)
- RATE: The mixed sampling rate
- Dispositivo de entresacado (dsnoop)
- TODO: descripción
- Parámetros:
- SLAVE: Dispositivo encapsulado (default hw:0,0
- FORMAT: Formato de los datos en el fichero (por defecto, S16_LE)
- RATE: The mixed sampling rate
Plugins pcm
Conocer los plugins te permitirá crear tus propios dispositivos,
explotar a fondo las posibilidades de ALSA o
simplemente, entender como funciona ALSA por dentro.
Si quieres puedes obviar esta sección y usar directamente los dispositivos predefinidos
que se explican en la siguiente sección.
Plugins finales
- hw: Es un plugin final que comunica directamente con el controlador cargado
en el nucleo del sistema operativo.
Parametros:
- card: Nombre o ordinal del controlador
- device: Ordinal del dispositivo físico,
pues puede haber dos tarjetas del mismo tipo en el sistema.
Por defecto, 0
- subdevice: Ordinal del puerto.
Por defecto, -1 que significa el primero disponible.
- shm: Es un plugin final que comunica con el alsa server via memoria compartida.
TODO: que es el aserver? Como funciona esto?
- null: Es un plugin final que hace de pozo ciego:
En captura devuelve siempre ceros y en escritura descarta los datos.
Plugins lineales
Estos plugins modifican el flujo de un dispositivo slave,
normalmente para adaptar el formato.
- copy: Copia los datos del slave sin modificación.
TODO: No parece demasiado util
- linear: Adapta entre formatos lineales (signed/unsigned...)
- lfloat: Adapta entre lineal y coma flotante
- mulaw: Adapta entre lineal y μlaw
- alaw: Adapta entre lineal y A-law
- adpcm: Adapta entre lineal y Ima-ADPCM
- route: Adapta el número de canales (ajustando el volumen)
- rate: Adapta la frequencia de muestreo
Notas:
- Todos ellos llevan como único parámetro el dispositivo slave.
- Master y slave necesitan coincidir en el resto de caracteristicas que no se modifican:
número de canales, formato o frecuencia de muestreo.
- Se usa el mismo plugin para ambas direcciones de conversion.
Otros plugins
- plug: Hace todas las conversiones necesarias automáticamente.
Parametros:
- slave: Nombre o definición del dispositivo slave.
La definición del slave podría especificar valores concretos para
rate, channels o format.
- route_policy:
- ttable: estructura de dos niveles que indica que proporción (valor)
de cada canal del master (primer nivel) va a parar al canal slave
- TODO: Documentar mejor el tema de la ttable y el route policy
- file: Deriva los datos a un fichero.
Parametros:
- slave: Nombre o definición del dispositivo slave.
- file: file name or number fd.
- format: The format to be stored on the file.
- multi: TODO.
- mix: TODO.
- share: TODO: Parte los canales en diferentes
- meter: TODO: Añade la monitorización de un parametro.
Parametros:
- frequency: La frecuencia de monitorización.
- scopes: Un array plugins de monitorización.
- dmix: TODO: Permite multiples clientes que seran mezclados.
- dshare: TODO.
- dsnoop: TODO.
- ladspa: Pasa el flujo por un plugin de efectos LADSPA.
Parametros:
- slave: Nombre o definición del dispositivo slave.
- plugins: Una array de especificaciones de plugins
(ver el apartado sobre Ladspa).
- capture_plugins o playback_plugins:
alternativas a plugins pero que solo se aplican
en una dirección.
- format: The format to be stored on the file.
- jack: TODO.
- hooks: TODO.
Definición Slave
TODO: Definición slave
Monitorización
El plugin pcm meter de ALSA permite crear dispositivos
que monitorizan el flujo de audio sin modificarlo.
Normalmente, se usan para implementar osciloscopios
o otros elementos de visualización.
Para ello, hay que declarar en la configuración un pcm_scope_type.
Por ejemplo, para definir el tipo de scope spectrogram como el que implementa
la hipotética librería /usr/local/lib/libspectrogram.so deberíamos añadir
a la configuración la linea:
pcm_scope_type.spectrogram.lib = "/usr/local/lib/libspectrogram.so";
Para crear un dispositivo que añada esa monitorización al dispositivo midispositivo,
simplemente tenemos que hacer servir el plugin meter.
pcm.monitorizado {
type = meter;
slave.pcm = midispositivo;
frequency = 50; # actualizaciones por segundo
scopes.0.type = spectrogram;
}
scopes es un atributo de tipo array, por lo que podriamos especificar varios
elementos de monitorización.
Integración con LADSPA
Aviso:
La palabra plugin se usa tanto en ALSA como en LADSPA.
Solo dentro de esta sección, especificaré, para reducir confusiones,
plugin ALSA o plugin LADSPA según sea el caso.
LADSPA es una arquitectura de plugins que permite a diferentes
aplicaciones compartir un conjunto de algoritmos de procesado de audio
(efectos de sonido, para entendernos) instalados en el sistema.
Principios de funcionamiento:
- Un plugin LADSPA es, en realidad, una librería dinámica (.so).
- Dicha librería contiene funciones que siguen un interfaz determinado.
- Un host LADSPA es una aplicación que hace servir dicho interfaz.
- El interfaz uniforme permite que cualquier plugin LADSPA
se pueda usar en cualquier host LADSPA de forma intercambiable.
Propiedades de los plugins LADSPA:
- Se puede seleccionar un plugins LADSPA mediante:
- un identificador numérico,
- un nombre descriptivo, o,
- el nombre del fichero.
- Un plugin tiene una serie de puertos por los que entra o sale el flujo de datos.
- Un plugin tiene una serie de parámetros (controles) que se pueden cambiar en tiempo real.
- Podemos identificar cada control y cada puerto por su nombre o por su posición numérica.
Como usar LADSPA dentro de ALSA?
- Podemos hacer que la salida y/o la entrada a un dispositivo ALSA se vea
procesada por un plugin de efectos LADSPA o una cadena de ellos.
- Para ello se utiliza el plugin ALSA de tipo ladspa.
- Podemos configurar el dispositivo ladspa para que afecte a ambos sentidos
del flujo o solo a uno.
Para hacer compresion en la grabación podemos usar el siguiente dispositivo.
pcm.compressor
{
@arg
type ladspa;
slave.pcm hw;
# La politica duplicar indica que hay que aplicar el mismo plugin
# que se aplica en el canal 0, a todos los canales.
policy duplicate;
plugins.0
{
# Podemos usar 'id' o 'file' como alternativas
# a 'label'
label compress_rms
bindings
{
}
TODO: Complete this
{
}
TODO: Utilidades que vienen con el SDK
TODO: Otras utilidades genericas como el dummy tester
Integración con JACK
TODO: Explicación de la arquitectura JACK
TODO: Como hacer que las aplicaciones JACK se puedan conectar a un dispositivo ALSA?
TODO: Como hacer que las aplicaciones ALSA se puedan conectar a un puerto JACK?
pcm.jackplug {
type plug
slave { pcm "jack" }
}
pcm.jack {
type jack
playback_ports {
0 alsa_pcm:playback_1
1 alsa_pcm:playback_2
}
capture_ports {
0 alsa_pcm:capture_1
1 alsa_pcm:capture_2
}
}
TODO: Dispositivos y plugins en otros subsistemas