Posts mit dem Label linux werden angezeigt. Alle Posts anzeigen
Posts mit dem Label linux werden angezeigt. Alle Posts anzeigen

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.

Sysctl Tweaks die wirklich helfen

Ich schwärme ja seit einiger Zeit über ein paar sysctl Tweaks für Linux die wir unter anderem in Neptune verwenden um so den Speed zu erhöhen. Zudem setze ich die gleiche Konfiguration auch auf meinen Linux basierenden Smartphones / Tablets ein und kann dadurch auch bei älteren Geräten mit etwas weniger Speicher mehr Geschwindigkeit herausholen. Immer wieder werde ich auch nach der Konfiguration gefragt und möchte diese aus diesem Grund hier einmal posten.

#sysctl.conf file
#
#############################
## Battery life tweaks #
#############################
vm.dirty_writeback_centisecs=3000
vm.dirty_expire_centisecs=500
#
#
#############################
## CPU tweaks #
#############################
#
## Queue size modifications
net.core.optmem_max=20480
net.unix.max_dgram_qlen=50
#
## Net Core Settings
## Location: /proc/sys/net/core
net.core.wmem_max=524288
net.core.rmem_max=524288
net.core.rmem_default=256960
net.core.wmem_default=256960
#
#############################
## VM & Filesystem tweaks #
#############################
fs.lease-break-time=10
#fs.file-max=65536
vm.overcommit_memory=1
vm.min_free_order_shift=4
vm.block_dump=0
vm.oom_dump_tasks=1
vm.page-cluster=0
#
#############################
## Net Speed tweaks #
#############################
#
## UnderUtilized Networking Tweaks below as recommended by avgjoemomma (from XDA)
net.ipv4.tcp_congestion_control=cubic
#
# # Hardening the TCP/IP stack to SYN attacks
net.ipv4.tcp_syncookies=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_max_tw_buckets=16384
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_time=1800
net.ipv4.ip_forward=0
net.ipv4.tcp_moderate_rcvbuf=1
net.ipv4.route.flush=1
net.ipv4.udp_rmem_min=6144
net.ipv4.udp_wmem_min=6144
net.ipv4.tcp_rfc1337=1
net.ipv4.ip_no_pmtu_disc=0
net.ipv4.tcp_ecn=0
net.ipv4.tcp_sack=1
net.ipv4.tcp_fack=1
#
# Don't accept source routing
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
#
# Don't accept redirects
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0

####################################
## previous Neptune tweak settings #
####################################
# Set swappiness to very low - Try to use as much memory as you can before swapping
vm.swappiness = 26

# Controls the tendency of the kernel to reclaim the memory which is used for
# caching of directory and inode objects. - Prefer to clear dentry and inode caches
vm.vfs_cache_pressure = 10000

# Contains, as a percentage of total system memory, the number of pages at which a
# process which is generating disk writes will itself start writing out dirty data.
vm.dirty_ratio = 10

# Contains, as a percentage of total system memory, the number of pages at which
# the pdflush background writeback daemon will start writing out dirty data.
vm.dirty_background_ratio = 5


Wichtig hierbei ist der Wert vm.swappiness der in diesem Fall für 1-2 GB RAM auf 26 steht. Habt ihr mehr RAM könnt ihr dementsprechend das ganze herabsetzen. Es zuweit herabzusetzen würde ich allerdings nicht empfehlen.

Update: Tritt zu starkes stocken bei voll laufendem RAM mit zu niedrigem vm.swappiness auf, kann das ganze natürlich auch hoch gesetzt werden. Bei 1 GB RAM kann hier z.B. 40 ein deutlich besserer Wert sein.