1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::basic_reverb::BasicReverb;

pub struct StereoBasicReverb {
    basic_reverb: BasicReverb,
}

impl StereoBasicReverb {
    pub fn new(
        room_size_ms: f64,
        rt60: f64,
        dry: f64,
        wet: f64,
        channels: usize,
        sample_rate: u32,
    ) -> Self {
        Self {
            basic_reverb: BasicReverb::new(room_size_ms, rt60, dry, wet, channels, sample_rate),
        }
    }

    pub fn process_sample(&mut self, sample: (f64, f64)) -> (f64, f64) {
        let channels = self.basic_reverb.channels;
        let mut input = vec![0.; channels];

        // Duplicate input channels as many times as needed
        for i in 0..channels / 2 {
            input[2 * i] = sample.0;
            input[2 * i + 1] = sample.1;
        }

        let output = self.basic_reverb.process(input);

        // Mix down into stereo
        let mut sum = (0., 0.);
        for i in 0..channels / 2 {
            sum.0 = output[2 * i];
            sum.1 = output[2 * i + 1];
        }

        (sum.0 / (channels / 2) as f64, sum.1 / (channels / 2) as f64)
    }
}