Jeżeli zajmujesz się obróbką dźwięku bądź tworzysz muzykę w Linuksie na pewno znasz serwer dźwięku o małych opóźnieniach JACK. Wszystkie szanujące się programy do pracy z dźwiękiem na Linuksa z nim współpracują, ale w domyślnych ustawieniach PulseAudio nie chce współpracować z JACK. Dziś pokaże jak zrobić aby JACK w wersji pierwszej nie gryzł się z PulseAudio.
Czemu tylko w wersji pierwszej? Bo w wersji drugiej PulseAudio jest obsługiwane z automatu. W repo Ubuntu są obie wersje JACKa, na jednych kartach dźwiękowych działa lepiej jedynka, na innych znów dwójka.
Gdy uruchomimy JACK ten przejmuje całkowitą kontrolę nad kartą dźwiękową i PulseAudio nie ma do niej dostępu. Próba uruchomienia aplikacji, która wspópracuje tylko z PulseAudio zakończy się zawieszeniem programu do momentu zatrzymania JACKa. Jeśli podczas pracy w Renoise będziemy mieli potrzebę obejrzenia czegoś na Youtubie, film się nie otworzy albo nie będzie miał dźwięku.
Aby zmusić PulseAudio do współpracy z JACKiem musimy użyć specjalnych modułów. Instalujemy je na początek za pomocą poniższego przycisku:
Pokaże jak ten proces całkowicie z automatyzować przy pomocy Qjackctl.
Tworzymy cztery pliki o następujących nazwach i zawartości:
pulse-jack-pre-start.sh:
#!/bin/bash
pacmd suspend true
pacmd suspend true
pulse-jack-post-start.sh:
#!/bin/bash
pactl load-module module-jack-sink channels=2
pactl load-module module-jack-source channels=2
pacmd set-default-sink jack_out
pacmd set-default-source jack_in
pactl load-module module-jack-sink channels=2
pactl load-module module-jack-source channels=2
pacmd set-default-sink jack_out
pacmd set-default-source jack_in
pulse-jack-pre-stop.sh:
#!/bin/bash
SINKID=$(pactl list | grep -B 1 "Nazwa: module-jack-sink" | grep Moduł | sed 's/[^0-9]//g')
SOURCEID=$(pactl list | grep -B 1 "Nazwa: module-jack-source" | grep Moduł | sed 's/[^0-9]//g')
pactl unload-module $SINKID
pactl unload-module $SOURCEID
sleep 5
SINKID=$(pactl list | grep -B 1 "Nazwa: module-jack-sink" | grep Moduł | sed 's/[^0-9]//g')
SOURCEID=$(pactl list | grep -B 1 "Nazwa: module-jack-source" | grep Moduł | sed 's/[^0-9]//g')
pactl unload-module $SINKID
pactl unload-module $SOURCEID
sleep 5
pulse-jack-post-stop.sh:
#!/bin/bash
pacmd suspend false
pacmd suspend false
Po co są te pliki? Pliki pulse-jack-pre-start.sh i pulse-jack-post-start.sh są uruchamiane przed i po wystartowaniu serwera JACK. Pliki pulse-jack-pre-stop.sh i pulse-jack-post-stop.sh są uruchamiane przed i po zatrzymaniu serwera JACK.
Plikom nadajemy uprawnienia do uruchamiania się i podajemy je w konfigu Qjackctl jak na zrzucie poniżej.
Jak to działa?
Gdy naciskamy przycisk Start w Qjackctl wywoływany jest najpierw skrypt pulse-jack-pre-start.sh, który zawiesza działanie PulseAudio. Następnie jest uruchamiany serwer JACK. Potem uruchamiany jest skrypt pulse-jack-post-start.sh, który ładuje moduły PulseAudio do obsługi JACKa i ustawia jako domyślne wyjście dźwięku połączenie z JACKiem. Możemy sprawdzić w Ustawieniach dźwięku co jest domyślnym wyjściem.

Gdy naciśniemy przycisk Stop w Qjackctl wywoływany jest skrypt pulse-jack-pre-stop.sh, ten sprawdza numery modułów załadowanych wcześniej i wyłącza je. W Połączeniach JACKa znika wyjście do PulseAudio. Potem zamykany jest serwer JACK i odwieszane jest PulseAudio i wszystko wraca do normy.
Z problemem braku współpracy obu serwerów dźwięku zetnkąłem się podczas pracy z Renoise, które najlepiej działa wraz z JACKiem. W momecie gdy chciałem np. obejrzeć tutorial do którejś z wtyczek VST na Youtube filmy się nie odtwarzały. W powyższy sposób połączyłem działanie obu serwerów i mogę rutować dźwięk z aplikacji obsługujących PulseAudio do aplikacji obsługujących JACKa.