Contact us
Leave a message

Bitte benutzen:

Mein öffentlicher Kryptographie-Schlüssel


Mitglied bei

Achtung!

Spätestens seit Pipewire in Version 1.0 erschienen ist, sollte es kaum noch nötig sein, sich mit der Interoperabilität von PulseAudio und Jack herumzuplagen. Schade um die ganze hier präsentierte Arbeit, aber gut für Multimedia unter Linux!

Ich höre was!

Wie viele Nächte habe ich schon damit verbracht, die optimale Linux-Audio-Konfiguration zu suchen, mit der alle Anwendungen -- vom Video-Player bis zum Software-Synthesizer -- klar kommen, Ton ausgeben und ggf. sogar untereinander austauschen! Das Unterfangen wurde auch dadurch nicht gerade vereinfacht, dass unter Linux numehr mindestens drei bis vier verschiedene Komponenten für Audio zuständig sind:

  1. ALSA -- die Advanced Linux Sound Architecture stellt sozusgaen die hardware-nahe oder Treiber-Schicht im Linux-Audio-Stack dar -- obgleich auch ALSA vielfältige Formen der Audio-Daten-Manipulation in Echtzeit beherrscht (Stichwort: virtuelle Soundkarten und Resampling)
  2. PulseAudio -- mittlerweilen die Standard-High-Level-Bibliothek für den Alltagsgebrauch, die von so ziemlich allen Desktop-Anwendungen unterstützt wird und auch die Einbindung von z. B. Bluetooth-Geräten ermöglicht
  3. JACK -- der Jack Audio Connection Kit, welcher ebenfalls auf ALSA aufsetzt, im Gegensatz zu Pulseaudio viel Wert auf die exakte Synchronisation von Audio-Quellen legt, dabei aber nur jeweils eine Soundkarte gleichzeitig unterstützt
  4. PipeWire -- der aufgehende Stern am Linux-Multimedia-Himmel; hier aber noch unberücksichtigt

Das Problem liegt nun vor allem darin begründet, dass PulseAudio beim Start alle von ALSA verwaltete Audio-Hardware exklusiv für sich reklamiert, so dass andere Programme, die -- wie JACK -- ebenfalls direkt auf eine Soundkarte zugreifen wollen, nicht mehr zum Zuge kommen.

Glücklicherweise haben sich die drei Systeme mittlerweilen soweit "angefreundet", dass ein relativ reibungsloser Parallel-Betrieb möglich ist. Gewusst wie, ist es daher nun möglich, z. B. mit Firefox oder VLC per PulseAudio Videos mit Ton (!) anzusehen, um in der nächsten Minute -- oder auch gleichzeitig -- ohne Umkonfigurierung des Audio-Systems mit JACK-basierten Anwendungen wie QTractor oder Ardour zu arbeiten.

 

Schön zusammen spielen

Tatsächlich sind die genannten Audio-Komponenten bei einem modernen Debian-System (Stand: Bullseye) bereits so gut vorkonfiguriert, dass nur noch wenig Arbeit nötig ist, um sie zu reibungsloser Zusammenarbeit zu bewegen.

Zur Verwaltung von JACK verwende ich das GUI-Tool QJackCtl. Um JACK parallel zu PulseAudio betreiben zu können, muss zusätzlich noch das entsrpechende PulseAudio-Modul installiert werden. Und schließlich empfiehlt sich pavucontrol als GUI zur Einrichtung von PulseAudio:

sudo apt install pavucontrol pulseaudio-module-jack qjackctl 

QJackCtl habe ich wie unten gezeigt konfiguriert (die nicht gezeigten Reiter haben ihre Default-Werte behalten).

Die Magie passiert über die D-Bus-Checkboxen in der rechten Spalte des Misc-Reiters: Hierüber informiert JACK beim Starten PulseAudio, welches dann die Audio-Hardware freigibt und je eine Quelle und -Senke einrichtet, die mit entsprechenden JACK-Ports verknüpft sind und die ab jetzt (bis zum Beenden von JACK) als Default-PulseAudio-Ein/Ausgabe-Geräte verwendet werden:

Die system-Einträge entsprechen dem tatsächlichen Ein- bzw. Ausgang der von JACK verwendeten ALSA-Soundkarte. Man sieht, dass alles, was JACK aufnimmt, über die PulseAudio-JACK-Source nach PulseAudio geleitet und alles, was von Anwendungen über die PulseAudio-JACK-Sink abgespielt wird, von JACK an die Soundkarte geroutet wird.

Wenn man jetzt noch qjackctl in einem Desktop-Session-Autostart-Skript

#!/bin/sh

qjackctl &
autostart.sh

