Aus Linux-Magazin 09/2005

Der professionelle Audioserver Jack

Wollen mehrere Anwendungen gleichzeitig auf Audiohardware zugreifen, wird das unter Linux zum Problem. Die gängige Lösung ist ein Soundserver, der direkte Hardwarezugriffe kapselt. Jack ist ein Exemplar dieser Gattung, das alle Qualitäts- und Geschwindigkeitsansprüche befriedigt.

Das große Problem bei digitaler Musikproduktion besteht darin, die Zeitspanne klein zu halten, die verstreicht, bis Audiodaten von der Soundkarte beim Programm ankommen und umgekehrt. Die Verzögerung (Latenz) entsteht hauptsächlich durch Zwischenspeicherung der Daten. Bemerkbar macht sie sich immer dann, wenn Software-Effekte in Echtzeit berechnet oder während des Abspielens neue Signale aufgenommen werden. Eine Verzögerung von über 10 Millisekunden ist für das menschliche Ohr hörbar und daher störend.

Für den Desktop-Rechner wünschen sich viele Anwender, dass der gerade erklingende Systemton nicht den MP3-Player blockiert – Stichwort Device busy. Die Linux-Sound-Systeme OSS (Open Sound System) und Alsa erlauben von Haus aus aber nur je einer Anwendung den Zugriff. Die Lösung ist häufig ein Soundserver wie der ESD des Gnome-Projekts [1] oder der Analog Realtime Synthesizer Arts [2] in KDE. Arts ist zwar leistungsstärker als ESD, beide arbeiten dennoch mit spürbarer Latenz.

Dagegen ist der Audioserver Jack [3] ein recht junges Projekt, das mit minimaler Latenz auch sehr hohen Ansprüchen genügt. Er verbindet die Programme nicht nur mit der jeweiligen Audiohardware, sondern auch untereinander (so genanntes Audiorouting). Die virtuellen oder echten Endpunkte solcher Verbindungen heißen Ports.

Virtuelle Audiokabel

Programme wie der Harddisk-Rekorder Ardour ermöglichen die direkte Konfiguration der Jack-Ports. Andere sind auf externe Software wie Qjackctl [4] angewiesen, um Ports zu verbinden. Qjackctl steuert Jack (Abbildung 1) und verknüpft auch Alsa-Midi-Ports mit Midi-fähigen Programmen oder Hardware (Abbildung 2). Jack beherrscht Midi bislang nicht. Als weiteres wichtiges Feature für den professionellen Einsatz synchronisiert Jack über einen eigenen Systemtakt angeschlossene Anwendungen. Andernfalls könnten auch Audioprogramme, die dieselbe Samplerate verwenden, zum Beispiel um die Zeitdauer eines halben Sample versetzt arbeiten.

Die Installation von Jack ist recht einfach, für optimale Performance sind einige Details zum Dateisystem zu beachten, die der Kasten “Dateisysteme für Jack” näher beschreibt. Der Befehl »jackd -d alsa« startet den Jack-Daemon mit Alsa-Ausgabe. Andere Startparameter bestimmen beispielsweise die Samplerate und den Alsa-Port. Wichtig ist es, den Server und die Client-Anwendungen unter derselben User-ID zu starten, andernfalls verweigert Jack den Dienst. Wer mit der Option »-R« Realtime-Priorität einstellt, muss also alle Programme als Root laufen lassen oder einen Weg finden, solche Rechte auch normalen Usern zuzuweisen.

Minimaler Overhead

Jack ist von Grund auf für geringe Latenz und professionelle Nutzung konzipiert. Im Hintergrund läuft ein schlanker Server, der mit möglichst wenig Kopieroperationen Audiodaten zwischen Anwendung und Hardware bewegt. Ein Audioprogrammierer macht über die Jack-Library von den Jack-Funktionen Gebrauch. Jack spricht Audiohardware nicht direkt an, sondern benutzt dafür verschiedene Backends, in den meisten Fällen wohl Alsa. Das Routing zwischen Audioprogrammen lässt sich nutzen, um Effekte einzubinden, zum Beispiel mit LADSPA-Plugins und dem Jack-Rack [5] (Abbildung 3, [5])

Dateisysteme für
Jack

Da Jack für den Datenaustausch in »/tmp« Fifos und Dateien anlegt, sollte sich das Verzeichnis nicht auf einem modernen Journaling-Dateisystem befinden. Echte Schreibvorgänge können nämlich zu signifikanten Festplattenzugriffen und somit zu hörbaren Aussetzern führen. Am besten liegt das Verzeichnis »/tmp« also auf einem Tmp-Filesystem. Der Eintrag in »/etc/fstab« lautet:

none /tmp tmpfs defaults

Falls dies nicht möglich ist, lässt sich beim Kompilieren von Jack auch ein anderes Verzeichnis einstellen: »–with-default-tmpdir=/mnt/ramfs«. Außerdem setzt Jack noch ein funktionierendes Shared-Memory-Dateisystem »/dev/shm« voraus.

