
- Remove services.udev.packages with alsa-utils (causing udev rules conflict) - Keep services.pipewire.alsa.enable for ALSA compatibility - Re-enable alsa-utils in system packages for testing utilities - ALSA compatibility maintained through PipeWire, not udev rules
109 lines
3.2 KiB
Nix
109 lines
3.2 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}: {
|
|
imports = [
|
|
./easyeffects-presets.nix
|
|
./audio-desktop-integration.nix
|
|
];
|
|
# Enable PipeWire with full audio stack
|
|
services.pipewire = {
|
|
enable = true;
|
|
alsa.enable = true;
|
|
alsa.support32Bit = true;
|
|
pulse.enable = true;
|
|
jack.enable = true;
|
|
|
|
# Enable WirePlumber session manager
|
|
wireplumber.enable = true;
|
|
|
|
# Extra configuration for noise suppression
|
|
extraConfig.pipewire."10-noise-suppression" = {
|
|
"context.properties" = {
|
|
"default.clock.rate" = 48000;
|
|
"default.clock.quantum" = 1024;
|
|
"default.clock.min-quantum" = 32;
|
|
"default.clock.max-quantum" = 2048;
|
|
};
|
|
|
|
"context.modules" = [
|
|
{
|
|
name = "libpipewire-module-filter-chain";
|
|
args = {
|
|
"node.description" = "Noise Canceling Source";
|
|
"media.name" = "Noise Canceling Source";
|
|
"filter.graph" = {
|
|
nodes = [
|
|
{
|
|
type = "ladspa";
|
|
name = "rnnoise";
|
|
plugin = "${pkgs.rnnoise-plugin}/lib/ladspa/librnnoise_ladspa.so";
|
|
label = "noise_suppressor_stereo";
|
|
control = {
|
|
"VAD Threshold (%)" = 50.0;
|
|
"VAD Grace Period (ms)" = 200;
|
|
"Retroactive VAD Grace (ms)" = 0;
|
|
};
|
|
}
|
|
];
|
|
};
|
|
"capture.props" = {
|
|
"node.name" = "capture.rnnoise_source";
|
|
"node.passive" = true;
|
|
"audio.rate" = 48000;
|
|
};
|
|
"playback.props" = {
|
|
"node.name" = "rnnoise_source";
|
|
"media.class" = "Audio/Source";
|
|
"audio.rate" = 48000;
|
|
};
|
|
};
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
# Install audio management and GUI applications
|
|
environment.systemPackages = with pkgs; [
|
|
# Noise suppression plugin
|
|
rnnoise-plugin # RNNoise LADSPA plugin
|
|
|
|
# Audio control and monitoring
|
|
pavucontrol # PulseAudio volume control (works with PipeWire)
|
|
helvum # Graphical patchbay for PipeWire
|
|
qpwgraph # Qt-based PipeWire graph manager
|
|
easyeffects # Audio effects and noise suppression GUI
|
|
pwvucontrol # Native PipeWire volume control
|
|
|
|
# Audio utilities
|
|
wireplumber # WirePlumber session manager
|
|
pipecontrol # PipeWire control utility
|
|
alsa-utils # ALSA utilities for testing
|
|
|
|
# Validation script
|
|
(writeShellScriptBin "validate-audio" (builtins.readFile ./validate-audio.sh))
|
|
|
|
# Optional: Professional audio tools
|
|
# qjackctl # JACK control GUI (for JACK applications)
|
|
# carla # Audio plugin host
|
|
];
|
|
|
|
# Enable real-time audio processing
|
|
security.rtkit.enable = true;
|
|
|
|
# Audio group for users
|
|
users.groups.audio = {};
|
|
|
|
# Set environment variables for better audio performance
|
|
environment.variables = {
|
|
# PipeWire environment variables
|
|
PIPEWIRE_LATENCY = "1024/48000";
|
|
# Ensure applications use PipeWire
|
|
PULSE_RUNTIME_PATH = "/run/user/$UID/pulse";
|
|
};
|
|
|
|
# User session configuration for audio
|
|
systemd.user.services.pipewire-pulse.wantedBy = ["default.target"];
|
|
}
|