//! Integrated loudness measurement in LUFS per ITU-R BS.1770-4. /// Measure integrated LUFS loudness per ITU-R BS.1770-4. /// Returns -70.0 for silence/near-silence where gating produces no result. pub fn measure_lufs(samples: &[f32], sample_rate: u32) -> f64 { if samples.is_empty() || sample_rate == 0 { return -70.0; } let mut meter = bs1770::ChannelLoudnessMeter::new(sample_rate); meter.push(samples.iter().copied()); let windows = meter.into_100ms_windows(); let power = bs1770::gated_mean(windows.as_ref()); let lkfs = power.loudness_lkfs() as f64; if lkfs.is_nan() || lkfs.is_infinite() { -70.0 } else { lkfs } } #[cfg(test)] mod tests { use super::*; #[test] fn silence_is_very_quiet() { let silence = vec![0.0f32; 48000]; let lufs = measure_lufs(&silence, 48000); // Silence should be extremely quiet (negative infinity or very low) assert!(lufs < -60.0, "silence LUFS should be < -60, got {lufs}"); } #[test] fn loud_sine_is_near_zero() { let samples: Vec = (0..48000) .map(|i| (2.0 * std::f32::consts::PI * 1000.0 * i as f32 / 48000.0).sin()) .collect(); let lufs = measure_lufs(&samples, 48000); // A 1kHz full-scale sine should be around -3 LUFS assert!( lufs > -10.0 && lufs < 0.0, "full-scale sine LUFS should be near -3, got {lufs}" ); } }