Linux

Introducción

En linux hay una gran variedad de tecnologías: OSS, alsa, pulseaudio, jack, esd, … Intentaré poner un poquito de orden para ver dónde encaja cada una de estas tecnologías.
Una interesante fuente de información en castellano es linuxav.

Arquitectura de audio en Linux

Muy basado en este artículo (ojo los, comentarios que hay debajo son también muy interesantes).

OSS: Open Sound System

La versión v3 está en desuso. No tenía capacidades de mezclado. ALSA nació para solventar sus problemas.

La v4 ahora es open source y tiene mezclado en el kernel (elimina la latencia de ALSA) -en particular, siempre hay mezclado-. El mezclado de OSS es de mayor calidad que el usado por ALSA. Ofrece mezclado por aplicación (ALSA no).

ALSA:Advanced Linux Sound Architecture

ALSA nace para eliminar los problemas que tenia OSS v3.

Por un lado, ALSA forma parte del kernel. Esto es, ALSA es quien proporciona los drivers. Para que nuestra tarjeta de sonido funcione en Linux, tiene que estar soportada por ALSA.

ALSA implementa varias APIs con las que las aplicaciones pueden comunicarse para reproducir música. Esta comunicación puede ser: directa, a traves de un mezclador o través de una API compatible con OSS v3 (al que ALSA sustituye).

Sobre ALSA, se pueden poner otras capas que implementan alguno de los métodos anteriores. En ese caso, las aplicaciones podrían comunicarse con esa capa extra. Es normal el usar ALSA a través de otras librerías como libao o SDL que son más portables y simples de usar.

ALSA admite plugins: un conversor de frecuencia de muestreo, un plugin para JACK, un codificador que permite la salida de 6 canales de audio a través de la salida digital S/PDIF (tanto óptica como coaxial). El mezclador de ALSA se llama dmix y en principio intentaremos evitarlo por medio del uso del plugin hw que es salida directa a hardware.

Sobre ALSA y USB mirar aquí

Es bastante interesante este artículo sobre dispositivos en ALSA.

¿Pero uso OSS o ALSA?

Lo mejor es ver si tu tarjeta de sonido está mejor soportada en OSS o ALSA. Ante la duda, ALSA.

Desde el punto de vista del programador:

App -> libao -> OSS API -> OSS Back-end - Good sound, low latency.
App -> libao -> OSS API -> ALSA Back-end - Good sound, minor latency.
App -> libao -> ALSA API -> OSS Back-end - Good sound, low latency.
App -> libao -> ALSA API -> ALSA Back-end - Bad sound, horrible latency.
App -> SDL -> OSS API -> OSS Back-end - Good sound, really low latency.
App -> SDL -> OSS API -> ALSA Back-end - Good sound, minor latency.
App -> SDL -> ALSA API -> OSS Back-end - Good sound, low latency.
App -> SDL -> ALSA API -> ALSA Back-end - Good sound, minor latency.
App -> OpenAL -> OSS API -> OSS Back-end - Great sound, really low latency.
App -> OpenAL -> OSS API -> ALSA Back-end - Adequate sound, bad latency.
App -> OpenAL -> ALSA API -> OSS Back-end - Bad sound, bad latency.
App -> OpenAL -> ALSA API -> ALSA Back-end - Adequate sound, bad latency.
App -> OSS API -> OSS Back-end - Great sound, really low latency.
App -> OSS API -> ALSA Back-end - Good sound, minor latency.
App -> ALSA API -> OSS Back-end - Great sound, low latency.
App -> ALSA API -> ALSA Back-end - Good sound, bad latency.

Servidores de sonido (Gnome: ESounD / KDE: aRts, phonon / PulseAudio)

Nacen debido a que OSS v3 no tenía capacidad de mezclado. Hoy en día no son necesarios y lo que hacen es añadir latencia. Sin embargo, el mezclado de ALSA es malo y sigue careciendo de capacidad de mezclado por aplicación. Ese es el motivo por el que nace PulseAudio.

PulseAudio

Ahora una aplicación puede implementar la API de PulseAudio, implementar la de ALSA pero hacer pasar el sonido por PulseAudio (con mejores controles de sonido), también se pueden usar capas intermedias que hablan con PulseAudio. PulseAudio tiene un mezclado de calidad y un control de volumen por aplicación.

El problema: tantas capas podrían introducir mucha latencia. Sin embargo, hay programadores que apuntan en la dirección contraria (que yo comparto). Parece ser más racional la topología de OSS v4 (que además parece tener una topología agradable para el programador) pero lo cierto es que no recibe mucho apoyo.

JACK: Jack Audio Connection Kit

