Parallelprogrammierung mit C++ und Qt, Teil 3: Plattformunabhängige Audioprogrammierung

Das JACK Audio Connection Kit implementiert eine plattformübergreifende und quelloffene API für den Zugriff auf Audio- und MIDI-Hardware. Der dritte Teil des Tutorials stellt es anhand eines einfachen Harddisk Recorders vor. Ein kleines Tool zur Anzeige von MIDI-Daten demonstriert die MIDI-Funktionen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 15 Min.
Von
  • Matthias Nagorni
Inhaltsverzeichnis

Das JACK Audio Connection Kit implementiert eine plattformübergreifende und quelloffene API für den Zugriff auf Audio- und MIDI-Hardware. Der dritte Teil des Tutorials stellt es anhand eines einfachen Harddisk Recorders vor. Ein kleines Tool zur Anzeige von MIDI-Daten demonstriert die MIDI-Funktionen.

Harddisk-Recording ist eine typische Echtzeitanwendung, bei der eingehende Audiosignale innerhalb einer bestimmten Zeitspanne zu verarbeiten sind. Wird die durch Buffer-Länge und Sample-Rate definierte Zeitspanne überschritten, tritt ein sogenannter Buffer Overrun auf und das eingelesene Signal enthält Lücken. Parallelprogrammierung dient in einem solchen Szenario primär der Trennung des zeitkritischen Aufnahmevorgangs vom potenziell langsamen Festplattenzugriff.

Mehr Infos

Plattformunabhängige Parallelprogrammierung mit C++ und Qt

Während kommerzielle Audiosoftware in der Regel die ASIO- und VST-Schnittstellen von Steinberg verwendet, eignet sich JACK besonders für den Einstieg in die Audioprogrammierung. Das Toolkit ist deswegen praktisch, weil es fertige JACK-Binärdateien sowohl für Windows als auch Linux und Mac OS X gibt. Zudem ist die API einfach zu erlernen und gut dokumentiert.

Wie der Name vermuten lässt, implementiert JACK eine Infrastruktur für den Austausch von Audio- und MIDI-Daten zwischen Programmen und entsprechender Hardware. Applikationen erzeugen dazu je nach Bedarf lesbare und schreibbare Audio- und MIDI-Ports, die sich dann in einem Patchfeld mit den Ports der Audio- und MIDI-Hardware verbinden lassen. Unter Windows steht zusätzlich der ASIO-Treiber JackRouter zur Verfügung, mit dem sich kommerzielle Audiosoftware via ASIO in ein JACK-Setup einbinden lässt. Voraussetzung dafür ist, dass der JackRouter bei der betreffenden Applikation in der Liste der konfigurierbaren ASIO-Geräte auftaucht.

Mehr Infos

Quellcode zum Artikel

  • QMidiViewer-1.0.1d.tar
  • QMiniRecorder-1.0.5c.tar

Zu finden hier.

Der Vollständigkeit halber sei erwähnt, dass Qt seit der Version 4.6 mit QAudioInput und QAudioOutput auch eigene Klassen für die Unterstützung von Audio-I/O implementiert. Diese unterstützen aber weder MIDI noch ASIO und verwenden auch nicht den im Audio-Bereich üblichen Callback-Ansatz für den Datenaustausch zwischen Applikation und Audio-Engine.

Im Folgenden sei zunächst die Installation von JACK auf Windows 7 beschrieben. Für die derzeit offizielle Version 1.9.8 findet sich hier der Installer für Mixed 64/32 bit JACK. Die Beta der nächsten Version liegt auch bereits vor. Sie behebt einige Bugs der Vorgängerversion. Das Setup-Programm installiert die JACK-Bibliotheken, einige kleine Testprogramme sowie das grafische Tool QJackCtl für die Konfiguration und Verwaltung von Audio- und MIDI-Verbindungen.

QJackCtl ist eine grafische Benutzeroberfläche für die Konfiguration von JACK und die Verwaltung von Audio- und MIDI-Verbindungen (Abb. 1).

