From 88ed9ee432ef6a51ef0a316219df6ff31e68bc23 Mon Sep 17 00:00:00 2001 From: Ryan Yin Date: Sat, 12 Sep 2026 23:38:41 +0800 Subject: [PATCH] feat(easyeffects): declare autogain and limiter output preset Declare the output chain via services.easyeffects.extraPresets and load it with preset.output, replacing the GUI-only configuration that did not survive the tmpfs root. autogain target is set to -12 dB (EasyEffects defaults to -23, which is too quiet for playback); the limiter acts as a transparent -1 dB safety net via threshold=-1 and gain-boost=false. --- home/linux/gui/base/media.nix | 41 +++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/home/linux/gui/base/media.nix b/home/linux/gui/base/media.nix index c118ef8d..a08d0df1 100644 --- a/home/linux/gui/base/media.nix +++ b/home/linux/gui/base/media.nix @@ -30,9 +30,42 @@ services = { playerctld.enable = true; - # PipeWire audio effects daemon, used for loudness normalization (e.g. bilibili - # videos with inconsistent volume). Configure plugins (autogain + limiter) once - # in the GUI; the daemon then auto-applies the preset at login. - easyeffects.enable = true; + + # PipeWire audio effects daemon for output loudness normalization (e.g. + # bilibili videos with inconsistent volume). + # + # The chain is declared here instead of configured in the GUI: autogain + # normalizes loudness, limiter is a transparent safety net against peaks. + # EasyEffects follows the system default output device by default + # (`useDefaultOutputDevice`), so no GUI state needs to be persisted. + easyeffects = { + enable = true; + + extraPresets.loudness-normalization.output = { + blocklist = [ ]; + "plugins_order" = [ + "autogain#0" + "limiter#0" + ]; + "autogain#0" = { + bypass = false; + # EasyEffects defaults to -23 dB (the EBU R128 broadcast standard), + # which is too quiet for playback. -12 dB is a common value in + # community presets (e.g. JackHack96's "Advanced Auto Gain") and + # still leaves enough headroom for the limiter below. + target = -12.0; + }; + "limiter#0" = { + bypass = false; + # Pure brick-wall safety net: leave 1 dB of ceiling margin and add no + # makeup gain, so autogain stays in charge of loudness. + threshold = -1.0; + gain-boost = false; + }; + }; + + # Load the preset on the output pipeline when the daemon starts. + preset.output = "loudness-normalization"; + }; }; }