feat(qt): Settings > Audio > Loudness — normalization toggle, target loudness presets, clipping guard

The bars' audio flyout keeps its switch; Settings > Audio gains the same
key with its two companions: a Target loudness select (-11 / -14 default /
-16 / -18 / -23 LUFS, a value set elsewhere shows as a display-only
"Custom (N LUFS)" entry instead of being re-mapped) and the Prevent
clipping toggle. Eight catalogs updated.

cc
This commit is contained in:
vicrodh committed 2026-09-13 11:25:22 -06:00
1 parent ec7311ce54
commit d22907b0e0
10 files changed
+481

No files matched your search

@@ -350,6 +350,44 @@ Column {
SettingsDivider { }
SettingsSpacer { }
// ============================= LOUDNESS ==============================
// The bars' audio flyout keeps its normalization switch; this is the
// same key with its two companions. Target and clipping guard only show
// while normalization is on.
GroupHeader { kioskHost: root.kioskHost; text: QbzSession.tr("LOUDNESS", QbzSession.trRev) }
SettingRow { kioskHost: root.kioskHost;
label: QbzSession.tr("Volume normalization", QbzSession.trRev)
description: QbzSession.tr("Level loudness across tracks", QbzSession.trRev)
QbzToggle { kioskHost: root.kioskHost;
checked: root.doc.normalization === true
onToggled: function (v) { QbzBridge.settingsBool("normalization", v) }
}
}
SettingRow { kioskHost: root.kioskHost;
visible: root.doc.normalization === true
label: QbzSession.tr("Target loudness", QbzSession.trRev)
description: QbzSession.tr("The loudness every track is aligned to. -14 LUFS matches streaming services, -18 LUFS is the ReplayGain reference.", QbzSession.trRev)
QbzSelect { kioskHost: root.kioskHost;
menuWidth: 260
options: root.doc.normalizationTargets || []
currentIndex: root.doc.normalizationTargetIndex || 0
onSelected: function (i) { QbzBridge.settingsSelect("normalization-target", i) }
}
}
SettingRow { kioskHost: root.kioskHost;
visible: root.doc.normalization === true
label: QbzSession.tr("Prevent clipping", QbzSession.trRev)
description: QbzSession.tr("Cap the boost so the loudest peak stays under full scale. Off lets quiet tracks reach the target even if their peaks clip.", QbzSession.trRev)
QbzToggle { kioskHost: root.kioskHost;
checked: root.doc.normalizationPreventClipping === true
onToggled: function (v) { QbzBridge.settingsBool("normalization-prevent-clipping", v) }
}
}
SettingsSpacer { }
SettingsDivider { }
SettingsSpacer { }
// ============================= STARTUP ===============================
GroupHeader { kioskHost: root.kioskHost; text: QbzSession.tr("STARTUP", QbzSession.trRev) }
SettingRow { kioskHost: root.kioskHost;