#![allow(unsafe_code)]
use std::path::{Path, PathBuf};
use crate::FilterError;
#[derive(Debug, Clone, PartialEq)]
pub struct LoudnessResult {
pub integrated_lufs: f32,
pub lra: f32,
pub true_peak_dbtp: f32,
}
pub struct LoudnessMeter {
input: PathBuf,
}
impl LoudnessMeter {
pub fn new(input: impl AsRef<Path>) -> Self {
Self {
input: input.as_ref().to_path_buf(),
}
}
pub fn measure(self) -> Result<LoudnessResult, FilterError> {
if !self.input.exists() {
return Err(FilterError::AnalysisFailed {
reason: format!("file not found: {}", self.input.display()),
});
}
unsafe { super::analysis_inner::measure_loudness_unsafe(&self.input) }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn loudness_meter_missing_file_should_return_analysis_failed() {
let result = LoudnessMeter::new("does_not_exist_99999.mp3").measure();
assert!(
matches!(result, Err(FilterError::AnalysisFailed { .. })),
"expected AnalysisFailed for missing file, got {result:?}"
);
}
}