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:
When on nixos-unstable, one may use [https://github.com/NixOS/nixpkgs-channels/blob/nixos-unstable/nixos/modules/services/audio/jack.nix JACK module]. It works both with and without PulseAudio. Enable it this way and reboot:
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
      #  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>
[[Category:Configuration]] [[Category:PulseAudio]] [[Category:Audio]]
 
== 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]]