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 ;-)

Equalizer für Pulseaudio

Samstag, 19. Juni 2010

Bei der gerade laufenden WM hört man ja immer wieder Proteste gegen die Vuvuzelas. Ob die Fernsehanstalten die nicht (oder besser als bis jetzt) rausfiltern könnten. PulseAudio kann das. Dazu muss nur ein kleines Tool installiert werden, das einen vollständigen Equalizer für PulseAudio bereitstellt. Die Anleitung dazu habe ich ursprünglich bei Linux und ich gefunden, in den Kommentaren wurde allerdings noch diese Seite erwähnt, die beschreibt, wie man die Frequenzen des Equalizers anpasst und die optimale Konfiguration gegen die Vuvuzelas einstellt. Das ganze lässt sich natürlich auch für andere Zwecke nutzen ;-)

Equalizer für PulseAudio

Equalizer für PulseAudio

Der Equalizer funktioniert insofern, dass ein zusätzliches Ausgabegerät und ein virtueller Stream bereitgestellt wird. Das Ausgabegerät wird zum Default-Gerät gemacht und alle Wiedergaben auf das Gerät umgeleitet. Diese virtuelle Gerät wird über den Equalizer dann mit dem Stream verknüpft. Der spielt das ganze dann auf der Soundkarte ab. In pavucontrol ist das ganze zu sehen, wenn man unter Aufnahmegeräte bzw. unter Wiedergabe “Alle Spuren” auswählt. Hier lassen sich natürlich auch PA-typische Finessen anwenden, beispielsweise alle Anwendungen wieder direkt auf die Soundkarte legen und nur den zu filternden Stream über den Equalizer laufen zu lassen. Auch die Ausgabe des Equalizers lässt sich verschieben, beispielsweise auf eine zweite Soundkarte.

pavucontrol - Ausgabegeräte

pavucontrol - Ausgabegeräte

pavucontrol - Wiedergabe

pavucontrol - Wiedergabe

Funktionsweise des Equalizers

Funktionsweise des Equalizers

Ich hatte z.B. folgendes versucht:

  1. Fernseher-Ausgang mit Mikrophon-Eingang verbinden
  2. Equalizer aktivieren
  3. Mikrophon-Eingang abspielen: $ parec|pacat
  4. Alle anderen Streams wieder direkt auf die Lautsprecher legen
  5. Die Ausgabe des Equalizers auf den externen Ausgang legen, über Stereo-Anlage abspielen

So laufen die anderen Programme ungefiltert durch. Das ganze scheiterte allerdings an der schlechten Audio-Qualität des Fernsehers. Meine Hardware ist nun mal kein Home-Cinema ;-)

PulseAudio steuern

Freitag, 18. Juni 2010

PulseAudio Volume Control (pavucontrol)

Seit Karmic gibt es einen neuen Einstellungsdialog für Klänge. Darin kann man auch einzelne Anwendungen in der Lautstärke regeln (*der* Vorteil von PA). Ausführlicher und auch in früheren Ubuntu-Versionen geht es mit dem PulseAudio Volume Control (pavucontrol). Installation möglich über das Software-Center, Synaptic, apturl oder im Terminal:

$ sudo apt-get install pavucontrol

Das Tool besteht aus 5 Tabs:

PulseAudio Volume Control (pavucontrol)

PulseAudio Volume Control (pavucontrol)

Unter Wiedergabe lassen sich alle Anwendungen, die etwas abspielen in der Lautstärke regeln oder auf andere Soundkarten verschieben. Wer z.B. ein Bluetooth-Headset hat, kann einstellen, welche Anwendungen die Soundkarte und welche das Headset benutzen. Über den Schloss-Button an jedem Stream (bei PulseAudio Sink oder Senke genannt) lassen sich die Kanäle entriegeln, um links und rechts getrennt steuern zu können. Unter Aufnahme lässt sich logischerweise das gleiche tun, nur handelt es sich um die aufnehmenden Anwendungen.

Unter Ausgabegeräte lässt sich die Gesamtlautstärke alle Ausgabegeräte (Soundkarten/Headsets) regeln, analoges Vorgehen unter Eingabegeräte.

Der letzte Tab ist relativ uninteressant, hier lässt sich die Art der Ausgabe auf den Sound-Geräten festlegen.

Weitere Hilfsprogramm für PulseAudio

In den Paketquellen gibt es weitere Hilfsprogramme für PA. Installation über apturl oder das Terminal:

$ sudo apt-get install padevchooser paman paprefs pavucontrol pavumeter pulseaudio-utils

Der PA Volume Meter (pavumeter) ist nichts weiter als eine Lautstärkeanzeige (Wiedergabe und Aufnahme).

Der PA Manager (paman) zeigt technische Details zu PA, wie verbundene Clients, Sinks, Module und Geräte.

Die PA-Einstellungen (paprefs) lassen ein paar Optionen ändern, insbesondere für Netzwerkwiedergaben und -freigaben. Im letzten Tab ist allerdings noch eine Checkbox “Virtuelles Ausgabegerät zur simultanen Ausgabe auf allen Soundkarten zur Verfügung stellen”. Das ist vor allem interessant, wenn man mit mehreren Ausgabegeräten arbeitet. Wenn die Option aktiviert ist, taucht in pavucontrol ein weiteres mögliches Ausgabegerät auf. Senken, die auf dieses Gerät geleitet werden, hört man auf allen Ausgabegeräten gleichzeitig.

