freeverb 0.2.0

A Rust implementation of the Freeverb algorithm
Documentation
use crate::float::Float;

pub struct DelayLine<T> {
    buffer: Vec<T>,
    index: usize,
}

impl<T: Float> DelayLine<T> {
    pub fn new(length: usize) -> Self {
        Self {
            buffer: vec![T::from(0.0); length],
            index: 0,
        }
    }

    pub fn read(&self) -> T {
        self.buffer[self.index]
    }

    pub fn write_and_advance(&mut self, value: T) {
        self.buffer[self.index] = value;

        if self.index == self.buffer.len() - 1 {
            self.index = 0;
        } else {
            self.index += 1;
        }
    }
}

#[cfg(test)]
mod tests {
    macro_rules! delay_line_test {
        ($name:ident, $length:expr) => {
            #[test]
            fn $name() {
                let mut line = super::DelayLine::new($length);
                for i in 0..$length {
                    assert_eq!(line.read(), 0.0);
                    line.write_and_advance(i as f32);
                }
                for i in 0..$length {
                    assert_eq!(line.read(), i as f32);
                    line.write_and_advance(0.0);
                }
            }
        };
    }

    delay_line_test!(length_1, 1);
    delay_line_test!(length_3, 3);
    delay_line_test!(length_10, 10);
}