use crate::types::{AudioUnit, empty_audio_unit};
use std::collections::VecDeque;
pub struct DelayNode {
queue: VecDeque<AudioUnit>,
delay_units: usize,
max_delay_units: usize,
}
impl DelayNode {
pub fn new(max_delay_units: usize, default_delay_units: usize) -> Self {
let delay_units = default_delay_units.min(max_delay_units);
let mut queue = VecDeque::with_capacity(max_delay_units + 1);
for _ in 0..delay_units {
queue.push_back(empty_audio_unit());
}
Self {
queue,
delay_units,
max_delay_units,
}
}
pub fn set_delay_units(&mut self, units: usize) {
let target_units = units.min(self.max_delay_units);
if target_units > self.delay_units {
for _ in 0..(target_units - self.delay_units) {
self.queue.push_front(empty_audio_unit()); }
} else if target_units < self.delay_units {
for _ in 0..(self.delay_units - target_units) {
self.queue.pop_front();
}
}
self.delay_units = target_units;
}
#[inline(always)]
pub fn process(&mut self, input: Option<&AudioUnit>, output: &mut AudioUnit) {
if let Some(in_unit) = input {
self.queue.push_back(*in_unit);
} else {
self.queue.push_back(empty_audio_unit());
}
if let Some(delayed_unit) = self.queue.pop_front() {
output.copy_from_slice(&delayed_unit);
} else {
dasp::slice::equilibrium(&mut output[..]);
}
}
}