JACK

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

  3. Einen Editor öffnen

Inhaltsverzeichnis
  1. Grundlagen
  2. Arbeitsweisen
  3. Nutzung in der Praxis
  4. Installation
  5. JACK steuern
  6. Echtzeitpriorität
  7. Problembehebung
  8. Links

./jack_logo.png JACK 🇬🇧 ist ein Soundserver mit niedrigen Latenzen (Verzögerungszeiten) für POSIX-konforme Betriebssysteme wie GNU/Linux oder Apple Mac OS X. Es kann eine Anzahl von Programmen sowohl mit Audiogeräten als auch untereinander verbinden. Z.B. kann ein erstes Abspielprogramm mit einem Streamserver verbunden, gleichzeitig ein Mikrofon mit Audacity verbunden und auch noch ein zweites Abspielprogramm mit dem Lautsprecher zum Anhören verbunden werden. JACK wurde von Grund auf für den professionellen Einsatz konzipiert, wobei zwei Ziele besondere Bedeutung hatten: Synchronität aller Clients und niedrigste Latenzen.

Was unterscheidet JACK von Soundsystemen auf anderen Betriebssystemen?

Grundlagen

ALSA ist das Grundsystem, welches auch die Gerätetreiber für Soundkarten verwaltet. JACK wiederum setzt auf ALSA auf und bietet einige Vorteile, aber auch Nachteile:

Zudem lassen sich auch mit ALSA MIDI-Anwendungen miteinander verbinden, entweder grafisch mit patchage oder auf der Kommandozeile mit aconnect. Audiodaten hingegen können nur schwer von einer Anwendung zur anderen weitergeleitet werden.

Arbeitsweisen

Um zu verstehen, warum JACK dennoch gebraucht wird, muss man verstehen, wie ALSA und JACK intern arbeiten. Die Verarbeitung von Audio- und MIDI-Daten ist jeweils gleich organisiert.

ALSA

Eine ALSA-Anwendung, die Daten verarbeitet, funktioniert in etwa so:

  1. Das Programm holt die aktuell anstehenden Daten ab, verarbeitet diese und verschickt sie anschließend weiter. Die Verarbeitung der Daten kann unterschiedlich lange dauern. Selbst wenn die Daten praktisch nicht verändert werden, führt schon das Abholen und Versenden zu Verzögerungen.

  2. Damit die Daten dennoch gleichförmig weiterversendet werden, muss das Programm eine gewisse Verzögerung einbauen. Diese Verzögerung muss länger sein, als die Datenverarbeitung im schlimmsten Fall an Zeit benötigt.

Daraus ergeben sich zwei schwerwiegende Probleme:

JACK

JACK dreht den Spieß um: Es wartet nicht darauf, dass ein Anwendungsprogramm nach Daten fragt, sondern es ruft das Anwendungsprogramm auf, sobald neue Daten vorliegen. JACK basiert also auf Rückruffunktion (call back). Weiterhin verarbeitet JACK sowohl Audio- als auch MIDI-Daten in Paketen gleicher Dauer. Die Paketlänge bestimmt die Mindestverzögerung durch JACK.

Bei einem komplexen Netzwerk von verbundenen Audioprogrammen ruft JACK für jeden Zeitabschnitt alle Programme in der richtigen Reihenfolge auf. Ausgegebene Pakete eines Programms können dabei Eingabepakete für ein anderes Programm sein. Der Clou ist, dass JACK alle Programme innerhalb der Dauer eines Paketes abfertigt.

Der JACK-Server ist damit praktisch eine einzelne ALSA-Anwendung, bei der die unvermeidliche Verzögerung nur einmal anfällt. Neu hinzukommende Programme in einem JACK-Netzwerk vergrößern die Verzögerung also nicht. Da alle JACK-Programme durch den gleichen Server gesteuert werden, laufen sie auch absolut synchron.

JACK kann aber natürlich nicht zaubern. Wenn die laufenden Programme für eine Sekunde Audio länger als eine Sekunde benötigen, dann kann das auch bei der besten Organisation nicht aufgehen. Die Zeiten für Audioabtastwerte und MIDI-Daten sind am gleichen Zeitraster ausgerichtet. Das ergibt auch Sinn, denn so lassen sich Noten exakt den Anfängen von Wellen in einem Audio-Strom zuordnen.

Eine Besonderheit ist der Freewheeling-Modus: Hier läuft alles so schnell wie es eben geht. Das ist meistens schneller als in Echtzeit, ermöglicht aber auch Berechnungen, die in Echtzeit nicht möglich sind. Im Freewheeling-Modus werden keine Daten ans Audio-Interface gesendet oder von dort empfangen.

Nutzung in der Praxis

