Soundsysteme unter Linux

Donnerstag, 08. Juli 2010

In einem meiner Posts zu PulseAudio gab es in Buzz eine kleine Beschwerde, zur Funktionsweise von ALSA. Daher hier eine kleine, wenn auch etwas späte Erläuterung zur Funktionsweise von Soundsystemen unter Linux. Kleiner Hinweis vorab: Ich bin auch keine Experte auf diesem Gebiet, sondern hab mir meine Infos zusammengesucht, Fehler bitte ich daher zu entschuldigen und mit einem Kommentar aufzuzeigen.

Soundsysteme

Unter Linux gibt es nicht das Soundsystem, es stehen mehrere zur Auswahl. Ich denke, der Markt ist mit diesen hier ziemlich gut abgedeckt:

  • ALSA (Advanced Linux Sound Architecture)
  • PulseAudio
  • ESD (Enlightened Sound Daemon)
  • OSS (Open Sound System)
  • JACK (JACK Audio Connection Kit)

Dazu muss man auch sagen, dass oft mehrere kombiniert werden, da nicht alle vollständige Soundsysteme sind. Einige enthalten keine Treiber, andere sind reine Software-Mixer, die auf andere Systeme aufbauen. Mehr dazu weiter unten.

Mixing

Unter Mixing versteht man Zusammenmischen mehrere Sound-Signale (beispielsweise von Totem und Rhythmbox) zu einem Signal. Dabei gibt es Hardware- und Software-Mixing.

Beim Hardware-Mixing können alle Streams direkt auf die Soundkarte gelegt werden, diese übernimmt dann das Mischen. Das können allerdings nur die wenigsten, höherwertigen Soundkarten. Daher kommt meist Software-Mixing zum Einsatz.

Beim Software-Mixing muss ein Soundserver vorhanden sein, der alle Streams entgegen nimmt, auf dem Prozessor mischt und den gemischten Stream an die Soundkarte weiterleitet. Zu erwähnen ist, das Software-Mixing natürlich zu Lasten der Performance geht. Bei neueren Rechnern macht das nicht viel aus, aber auf älteren Rechner fällt deshalb PulseAudio oft aus.

Wird ein Soundsystem ohne Soundserver benutzt, gibt die Anwendung ihren Stream direkt auf der Soundkarte wieder. Nachteil: Es kann immer nur eine Anwendung gleichzeitig Sound ausgeben.

Treiber

Eine Herausforderung für ein Soundsystem ist es, möglichst viele der auf dem Markt existierenden Soundkarten ansprechen zu können. ALSA ist ein altes, aber keineswegs veraltetes Projekt, das diese Aufgabe ganz gut geschafft hat. Die ALSA-Treiber sind auch Bestandteil des Kernels. Lange Zeit wurde OSS als Treiber-System benutzt, es soll auch einige Geräte besser unterstützen als ALSA. Normalerweise wird jedoch ALSA benutzt.

Routing

Unter Routing versteht man den Weg eines Signals von der Anwendung bis zur Soundkarte. Den kürzesten Weg erhält man bei ALSA ohne Soundserver:

Anwendung–>ALSA-Treiber–>Soundkarte

Allerdings hat man dazu das genannte Problem, dass nur eine Anwendung etwas abspielen kann. ALSA kann auch als Soundserver benutzt werden, dann sieht das Routing so aus:

Anwendung–>AlSA-Mixer–>ALSA-Treiber–>Soundkarte

Wenn das Mixen mit PulseAudio geschehen soll, sieht das Routing so aus:

Anwendung–>AlSA–>PulseAudio–>ALSA-Treiber–>Soundkarte

ALSA benutzt dabei PulseAudio als Mixer, PulseAudio wiederum nutzt die große Treiberpalette von ALSA. Mittlerweile unterstützen viele Anwendungen PulseAudio auch nativ, dann wird etwas kürzer geroutet:

Anwendung–>PulseAudio–>ALSA-Treiber–>Soundkarte

PulseAudio

PulseAudio hat sich zum Ziel gesetzt, möglichst alle Soundsysteme kombinieren zu können. PulseAudio ist stark modularisiert, viele Bestandteile werden also erst dann geladen, wenn sie auch gebraucht werden. In der Wikipedia gibt es eine recht komplexes Bild, das den Aufbau von PulseAudio aber ganz gut zeigt.

PulseAudio unterstützt auf der Software-Seite verschiedene Protokolle, so dass Anwendungen eine große Auswahl an Systemen haben, die alle an PulseAudio weitergeleitet werden. Optimal ist es natürlich, wenn die Anwendung kompatibel ist und direkt mit PulseAudio kommuniziert.

Auf der Ausgabeseite können sowohl ALSA- als auch OSS-Treiber benutzt werden. Üblicherweise kommt aber ALSA zum Einsatz. PulseAudio ist aber auch netzwerkfähig, kann also z.B. eine Soundkarte eines anderen Rechners als Ausgabe benutzen, wenn darauf ebenfalls PulseAudio läuft. Oder es wird als RTP-Server benutzt, der sein Signal ans Netzwerk verteilt. So können mehrere RTP-Geräte im Netzwerk das Signal abspielen.

In der Mitte steht der Core, der alle Streams zusammen mischt. Ein Vorteil von PulseAudio ist, das jeder Stream separat in der Lautstärke geändert werden kann, als jede Anwendung, jede Soundkarte, jeder Netzwerk-Stream, auch die virtuellen Geräte (siehe unten). Außerdem kann für jeden Stream eingestellt werden, auf welchem Ausgabegerät er abgespielt werden soll. PulseAudio mischt dann die richtigen Streams zusammen und spielt sie auf den entsprechenden Geräten ab. Da dies aber alles auf dem Prozessor geschieht, ist PulseAudio relativ rechenintensiv.

PulseAudio bietet auch einige Module, die virtuelle Geräte bereitstellen. Einfaches Beispiel ist das Gerät zur simultanen Ausgabe, welches ich bereits erwähnte. Das tut nichts anderes, als alle Streams, die auf ihm abgespielt werden, an alle verfügbaren Ausgabegeräte zu schicken. Ein Anderes Beispiel ist der Equalizer, welche ein virtuelles Ausgabegerät erstellt, es mit einem virtuellen Stream verknüpft, und dazwischen über ein LADSPA-Modul den Equalizer schaltet.

Funktionsweise des Equalizers

Funktionsweise des Equalizers

JACK

JACK ist für professionelle Tonstudios gedacht, laut ubuntuusers-Wiki sollte man es nicht benutzen, wenn man es nicht wirklich braucht. Ähnlich wie PulseAudio erlaubt es das genau regeln von Streams und Ausgabegeräten, aber da ich es nicht wirklich brauche, habe ich es mir auch nicht weiter angesehen ;-)