Unixery & daemon worship 🔥


It's a Unix system! I know this!

Equalizer in Linux mit PulseAudio, Jack und Calf

Statt den Equalizer pur über ALSA mittels LADSPA-Plugins zu realisieren, kann man auch den aufwändigen Weg gehen und das Ganze über Jack und einem Filter-Plugin machen. Als Filter kommt z.B. das LV2-Plugin Calf in Frage.

Benötigt wird

Benötigt wird folgende Software:

Ablauf

Kurz erklärt, wie das abläuft: Pulseaudio nimmt die Ausgabe der Musik-App entgegen, z.B. über das ALSA-Plugin. Die Audiodaten werden dann über die PulseAudio JACK Sink an JACK übergeben. JACK routet die Daten dann über alle gewünschten Plugins (hier halt den Calf-Equalizer) und dann zur Soundkarte (bzw. in meinem Fall zum USB-DAC). Das sieht dann so aus:

Musik-App --> PulseAudio --> PulseAudio JACK Sink --> JACK --> Filter-Plugins --> USB DAC

Einstellungen

JACK

Als erstes startet man QJackCtl und stellt dort in den Einstellungen die gewünschte Ausgabe-Hardware und das Ausgabeformat ein. Der JACK-Server muss danach neu gestartet werden (falls die Einstellungen nicht übernommen werden, den JACK-Server per Hand über killall beenden und neu starten).

PulseAudio Sink

Dann lädt man das PulseAudio JACK Sink Modul:

pacmd load-module module-jack-sink

Calf

Dann die Calf GUI starten und das gewünschte Plugin zum Rack hinzufügen, z.B. Equalizer 12 Band. Filtereinstellungen wie gewünscht vornehmen: Calf EQ

Die Filtereinstellungen können als Preset abgespeichert werden. Die Presets können biem Start von Calf auch direkt geladen werden.

JACK-Verbindungen

In QJackCtl kann man nun die PulseAudio JACK Sink mit den Filtern verbinden. Das geht über das Patchfeld: QJackCtl Patchfeld

Oder über den Graph: QJackCtl Graph

Es müssen auf jeden Fall beide Kanäle (links/rechts) einzeln verbunden werden! Beim system audio device empfiehlt sich die Option Exklusiv zu setzen, damit nur die Ausgabe des EQs an die Hardware weitergegeben wird.

Die Patchfeld-Einstellungen abspeichern, diese können dann beim Start auch automatisch wieder geladen werden. Alternativ hierzu bietet sich auch das Kommandozeilentool aj-snapshot an, mit dem die JACK-Verbindungen ebenfalls gespeichert und geladen werden können.

PulseAudio Ausgabe

Zu guter letzt muss man nur noch im PulseAudio-Mixer die Ausgabe der Apps auf die PulseAudio JACK Sink umstellen:

PulseAudio Mixer

Alles in einem Rutsch

Hier noch ein Shellskript, um alles auf einmal zu starten:

#!/bin/bash
EQ_PRESET="shure-se535"
JACK_CONN="$HOME/calfEQ.xml"
JACK_CONN_AJ="$HOME/calfEQ-aj.xml"
USE_AJSNAPSHOT="1"
ALSA_DEVICE="hw:0"

jackeq_start() {
	echo "Starting JACK"
	jackd --no-realtime -dalsa -d"$ALSA_DEVICE" -r44100 -p1024 -n2 > /dev/null 2&>1 &
	sleep 2
	echo "Loading PA module-jack-sink"
	pacmd load-module module-jack-sink > /dev/null
	#pacmd set-default-sink jack_out > /dev/null
	echo "Starting Calf"
	calfjackhost eq12:"$EQ_PRESET" > /dev/null &
	sleep 2
	if [[ $USE_AJSNAPSHOT == 1 ]]; then
		if [[ -e "$JACK_CONN_AJ" ]]; then
			echo "Restoring JACK connections"
			aj-snapshot -r "$JACK_CONN_AJ"
		else
			echo "File $JACK_CONN_AJ not found. Could not restore JACK connections with aj-snapshot!"
		fi
	else
		if [[ -e "$JACK_CONN" ]]; then
			echo "Starting QjackCtl and restoring JACK connections"
			qjackctl -a "$JACK_CONN" > /dev/null  &
		else
			echo "File $JACK_CONN not found. Could not restore JACK connections with QjackCtl!"
		fi
	fi
}

jackeq_stop() {
	#!/bin/bash
	echo "Unloading PA module-jack-sink"
	pacmd unload-module module-jack-sink
	echo "Stopping QjackCtl"
	killall qjackctl
	echo "Stopping Calf"
	killall calfjackhost
	sleep 1
	echo "Stopping JACK"
	killall jackd
}

jackeq_restart() {
	jackeq_stop
	sleep 1
	jackeq_start
}

case "$1" in
'start')
	jackeq_start
	;;
'stop')
	jackeq_stop
	;;
'restart')
	jackeq_restart
	;;
*)
	echo "usage $0 start|stop|restart"
esac

echo "Done!"