Abbildung 1: Die Buttons im Hauptfenster von Qjackctl steuern den Jack-Server.

Abbildung 1: Die Buttons im Hauptfenster von Qjackctl steuern den Jack-Server.

API: Pull statt Push

Jack hilft die Soundausgabe eines Programms aufzunehmen oder geeignete Anwendungen zu einem virtuellen Studio zu verbinden. In dieser Funktion ist Jack das Open-Source-Gegenstück zu Rewire [6] von Propellerheads und Steinberg, das unter Windows und Mac OS X Musikprogramme verbindet.

Der Trick, trotz Routing zwischen mehreren Anwendungen geringe Latenz zu erreichen, besteht darin, die Programme nicht, wie sonst üblich, die Daten selbst schreiben zu lassen (Push). Stattdessen registrieren Anwendungen bei Jack Callback-Funktionen, die Audiodaten liefern respektive abholen (Pull).

Eine solche Architektur verhindert, dass Audio-Anwendungen Lese- und Schreiboperationen durchführen, die unter ungünstigen Umständen blockieren. Diese Arbeitsweise entspricht weitgehend dem Design von Core-Audio, dem Audiosubsystem von Mac OS X, das für seine hervorragende Performance bestens bekannt ist.

Trotz der zahlreichen Features ist das API von Jack überraschend einfach aufgebaut. Die Funktion »jack_client_new()« meldet einen Client beim Jack-Daemon an, »jack_set_process_callback()« setzt die Callback-Funktion. Als Nächstes muss der Programmierer pro Kanal mit »jack_port_register()« einen Port öffnen, bei Stereo also zwei Ports. Nach diesen Vorbereitungen aktiviert er mittels »jack_activate()« die Verarbeitung des neuen Clients im Jack-Daemon. Die Funktion »jack_deactivate()« stoppt die Verarbeitung, bevor »jack_client_close()« den Client vollständig abmeldet.

Neben diesen Grundfunktionen gibt es noch viele weitere, zum Beispiel um Einsprungpunkte (Hooks) zu definieren, die Jack aufruft, wenn sich Blockgrößen oder Latenzen ändern, aber auch solche, um Parameter wie Latenzen abzufragen oder zu setzen.

Abbildung 2: Qjackctl verbindet virtuelle und echte Audioports.

Abbildung 2: Qjackctl verbindet virtuelle und echte Audioports.

Die Konvertierung einer Applikation zum Pull-Modell von Jack kann sehr aufwändig sein und in einigen Fällen das Neudesign des gesamten Anwendungskerns erfordern. Um Latenz-unkritische Programme – etwa einen Musikplayer – Jack-fähig zu machen, gibt es mit Bio2jack [7] eine Bibliothek, die diesen Vorgang vereinfacht.

Bio2jack enthält ein Push-API mit einer Write-Funktion, die einen internen Puffer füllt, den der Jack-Callback dann abholt. Das sorgt natürlich nicht für geringe Latenz, ermöglicht es aber, eigene Programme in kurzer Zeit mit Jack-Audiosupport zu versehen.

Abbildung 3: Das Jack-Rack ist ein virtuelles Rack für digitale Soundeffekte.

Abbildung 3: Das Jack-Rack ist ein virtuelles Rack für digitale Soundeffekte.

Die Zukunft gehört Jack

Jack ist ein moderner Soundserver, der mit seiner geringen Latenz auch hohen Ansprüchen genügt. Er ermöglicht das Verschalten von Audio-Anwendungen zu einem virtuellen Studio und bietet dabei einen eigenen Takt zur Synchronisierung. Ardour ist sogar ein Programm, das sich für die Soundverarbeitung ganz auf Jack spezialisiert.

Ansonsten kann man aus einer breiten Palette von Jack-kompatiblen Programmen wählen, von kleinen Utilities wie einem Effekt-Rack oder einer Aussteuerungsanzeige bis zu ausgewachsenen Anwendungen wie Rezound und Wired. Sogar ein Videoplayer bedient sich des Jack-Takts zur Synchronisation [8]. Eine Liste von Anwendungen mit Jack-Support führt [9]. (ofr)

Infos

[1] Esound: [http://www.tux.org/~ricdude/EsounD.html]

[2] Arts: [http://www.arts-project.org]

[3] Jack: [http://jackit.sourceforge.net]

[4] Qjackctl: [http://qjackctl.sourceforge.net]

[5] Jack-Rack: [http://jack-rack.sourceforge.net]

[6] Rewire: [http://www.propellerheads.se/technologies/rewire/index.cfm]

[7] Bio2jack: [http://bio2jack.sourceforge.net]

[8] Jack-synchroner Videoplayer Xjadeo: [http://sourceforge.net/projects/xjadeo]

[9] Jack-Anwendungen: [http://jackit.sourceforge.net/apps]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben