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:
- jack
- qjackctl
- pulseaudio
- calf
- aj-snapshot (optional)
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:
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:
Oder über den 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:
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!"