use super::*;
struct DenoiseInnerProcessor {
denoiser: flexaudio_denoise::Denoiser,
}
impl DenoiseInnerProcessor {
fn new() -> Self {
Self {
denoiser: flexaudio_denoise::Denoiser::new(2)
.expect("stereo denoiser construction is infallible"),
}
}
}
impl InnerProcessor for DenoiseInnerProcessor {
fn process(&mut self, samples: &mut [f32]) {
let _ = self.denoiser.process(samples);
}
fn flush(&mut self) -> Vec<f32> {
self.denoiser.flush()
}
}
fn build_inner_processor(denoise_enabled: bool) -> Option<Box<dyn InnerProcessor>> {
if denoise_enabled {
Some(Box::new(DenoiseInnerProcessor::new()))
} else {
None
}
}
pub(super) fn build_normalizer(
shared: &SharedState,
rate: u32,
channels: u16,
output: OutputFormat,
secondary_output: Option<OutputFormat>,
denoise_enabled: bool,
) -> Result<Normalizer> {
let mut n = Normalizer::new(rate, channels, output)?;
if shared.capture_enabled.load(Ordering::SeqCst) {
n = n.with_capture_tap()?;
}
if let Some(sec) = secondary_output {
n = n.with_secondary(sec)?;
}
let processor = build_inner_processor(denoise_enabled);
if let Some(processor) = processor {
n = n.with_inner_processor(processor);
}
Ok(n)
}