aufruft, kann man sofort nach dem Log-In beliebig PulseAudio- und JACK-basierte Anwendungen gleichzeitig benutzen. Denn sobald JACK läuft, es es nun möglich, die neuen PulseAudio-JACK-Quellen und -Senken in PulseAudio z. B. per pavucontrol als Ein- oder -Ausgabegerät zu auszuwählen (hier am Beispiel eines in Firefox abgespielten Videos) und bei Bedarf auch als Default-Gerät festzulegen (hier am Beispiel der neuen JACK-Senke):

USB-Mikrofon

Um USB-Mikrofone (oder -Lautsprecher) per JACK verfügbar zu machen, lassen sich über das alsa_in bzw. alsa_out-Kommandos aus dem jackd2-Package entsprechende JACK-Quellen und -Senken erstellen. Dafür habe ich ein kleines Skript geschrieben, das die Einstellung der nötigen Parameter vereinfacht und das von meinem GitLab-Repository unter https://gitlab.com/tcrass/setup-mic heruntergeladen werden kann. Damit kann ich z. B. im Handumdrehen eine Quelle und eine Senke für mein USB-Mikrofon mit eingebauter Kopfhörer-Buchse für's Audio-Monitoring erstellen:

Hier habe ich das Mikrofon so geroutet, dass das aufgenommene Tonsignal über PulseAudio verfügbar gemacht wird und alles, was über PulseAudio abgespielt wird, im Audio-Monitor des Mikrofons landet.

Mehr Auswahl

Manchmal -- z. B. bei Video-Konferenzen, bei denen man bestimmte Audio-Streams z. B. nur an den Browser, andere an eine Anwendung zum Mitschneiden der Session schicken möchte -- kann es hilfreich sein, mehr als nur je eine JACK-Quelle bzw. -Senke zur Verfügung zu haben. Hier helfen ein paar Kommandos, die man z. B. auch im Desktop-Session-Autostart-Skript unterbringen kann:

pactl load-module module-jack-sink client_name=PulseAudio_JACK_Sink_2 connect=no
pactl load-module module-jack-source client_name=PulseAudio_JACK_Source_2 connect=no
autostart.sh

Ab sofort hat man in JACK je eine zusätzliche PulseAudio-Quelle und -Senke zur Verfügung, die man gezielt PulseAudio-basierten Applikationen zuordnen und die man JACK-basiert routen kann:

Hier ein komplexes Beispiel-Setup (einschl. Mikrofon) mit folgenden Features:

  • In Firefox läuft eine Video-Konferenz mit Jitsi; Jitsi benutzt die PulseAudio-JACK-Sink zur Ausgabe und die PulseAudio-JACK-Source als Eingabe.
  • Mit OBS wird eine Aufnahme der Vico erstellt; OBS benutzt die PulseAudio_JACK_Source_2 zur Tonaufzeichnung.
  • Das (USB-)Mikrophon ist so geroutet, dass mein Geplapper in der Vico und in der OBS-Aufnahme zu hören ist.
  • Am Analog-Eingang der Soundkarte (system) hängt ein E-Bass; diesen kann über Lautsprecher hören, in der Vico vorspielen und per OBS aufnehmen.
  • Wenn ich z. B. per VLC ein Video abspiele, benutze ich die PulseAudio_JACK_Sink_2, so dass ich die Tonspur per Lausprecher hören kann und der Ton auch in der Vico und der OBS-Aufnahme ankommt.
  • Schließlich sind MIDI-Files, die ich über QTractor abspiele, ebenfalls per Lautsprecher, in der Vico und in OBS zu hören.

Laut mit Bluetooth

Die Audio-Ausgabe von JACK-basierten Anwendungen über Bluetooth-Lautsprecher erfordert ein paar Umwege, aber es geht! Dafür benötigt man das PulseAudio-Bluetooth-Modul, welches über

sudo apt install pulseaudio-module-bluetooth

installiert werden kann. Sobald ein Bluetooth-Gerät gekoppelt wird, wird das Modul automatisch geladen und stellt ein neues PulseAudio-Ausgabegerät zur Verfügung -- hier den SoundCore-2-Lautsprecher:

Die Frage ist nun, wie bekommt man den Audio-Datenstrom von der JACK-basierten Anwendung zum neuen PulseAudio-Gerät geroutet? Nun, durch Verbinden der Anwendung mit einer PulseAudio-JACK-Source bekommt man den Ton schon mal in PulseAudio hinein. Dort kann der Datenstrom über das PulseAudio-Loopback-Modul dann abgefangen und an das Bluetooth-Gerät weitergeleitet werden:

Das loopback-Modul wird per Default nicht automatisch von PulseAudio geladen; die kann man aber manuell oder natürlich auch gleich per Autostart erledigen:

pactl load-module module-loopback
autostart.sh

Fazit

Manchmal machen sich meine Freunde über mich lustig, wenn ich bei einer gemeinsamen Vico mehrere Ansätze benötige, bis mein Sound-Setup steht ("Ja ja, Linux...!"). Aber mit ALSA, PulseAudio und JACK sind Dinge möglich, von denen man unter Windows nur träumen kann! :)