Jack als Standardaudioserver

Der Jack Audio Daemon ist unter Linux der Begriff für den professionellen Audio Bearbeiter. Dabei handelt es sich lediglich um einen Audio Daemon, wie PulseAudio oder ALSA.
Im Gegensatz zu PulseAudio erfreut sich Jack allerdings einer guten Beliebtheit und wird sehr gerne gelobt dafür, dass man wie auf einem Schaltpult ganz einfach verschiedene Verbindungen, Ein- und Aussgänge miteinander verbinden kann.



Dies ist auch eines der Features die Jack schon Jahre vor dem Aufkommen von PulseAudio so besonders gemacht hat. Eng verzahnt und verdrahtet sind dadurch professionelle Audio Bearbeitungswerkzeuge, wie Ardour oder auch Rosegarden.

Dieses Unix Prinzip, dass an Piping im Terminal erinnert, verschiedene Eingangs- und Ausgangsströme miteinander zu verbinden ist auch das was Jack so stark macht. Hat man einen coolen Filter oder Effekeditor gefunden der Jack Unterstützung besitzt, so kann man diesen als Vorstufe für jedes weitere Jack unterstützende Programm benutzen.
Das geniale daran ist, das so ein einfaches Prinzip sehr sehr mächtig ist.

Nun warum sollte man als normaler Nutzer nicht auch so ein mächtiges Tool benutzen können. Warum ist Jack nicht schon vor Jahren zum Standard erklärt worden ?

Das hat mehrere Gründe.
Der Jack Audio Daemon braucht zwingend ein vorhandenes Audio Framework, wie OSS oder ALSA oder Core Audio um mit der Audio Hardware kommunizieren zu können. Unter Linux heißt dies konkret, man braucht zwingend ALSA um überhaupt auf die Soundhardware zugreifen zu können. Glücklicherweise ist ALSA bereits Bestandteil des Linux Kernels. Dies führt aber auch dazu, dass einfache Anwendungen meist direkt nur ALSA Support anbieten. Da nun Jack eine Soundkarte vollständig unter Beschlag nehmen möchte wird ALSA quasi mitgeteilt, diese Soundkarte nur noch Jack zur Verfügung zu stellen.

Das führt zu dem lästigen Problem, dass wenn Jack läuft ALSA Anwendungen die Soundkarte nicht mehr finden bzw. keinen Ton mehr abspielen können. Dies ist auch eine häufig gestellte Frage, bei einigen Nutzern, die z.B. Ardour einmal ausprobiert haben und selbst nach beenden des Programmes, dass Jack im Hintergrund ausführt, keinen Sound mehr hören können bei ihren üblichen Programmen. Selbst nach dem Beenden von Ardour heißt das nicht automatisch, dass auch Jackd gekillt wird. Ein manuelles killen ist meist erforderlich um dann den Sound wiederherzustellen.

Gibt das da nicht einen besseren Weg ?
Kann man den ALSA Anwendungen nicht irgendwie sagen, nutzt Jack ?

Nunja ganz so einfach ist es nicht, da die ALSA Anwendungen meist nichts von Jack wissen. Es muss also eine Lösung her die ALSA direkt bereitstellt. Quasi eine Umleitung auf Ebene von ALSA. Gott sei dank hat ALSA ein Plugin Funktion die so etwas ermöglicht. Und bereits vor Jahren wurde ein Jack Plug geschrieben, was einem ermöglicht ALSA Sounds umzuleiten und automatisch mit Jack zu verbinden. Leider ist ist dies nicht sehr einfach möglich, da sich ALSA immer noch hauptsächlich durch eine Konfigurationsdatei steuern lässt.
Ich habe für meinen kleinen Versuch versucht sämtlichen ALSA Sound, egal ob aus HTML5 Player oder FlashPlayer im Browser, oder meinem Lieblingsaudioplayer Amarok umzuleiten nach Jack. Ja selbst die Systembenachrichtigungstöne werden nun über Jack ausgegeben. Dafür muss natürlich erstmal der Jack Audio Server gestartet werden.
Ich habe mir dazu die grafische Oberfläche qjackctl heruntergeladen und installiert und damit erstmal mit den Standardeinstellungen Jack gestartet. Als nächstes muss man natürlich ALSA anpassen. Da ich das nicht systemweit machen möchte, sondern nur für meinen lokalen Nutzer, habe ich eine ~/.asoundrc Datei angelegt. Der Inhalt ist auf den ersten Blick etwas viel, aber doch leicht zu verstehen.

## Jackd --> Alsa

pcm.card0 {
    type plug
    slave { pcm "jack" }
    hint {
         show on
         description "Jackplug"
    }
}

pcm.!default {
    type plug
    slave { pcm "jack" }
}

pcm.jack {
    type jack
    playback_ports {
        0 system:playback_1
        1 system:playback_2
    }
    capture_ports {
        0 system:capture_1
        1 system:capture_2
    }
}

Zunächst lege ich mit pcm.card0 eine neue virtuelle Alsa Soundkarte an, die mit der "Jackplug" Kennung in ALSA Anwendungen als Soundkarte zur Auswahl steht. Die Soundkarte ist vom Typ plug und nutzt die Karte jack die unter pcm.jack zu finden ist. Die jack Karte nutzt das jack plugin von alsa, also den type jack.
Natürlich muss man Jack typisch die Ein- und Ausgänge zur Verbindung mit Jack hier schon eintragen, so dass automatisch alle ALSA Programme die über die Karte "Jackplug" Sound ausgeben wollen auch richtig mit dem Ausgang playback_1 & playback_2 verbunden werden. Das gleiche gilt dann auch für die capture also Aufnahme Verbindungen.
Zu guter letzt mache ich die jack Soundkarte auch noch zur Standard ALSA Karte in der Sektion pcm.!default

Das war es eigemtlich auch schon. Nach dem erfolgreichen abspeichern der Datei muss auf dem Desktop und evtl. den genutzten Programmen noch das ALSA Ausgangsgerät auf die "Jackplug" Soundkarte gestellt werden und schon hört man auch während Jack als Audio Daemon läuft Sound aus allen ALSA Anwendungen.

Das ist aber nicht das einzige. Man hat natürlich auch die Möglichkeit über das Verbindungsfeld jedes ALSA ausgebende Programm und dessen Verbindung aus Ausgang des Programmes zu Jack Ausgang zu sehen und zu verändern. Der Vorteil die Möglichkeit zu haben Sound also umzuleiten durch Equalizer oder Soundeffekte zu leiten ist nun auch mit allen ALSA Anwendungen möglich.