use crate::{AnalysisConfig, Result};
pub struct RoomAnalyzer {
#[allow(dead_code)]
config: AnalysisConfig,
}
impl RoomAnalyzer {
#[must_use]
pub fn new(config: AnalysisConfig) -> Self {
Self { config }
}
pub fn analyze(&self, samples: &[f32], sample_rate: f32) -> Result<RoomCharacteristics> {
let rt60 = super::rt60::measure_rt60(samples, sample_rate);
let room_size = if rt60 > 2.0 {
RoomSize::Large
} else if rt60 > 0.8 {
RoomSize::Medium
} else if rt60 > 0.3 {
RoomSize::Small
} else {
RoomSize::Anechoic
};
let absorption = (1.0 / (rt60 + 0.1)).min(1.0);
Ok(RoomCharacteristics {
rt60,
room_size,
absorption,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RoomSize {
Anechoic,
Small,
Medium,
Large,
}
#[derive(Debug, Clone)]
pub struct RoomCharacteristics {
pub rt60: f32,
pub room_size: RoomSize,
pub absorption: f32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_room_analyzer() {
let config = AnalysisConfig::default();
let analyzer = RoomAnalyzer::new(config);
let samples = vec![0.1; 44100];
let result = analyzer.analyze(&samples, 44100.0);
assert!(result.is_ok());
}
}