rust_audio_api/nodes/
resampler.rs1use 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}