#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProcessResult {
Ok,
Bypassed,
}
pub trait AudioProcessor: Send {
fn name(&self) -> &'static str;
fn process(&mut self, buffer: &mut [f64], channels: usize) -> ProcessResult;
fn reset(&mut self);
fn is_enabled(&self) -> bool;
fn set_enabled(&mut self, enabled: bool);
fn set_sample_rate(&mut self, _sample_rate: f64) {}
}
#[cfg(test)]
mod tests {
use super::*;
struct TestProcessor {
enabled: bool,
gain: f64,
}
impl AudioProcessor for TestProcessor {
fn name(&self) -> &'static str {
"TestProcessor"
}
fn process(&mut self, buffer: &mut [f64], _channels: usize) -> ProcessResult {
if !self.enabled {
return ProcessResult::Bypassed;
}
for sample in buffer.iter_mut() {
*sample *= self.gain;
}
ProcessResult::Ok
}
fn reset(&mut self) {}
fn is_enabled(&self) -> bool {
self.enabled
}
fn set_enabled(&mut self, enabled: bool) {
self.enabled = enabled;
}
}
#[test]
fn test_processor_enabled() {
let mut proc = TestProcessor {
enabled: true,
gain: 0.5,
};
let mut buffer = vec![1.0, 1.0];
let result = proc.process(&mut buffer, 1);
assert_eq!(result, ProcessResult::Ok);
assert!((buffer[0] - 0.5).abs() < 1e-10);
}
#[test]
fn test_processor_bypassed() {
let mut proc = TestProcessor {
enabled: false,
gain: 0.5,
};
let mut buffer = vec![1.0, 1.0];
let result = proc.process(&mut buffer, 1);
assert_eq!(result, ProcessResult::Bypassed);
assert!((buffer[0] - 1.0).abs() < 1e-10);
}
}