JACK es un servidor de sonido de baja latencia. Permite el flujo de datos de unas aplicaciones a otras (es como "cablear" de unas aplicaciones a otras). JACK también permite trabajar con poca latencia. Lo mejor es ver sus objetivos de diseño:

  • Baja latencia / Ancho de banda grande entre aplicaciones.
  • Debería soporta cualquier tipo de streaming (no sólo audio) -no requerido-
  • Cada instancia de jack tendrá: 1 servidor y 1 o varios plugins. Podrá haber varias instancias, pero serán independientes.
  • No impone requerimientos a la interfaz.
  • Sincronización de todos los clientes a nivel de sample.
  • El audio lo representa mediante float 32bit entre -1 y 1.
  • Un cliente puede consumir o producir varios flujos de datos.
  • Se pueden conectar aplicaciones en ejecución.
  • Se pueden eliminar plugins mientras el servidor está en ejecución.

Por ello, podemos usar JACK para enviar la salida del audio de un reproductor a un programa que haga por ejemplo filtrado (del MPD a BruteFIR).

example scenario would be an application that needs jackd running with low latency on an ALSA device. ALSA dmix has to be disabled for low latency,

NOTA: investicar comentario de RR. "Hola, las tarjetas USB suelen tener en linux compatibilidad con la interfaz genérica, estéreo 44/16 o 48/16. La cuestión es que en el procesado digital se generan muestras de mayor precisión, y su truncado a 16 bits genera ruido. Por eso conviene tener una interfaz de mayor profundidad de bits y dejar que el ruido de cálculo quede "sumergido" en el ruido del [editado] convertidor. Quede claro que estamos hablando de efectos pequeños, pero lo correcto es lo correcto."

En la misma línea: asound

Configuración

Player

  • MPD: Music Player Daemon (ver el artículo sobre resampleo).

Recomendación

Una vez visto el papel de esta arquitectura, recomiendo ALSA sobre OSS. Evitar el mezclador de ALSA (dmix) y evitar PulseAudio: la idea es no mezclar el audio de la música con ninguna otra aplicación, por lo que su funcionalidad no es necesario. Simplemente para reproducir música JACK no es necesario, pero si pensamos en hacer filtrado digital, necesitaremos JACK para redireccionar los flujos de datos adecuadamente (por ejemplo, de MPD a BruteFIR).

Software

Software Propósito SO
Ardour Edición Linux Mac
Audacity Edición Linux Windows Mac

Ardour, Jack, Jokosher, Jamin, JackRack, PD, Hydrogen, and Seq24, ZynAddSubFX, brutefir, drc, LMMS, hydrogen, pd, csound, sox, Wineasio

alsa, oss, pulseaudio, jack

http://www.maximonet.com/foro/threads/97785-Art%C3%ADculo-El-famoso-tema-del-resampling-de-las-placas.

Por qué un núcleo real time?
http://www.gentoo.org/proj/en/desktop/sound/realtime.xml

* Aqualung - un reproductor de música basado en GTK+
* QjackCtl - herranmienta basada en Qt para controlar JACK
* Ardour - a free digital audio workstation program for Linux
* Baudline - a signal analysis tool
* SuperCollider - a real-time audio programming language
* ChucK - a real-time audio programming language
* CheeseTracker - an Impulse Tracker clone
* Rosegarden - a free digital audio workstation program for Linux
* Freqtweak - a digital EQ
* Hydrogen - an advanced drum machine
* Music on Console - un reproductor de audio escrito en ncruces
* Music Player Daemon
* MusE - a Qt-based MIDI/audio sequencer
* Pure data - a graphical programming language for multimedia
* XMMS - a free music player for X11
* XMMS2 - client/server based redesign of XMMS
* ZynAddSubFX - an opensource software synthesizer

Name Description Windows/Mac analogy Overlay
Ardour Very powerful hard disk multi-track recording software Protools
Audacity Easy-to-use audio editor and recorder
LMMS All-in-one synthesizer, sequencer, and mastering suite FL Studio
Csound Audio programming language with a bajillion opcodes SuperCollider pro-audio
Hydrogen Linux advanced drum machine
Jack-rack Effects rack that works over JACK
Jamin Real-time jack audio mastering
Lilypond The stand-out sheet music typesetter Finale, Sibelus
Meterbridge Jack meter app using SDL
Rosegarden MIDI sequencer with a gentler learning curve
Sox "The swiss army knife of sound processing programs"
Sooperlooper Live looping sampler with immediate loop recording Ableton Live!

http://www.renoise.com/
http://sound.condorow.net/dsp.html
http://www.kokkinizita.net/linuxaudio/
http://eca.cx/ecasound/

http://audiodef.com/blog/
http://www.cicsmemoryplayer.com/index.php?n=CPlay.Download

Salvo que se diga otra cosa, el contenido de esta obra está bajo la licencia: Creative Commons Reconocimiento NoComercial CompartirIgual 2.5 España.