Zuletzt ist noch der PA Device Chooser (padevchooser) zu nennen. Wenn er gestartet ist, nistet er sich im Benachrichtigungsbereich ein und bietet von dort aus Zugriff auf alle diese Hilfsprogramm. Es lassen sich auch Standard-Ein-/Ausgabegeräte ändern. In den padevchooser-Einstellungen lässt sich außerdem einstellen, dass man über neu entdeckte Netzwerk-PA-Geräte informiert wird.

PulseAudio Device Chooser (padevchooser)

PulseAudio Device Chooser (padevchooser)

Im Paket pulseaudio-utils sind noch einige Programme, die vor allem für das Terminal gedacht sind. paplay kann eine einfache WAVE-Datei abspielen, parec kann einen PulseAudio-Stream vom Mikrofon aufzeichnen, den pacat dann abspielen kann. Womit wir zum nächsten kämen:

Audio-Umleitungen

Wenn man etwas öfter mit Audio arbeitet, möchte vielleicht ein wenig mit den Streams spielen. Mit PulseAudio hat man einiges an Möglichkeiten, z.B. Audio zwischen Ein- und Ausgabegeräten umzuleiten.

Interessant ist dieser Befehl, der den Stream vom Mikrofon sofort wieder abspielt:

$ parec|pacat

Damit tauchen gleichzeitig zwei neue Senken in pavucontrol auf, dort kann man dann natürlich das richtige Ein- und Ausgabegerät auswählen. Die Weiterleitung lässt sich im Terminal durch [STRG+C] beenden.

Aber auch der umgekehrte Effekt, die Umleitung der Ausgabe einer Anwendung auf die Eingabe einer anderen Anwendung ist möglich. Dazu gibt es in pavucontrol bei Aufnahme bzw. Eingabegeräte die Monitor-Funktion. Stellt man unter Eingabegeräte die Dropdown rechts unten von “Alle außer Beobachter” auf “Alle Eingabegeräte”, werden noch weitere Eingabegeräte sichtbar. PulseAudio stellt nämlich für jedes Ausgabegerät ein entsprechendes Eingabegerät bereit, welches dann “Monitor of <Ausgabegerät> heißt. Unter Aufnahme kann eine Anwendung diese Senken aufzeichnen. Dabei zeichnet sie auf, was auf dem Gerät wiedergeben wird. Damit ist es beispielsweise möglich, ein Internetradio zu starten, Audacity aufnehmen zu lassen und auf den Monitor zu schalten.

Applet für das Gnome Panel

Wer öfters einzelne Anwendungen regeln will (aber nicht mehr), dem sind die Klang-Einstellungen oder pavucontrol vielleicht schon zu kompliziert. Dafür gibt es ein Projekt namens gnome-pulse-applet. Auf der Projektseite gibt es fertige Debian-Archive zur Installation unter Ubuntu. Wenn es installiert ist, kann es als Applet zum Gnome-Panel hinzugefügt werden. Darüber lassen sich alle wiedergebenden Programme in der Lautstärke regeln, aber mehr auch nicht. Zum ausführlichen Wechseln zwischen Soundkarten ist immer noch pavucontrol das Tool der Wahl.

PulseAudio und ALSA

Freitag, 18. Juni 2010

Eigentlich wollte ich gestern einen Sammelpost mit Tipps und Tricks über PulseAudio schreiben. Als ich fast fertig war, war WordPress aber anderer Meinung, weswegen ich jetzt alles nochmal überarbeiten und korrigieren darf. Und ich habe mir überlegt, lieber einige kleinere Artikel zu schreiben, das wird also eine kleine Reihe.

Im ersten Teil möchte ich mich mit PulseAudio und ALSA beschäftigen. ALSA ist ein älteres Soundsystem, das noch von vielen Programmen direkt angesprochen wird, während sich langsam PulseAudio durchsetzt. Bei letzterem spreicht eine Anwendung nur noch PulseAudio an, das dann ALSA für die Ausgabe benutzt. Leider kommt es dabei öfters mal zu Problemen und Konflikten zwischen beiden, wenn man Programme benutzt, die nicht PulseAudio-kompatibel sind. Sie versuchen direkt mit der Soundkarte zu kommunizieren, was zwei Probleme verursacht: Wenn PulseAudio gerade darauf etwas abspielt, weil eine Pulse-Anwendung gerade läuft, wird das ALSA-Programm scheitern. Oder das ALSA-Programm hat Erfolg, allerdings kann dann PulseAudio nichts mehr wiedergeben.

Bekannte Täter sind vor allem ältere Versionen des Flash-Player sowie von Skype. Mit Audacity und HTML5-Video/-Audio in Firefox hatte ich auch schon Probleme. Mit Flash soll angeblich seit Version 10 mit PulseAudio klar kommen, allerdings lief es bei trotzdem nicht richtig.

Was mir geholfen hat, war, ein ALSA-Plugin für PulseAudio einzurichten. Dazu ist zunächst libasound2-plugins zu installieren:

$ sudo apt-get install libasound2-plugins

Danach weisen wir ALSA an, PulseAudio zu nutzen. Dazu legen wir die (versteckte) Datei .asoundrc im Home-Verzeichnis an und fügen folgendes ein:

pcm.!default
{
  type pulse
}
ctl.!default
{
  type pulse
}

Jetzt müssen wir noch ALSA und PA neustarten:

$ sudo alsa reload
$ pulseaudio -k
$ pulseaudio &>/dev/null &

Danach sollten ALSA- und PA-Anwendungen problemlos gleichzeitig laufen.

Sollte eine Anwendung immer noch nicht korrekt funktionieren, hilft es möglichweise, sie über das Terminal aufzurufen, allerdings den Befehl padsp vorzustellen. Bei Audacity hat mir das geholfen:

padsp audacity