Für das Kompilieren eigener Client-Programme benötigt man die Header-Dateien von JACK sowie die Datei libjack.dll. Programme, die direkt auf die Funktionen des JACK-Servers zugreifen, brauchen zusätzlich noch die Datei libjackserver.dll. Sofern kein anderes Zielverzeichnis angegeben ist, finden sich die Header-Dateien nach der Installation unter C:\Programme (x86)\Jack\includes\jack und die dll-Dateien im Verzeichnis C:\Windows\SysWOW64. Bei Verwendung von MinGW als Compiler sind die Header Dateien in das Verzeichnis C:\QtSDK\mingw\include\jack zu kopieren. Zum Kompilieren der Programmbeispiele sind das Verzeichnis C:\JACK anzulegen und die Datei libjack.dll dorthin zu kopieren.

QJackCtl befindet sich im Installationsverzeichnis von JACK. Im Setup-Dialog des Tools spezifiziert man zunächst den Serverpfad jackd -S -X winmme, wobei letztere Option für den Zugriff auf die Windows MME Midi API benötigt wird. Anschließend selektiert man als Treiber die Option portaudio. Die übrigen Default-Einstellungen im Setup-Dialog sollten in den meisten Fällen funktionieren. Als "Input- und Output-Device" kommt die Default-Audiohardware zum Einsatz. Die Buffer-Größe legt der Parameter "Frames/Period" fest. Der Standardwert beträgt 1024 und führt bei der voreingestellten Sample-Rate von 48 kHz und 2 Periods/Buffer zu einer Latenz von 42,7 ms. Je nach Hardware und Treiber lassen sich auch kleinere Buffer Größen verwenden.

Der Setup-Dialog von QJackCtl zur Konfiguration der Audiohardware (Abb. 2)

Nach dem Programmstart wird der JACK Server jackd.exe normalerweise automatisch gestartet. Er lässt sich mit dem Stop-Button anhalten und mit Start erneut ausführen. Gemäß Qt-Konvention speichert QJackCtl seine Konfiguration in der Registry unter HKEY_CURRENT_USER\Software\rncbc.org\QjackCtl.

Für einen ersten Test lässt sich nun bei laufendem JACK-Server das Metronom-Programm C:\Program Files (x86)\Jack\jack_metro.exe -b 60 ausführen. Dabei ist zu beachten, dass das Programm nur startet, wenn der Parameter -b für "beats per minute" angegeben wird. Nun ist noch die Audio-Verbindung herzustellen. Dazu öffnet man in QJackCtl das Patchfeld per Klick auf den Connect-Button.

Der Connections-Dialog von QJackCtl dient der virtuellen Verschaltung von Audio- und MIDI-Geräten und Applikationen (Abb. 3).

Hier taucht metro als Readable Client auf. Die Audio-Hardware erscheint unter system. Die Ports werden jeweils nach Doppelklick auf die Client-Namen sichtbar und lassen sich per Connect einzeln verbinden. Es ist auch möglich, die capture- und playback-Ports der Hardware testweise direkt zu verbinden, wobei man die Pegel vorsichtig von unten hochregeln sollte, um Rückkopplungen zu vermeiden.

Moderne Audiohardware integriert häufig noch eine Reihe von Effekten, die sich unter Umständen störend auf die Aufnahmequalität auswirken können. Daher lohnt ein Blick auf die Einstellungen, deren Dialog sich entweder in der Systemsteuerung unter "Hardware" und "Sound" oder im Kontextmenü des Lautsprechersymbols aufrufen lässt.

Je nach Audio-Hardware lassen sich in QJackCtl verschiedene Geräte und Treiber konfigurieren. Alternativ gibt man in der "Jack Command"-Eingabeaufforderung das Kommando jackd -d portaudio -l ein und erhält so eine Liste der verfügbaren Geräte. Sollte QJackCtl ein konfiguriertes Gerät nicht korrekt starten, lässt sich JACK auch direkt aufrufen, indem man ein Icon mit dem entsprechenden Ziel erzeugt. Für ein RME-Fireface-USB-Gerät im ASIO-Modus lautet das beispielsweise "C:\Program Files (x86)\Jackv1.9.9\jackd.exe" -S -X winmme -d portaudio -d "ASIO::ASIO Fireface USB".

Wer JACK unter Linux einsetzen möchte, findet in den meisten Distributionen aktuelle Pakete. Dabei ist zu beachten, dass sowohl für QJackCtl als auch die Header-Dateien häufig separate Pakete zu installieren sind.