Skip to main content

rust_audio_api/nodes/
resampler.rs

1use dasp::signal::Signal;
2use ringbuf::SharedRb;
3use ringbuf::storage::Heap;
4use ringbuf::traits::Consumer;
5use ringbuf::wrap::caching::Caching;
6use std::sync::Arc;
7pub struct RingIter {
8    pub consumer: Caching<Arc<SharedRb<Heap<f32>>>, false, true>,
9    pub channels: usize,
10}
11
12impl Signal for RingIter {
13    type Frame = [f32; 2];
14
15    #[inline(always)]
16    fn next(&mut self) -> Self::Frame {
17        let mut raw = [0.0; 8];
18        for i in raw.iter_mut().take(self.channels) {
19            *i = self.consumer.try_pop().unwrap_or(0.0);
20        }
21
22        if self.channels == 1 {
23            [raw[0], raw[0]]
24        } else if self.channels == 2 {
25            [raw[0], raw[1]]
26        } else {
27            let mut sum = 0.0;
28            for i in raw.iter().take(self.channels) {
29                sum += i;
30            }
31            let avg = sum / self.channels as f32;
32            [avg, avg]
33        }
34    }
35}
36
37pub enum ResamplerState {
38    Passthrough(RingIter),
39    Resampling(Box<dyn Signal<Frame = [f32; 2]> + Send>),
40}