JACK: Difference between revisions
imported>Facundominguez Comment on the need for JACK_PROMISCUOUS_SERVER |
imported>Voyd Add tips for running nix-provided jack clients on arch linux |
||
(7 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
One may use [https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/audio/jack.nix JACK module]. It works both with and without PulseAudio. Enable it this way '''and reboot''': | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
services.jack = { | services.jack = { | ||
Line 9: | Line 9: | ||
enable = true; | enable = true; | ||
# buffering parameters for dmix device to work with ALSA only semi-professional sound programs | # buffering parameters for dmix device to work with ALSA only semi-professional sound programs | ||
dmixConfig = '' | #dmixConfig = '' | ||
# period_size 2048 | |||
''; | #''; | ||
}; | }; | ||
}; | }; | ||
users.extraUsers.YOURUSER.extraGroups = [ "jackaudio" ]; | users.extraUsers.YOURUSER.extraGroups = [ "jackaudio" ]; | ||
</nowiki>}} | </nowiki>}} | ||
Since the config above and below apparently does not work for several users, according to forum posts, here a solution that works: | |||
- Add musnix channel (https://github.com/musnix/musnix) | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
imports = [ <musnix> ]; | |||
environment.systemPackages = with pkgs; [ libjack2 jack2 qjackctl ]; | |||
environment.systemPackages = with pkgs; [ pavucontrol libjack2 jack2 qjackctl jack2Full jack_capture ]; | |||
security.sudo.extraConfig = '' | |||
moritz ALL=(ALL) NOPASSWD: ${pkgs.systemd}/bin/systemctl | |||
''; | |||
musnix = { | |||
enable = true; | |||
alsaSeq.enable = false; | |||
# Find this value with `lspci | grep -i audio` (per the musnix readme). | |||
# PITFALL: This is the id of the built-in soundcard. | |||
# When I start using the external one, change it. | |||
soundcardPciId = "00:1f.3"; | |||
# magic to me | |||
rtirq = { | |||
# highList = "snd_hrtimer"; | |||
resetAll = 1; | |||
prioLow = 0; | |||
enable = true; | |||
nameList = "rtc0 snd"; | |||
}; | |||
}; | |||
</nowiki>}} | |||
After a reboot, you can enable JACKD using "pasuspender qjackctl" and start jackd by pressing the start button. | |||
You can test, if your JACK works, using the command jack_simple_client, which produces a sound if JACK is running. | |||
Sources: | |||
https://discourse.nixos.org/t/declarative-audio-config-how-to-start-and-maybe-use-jack/5458 | |||
https://github.com/NixOS/nixpkgs/issues/71283 | |||
{{Outdated|needs cleanup}} | {{Outdated|needs cleanup}} | ||
Line 138: | Line 176: | ||
}; | }; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
[[ | |||
== Connecting nix JACK clients to Pipewire installed via other package managers == | |||
Pipewire offers a JACK API, but applications installed via nix are not able to connect to it out of the box. | |||
Use the following command to make them work (using qsynth as an example): | |||
<syntaxHighlight lang="bash"> | |||
LD_LIBRARY_PATH="$(nix build nixpkgs#pipewire.jack --print-out-paths)/lib" nix run nixpkgs#qsynth | |||
</syntaxHighlight> | |||
You can also wrap it in a script, for adding this to your home-manager config will allow using `nix-jack nix run nixpkgs#qsynth` | |||
<syntaxHighlight lang="nix"> | |||
home.packages = with pkgs; [ | |||
(writeShellScriptBin "nix-jack" '' | |||
exec /usr/bin/env \ | |||
LD_LIBRARY_PATH=${pipewire.jack}/lib''${LD_LIBRARY_PATH:+:''${LD_LIBRARY_PATH}} \ | |||
"''$@" | |||
'') | |||
] | |||
</syntaxHighlight> | |||
or | |||
<syntaxHighlight lang="nix"> | |||
let | |||
jackWrap = drv: pkgs.symlinkJoin { | |||
name = "${drv.name}-jackwrapped"; | |||
paths = [ drv ]; | |||
buildInputs = [ pkgs.makeWrapper ]; | |||
postBuild = '' | |||
ls "$out/bin" | |||
for b in "$out/bin/"*; do | |||
wrapProgram "$b" \ | |||
--prefix LD_LIBRARY_PATH : "${pkgs.pipewire.jack}/lib" | |||
done | |||
''; | |||
}; | |||
in [ | |||
(jackWrap pkgs.qsynth) | |||
] | |||
</syntaxHighlight> | |||
This is necessary because of the way the pipewire jack interface works. By using a pipewire-provided dynamically linked library, the connection attempt is translated to a pipewire connection inside the client process. Other distributions such as Arch Linux implement this by just placing the .so files in /usr/lib but since nix application don't include that directory we need this approach. | |||
(Tested on Arch Linux in May 2023) | |||
If you know of a way to do this without wrapping each individual package, please add it here. | |||
[[Category:Audio]] | |||
[[Category:Applications]] |