Wenn man nur eine einzelne Audio-Anwendung verwendet, dann kann man ruhig ALSA verwenden. ALSA allein ist einfacher zu handhaben, man muss weder ein Programm starten noch eine Konfiguration bearbeiten. Das trifft auch noch bei zwei Programmen zu, deren Zusammenwirken sich in der simultanen Tonwiedergabe erschöpft (Audacity spielt etwas ab, während in VLC ein Film läuft) oder wenn man Audio-Anwendungen auf sehr einfache Weise miteinander verknüpft, beispielsweise "Musikprogramm steuert Softwaresynthesizer".

Wünscht man hingegen die Kombination der Fähigkeiten mehrerer Audioanwendungen bzw. macht beispielsweise semi- oder professionell Musik, so ist JACK die bessere Wahl. Manchmal hat man auch gar keine Wahl, da einige Tonstudio-Programme JACK zwingend voraussetzen.

Installation

Folgende Pakete müssen installiert [1] werden:

Befehl zum Installieren der Pakete:

sudo apt-get install jackd qjackctl 

Oder mit apturl installieren, Link: apt://jackd,qjackctl

JACK steuern

telinterview.png JACK ist ein Kommandozeilenprogramm. Man kann es bei Bedarf automatisch starten lassen, zumindest zur Einrichtung ist eine graphische Oberfläche aber hilfreich. QJackCtl bietet eine komfortable Oberfläche für Konfiguration und Überwachung sowie eine Patchbay zum Verschalten der Clients. Sollte JACK sich nicht starten lassen, kann das an der falschen Einstellung liegen, welche bei QJackCtl unter "Setup..." vorgenommen wird. Es kann aber auch sein, dass benötigte Sound-Module nicht geladen sind. Hier hilft eventuell der entsprechende Eintrag in /etc/modules. Unter "Connect" können die einzelnen Audioanwendungen und -geräte beliebig miteinander verbunden werden. Die mit JACK benutzten Programme müssen in den jeweiligen Einstellungen auf JACK eingestellt sein, wenn sie dafür eine Schnittstelle haben. Rechts ein Beispielfoto, wie mit Audacity unter JACK mit Jackplug ein Internet-Telefonie-Interview aufgenommen werden kann (wofür vorher der Gesprächspartner zustimmen muss).

Echtzeitpriorität

Für den Betrieb mit sehr niedrigen Latenzen kann der Einsatz eines speziellen Kernel nötig sein. Außerdem kann die Nutzung des Realtime-LSM-Moduls (bis Kernel 2.6.13) oder einer erweiterten libpam (ab Kernel 2.6.14) nötig sein, um auch als Anwender Echtzeitpriorität zu bekommen. Siehe jeweils Tonstudio/Konfiguration.

Hinweis:

Für den Echtzeitbetrieb von JACK ist ein Echtzeitkernel nicht zwingend notwendig. Ein normaler Kernel kann allerdings bei sehr niedriger Latenz von Jack und hoher CPU-Last Tonaussetzer verursachen.

Problembehebung

Bei mehreren Soundkarten wählt JACK manchmal die falsche

Dieses Verhalten liegt an ALSA, das die Module für die Soundkarten nicht immer in derselben Reihenfolge lädt. Zur Lösung kann man die Hinweise in Sound Problembehebung (Abschnitt „Bis-Ubuntu-9-04“) beachten oder JACK mit einem anderen Eingangsgerät bzw. Ausgabegerät starten:

"PCM":CARD="Kartenname",DEV="Device"

"PCM", "Kartenname" und "Device" müssen dabei durch die richtigen Werte ersetzt werden. Die verfügbaren Werte listet der Befehl:

aplay -L 

auf. Alternativ ist auch dieses Eingangs- bzw. Ausgabegerät möglich:

hw:"NAME"

"NAME" muss dabei durch den richtigen Wert ersetzt werden. Diese listet:

cat /proc/asound/cards 

. Also ist bei folgender Ausgabe z.B. "NAME"="XFi":

...
2 [XFi            ]: SB-XFi - Creative X-Fi
                      Creative X-Fi 20K1 Unknown
...

Mehrere Soundkarten gleichzeitig verwenden

Falls man zwei Soundkarten verwenden möchte, muss man nach dem Starten von JACK noch alsa_out aufrufen.

Man ruft dafür in der Konsole den folgenden Befehl auf:

alsa_out -d SOUNDKARTE -q 0 & 

für Ausgangskanäle und

alsa_in -d SOUNDKARTE -q 0 & 

für Eingangskanäle. SOUNDKARTE muss dabei durch hw:NUMMER oder hw:NAME ersetzt werden, wobei die Nummer bzw. der Name dieselbe wie bei:

cat /proc/asound/cards 

ist (ein Beispiel findet sich weiter oben) oder man verwendet den ebenfalls oben genannten Ausdruck, den

aplay -L 

auflistet.