Real-time audio in NixOS
musnix provides a set of simple, high-level configuration options for doing real-time audio work in NixOS, including optimizing the kernel, applying the CONFIG_PREEMPT_RT
patch to it, and adjusting various low-level system settings.
Clone this project.
Add the following to your configuration.nix
:
{
imports =
[ # ...
/path/to/musnix/clone
];
musnix.enable = true;
users.users.johndoe.extraGroups = [ "audio" ];
}
To update musnix, run git pull
.
Later sections of this document contain information about the various configuration options.
As an alternative to the above approach, you can instead add musnix as a channel:
sudo -i nix-channel --add https://github.com/musnix/musnix/archive/master.tar.gz musnix
sudo -i nix-channel --update musnix
Add <musnix>
to imports
in your configuration.nix
:
{
imports =
[ # ...
<musnix>
];
musnix.enable = true;
users.users.johndoe.extraGroups = [ "audio" ];
}
To update musnix, run:
sudo -i nix-channel --update musnix
As an alternative to the above approaches, you can also add musnix as a flake:
{
inputs = {
nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; };
musnix = { url = "github:musnix/musnix"; };
};
outputs = inputs: rec {
nixosConfigurations = {
example-config = inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules =
[ # ...
inputs.musnix.nixosModules.musnix
./configuration.nix
];
specialArgs = { inherit inputs; };
};
};
};
# ...
musnix.enable
-
Description: Enable musnix, a module for real-time audio.
-
Type:
boolean
-
Default value:
false
-
NOTE: This option must be set to
true
to use other musnix base options. -
Details: If enabled, this option will do the following:
-
Activate the
performance
CPU frequency scaling governor. -
Set
vm.swappiness
to 10. -
Set the following udev rules:
KERNEL=="rtc0", GROUP="audio" KERNEL=="hpet", GROUP="audio"
-
Set the following PAM limits:
@audio - memlock unlimited @audio - rtprio 99 @audio soft nofile 99999 @audio hard nofile 99999
-
Set the following environment variables to default install locations in NixOS:
VST_PATH
VST3_PATH
LXVST_PATH
LADSPA_PATH
LV2_PATH
DSSI_PATH
-
Allow users to install plugins in the following directories:
~/.vst
~/.vst3
~/.lxvst
~/.ladspa
~/.lv2
~/.dssi
-
musnix.alsaSeq.enable
- Description: If enabled, load ALSA Sequencer kernel modules. Currently, this only loads the
snd_seq
andsnd_rawmidi
modules. - Type:
boolean
- Default value:
true
musnix.ffado.enable
- Description: If enabled, use the Free FireWire Audio Drivers (FFADO).
- Type:
boolean
- Default value:
false
musnix.soundcardPciId
-
Description: The PCI ID of the primary soundcard. Used to set the PCI latency timer.
To find the PCI ID of your soundcard:
lspci | grep -i audio
-
Type:
string
-
Default value:
""
-
Example value:
"00:1b.0"
NOTE: The following kernel options can be used without setting musnix.enable = true;
musnix.kernel.realtime
- NOTE: Enabling this option will rebuild your kernel.
- Description: If enabled, this option will apply the
CONFIG_PREEMPT_RT
patch to the kernel. - Type:
boolean
- Default value:
false
musnix.kernel.packages
-
Description: This option allows you to select the real-time kernel used by musnix.
-
Type:
package
-
Default value:
pkgs.linuxPackages_rt
-
Available packages:
pkgs.linuxPackages_5_15_rt
pkgs.linuxPackages_6_1_rt
pkgs.linuxPackages_6_4_rt
or:
pkgs.linuxPackages_rt
(currentlypkgs.linuxPackages_6_1_rt
)pkgs.linuxPackages_latest_rt
(currentlypkgs.linuxPackages_6_4_rt
)
NOTES:
- The following rtirq options can be used without setting
musnix.enable = true;
musnix.kernel.realtime
must be set totrue
to use these options.
musnix can also install and run the rtirq script as a systemd service.
To see a list of options for using this feature, use the following command:
nixos-option musnix.rtirq
To see a description of one of the listed options (in this case enable
):
nixos-option musnix.rtirq.enable
musnix.das_watchdog.enable
- Description: If enabled, start the das_watchdog service. This service will ensure that a realtime process won't hang the machine.
- Type:
boolean
- Default value:
true
ifmusnix.kernel.realtime = true
, otherwisefalse
- IRC:
#musnix
on libera.chat