Skip to content

Commit

Permalink
fix: implement set_samplerate in dsp::blocks
Browse files Browse the repository at this point in the history
  • Loading branch information
SolarLiner committed Feb 11, 2024
1 parent 4686ddb commit b6200f8
Showing 1 changed file with 54 additions and 14 deletions.
68 changes: 54 additions & 14 deletions src/dsp/blocks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,6 @@ impl<T: Scalar> P1<T> {
}
}

pub fn set_samplerate(&mut self, samplerate: T) {
self.w_step = T::simd_pi() / samplerate
}

pub fn set_fc(&mut self, fc: T) {
self.fc = fc;
}
Expand All @@ -130,6 +126,10 @@ impl<T: Scalar> DSP<1, 3> for P1<T> {
[lp, hp, ap]
}

fn set_samplerate(&mut self, samplerate: f32) {
self.w_step = T::simd_pi() / T::from_f64(samplerate as _)
}

fn latency(&self) -> usize {
1
}
Expand Down Expand Up @@ -172,6 +172,13 @@ macro_rules! series_tuple {
)*
x
}

fn set_samplerate(&mut self, samplerate: f32) {
let Self(($($p),*)) = self;
$(
$p.set_samplerate(samplerate);
)*
}
}
};
}
Expand Down Expand Up @@ -226,6 +233,17 @@ where
{
type Sample = A::Sample;

fn process(&mut self, x: [Self::Sample; I]) -> [Self::Sample; O] {
let Self(a, _, b) = self;
let j = a.process(x);
b.process(j)
}

fn set_samplerate(&mut self, samplerate: f32) {
self.0.set_samplerate(samplerate);
self.2.set_samplerate(samplerate);
}

fn latency(&self) -> usize {
let Self(a, _, b) = self;
a.latency() + b.latency()
Expand All @@ -236,12 +254,6 @@ where
a.reset();
b.reset();
}

fn process(&mut self, x: [Self::Sample; I]) -> [Self::Sample; O] {
let Self(a, _, b) = self;
let j = a.process(x);
b.process(j)
}
}

impl<P: DSP<N, N>, const N: usize, const C: usize> DSP<N, N> for Series<[P; C]> {
Expand All @@ -251,6 +263,12 @@ impl<P: DSP<N, N>, const N: usize, const C: usize> DSP<N, N> for Series<[P; C]>
self.0.iter_mut().fold(x, |x, dsp| dsp.process(x))
}

fn set_samplerate(&mut self, samplerate: f32) {
for s in &mut self.0 {
s.set_samplerate(samplerate);
}
}

fn latency(&self) -> usize {
self.0.iter().map(|dsp| dsp.latency()).sum()
}
Expand Down Expand Up @@ -313,6 +331,13 @@ macro_rules! parallel_tuple {
)*
ret
}

fn set_samplerate(&mut self, samplerate: f32) {
let Self(($($p),*)) = self;
$(
$p.set_samplerate(samplerate);
)*
}
}
};
}
Expand All @@ -328,10 +353,6 @@ parallel_tuple!(A, B, C, D, E, F, G, H);
impl<P: DSP<I, O>, const I: usize, const O: usize, const N: usize> DSP<I, O> for Parallel<[P; N]> {
type Sample = P::Sample;

fn latency(&self) -> usize {
self.0.iter().fold(0, |max, dsp| max.max(dsp.latency()))
}

fn process(&mut self, x: [Self::Sample; I]) -> [Self::Sample; O] {
self.0
.iter_mut()
Expand All @@ -341,6 +362,16 @@ impl<P: DSP<I, O>, const I: usize, const O: usize, const N: usize> DSP<I, O> for
})
}

fn set_samplerate(&mut self, samplerate: f32) {
for s in &mut self.0 {
s.set_samplerate(samplerate);
}
}

fn latency(&self) -> usize {
self.0.iter().fold(0, |max, dsp| max.max(dsp.latency()))
}

fn reset(&mut self) {
for dsp in self.0.iter_mut() {
dsp.reset();
Expand Down Expand Up @@ -414,6 +445,10 @@ impl<FF: DSP<N, N>, const N: usize> DSP<N, N> for Feedback<FF, (), N> {
y
}

fn set_samplerate(&mut self, samplerate: f32) {
self.feedforward.set_samplerate(samplerate);
}

fn latency(&self) -> usize {
self.feedforward.latency()
}
Expand All @@ -439,6 +474,11 @@ where
y
}

fn set_samplerate(&mut self, samplerate: f32) {
self.feedforward.set_samplerate(samplerate);
self.feedback.set_samplerate(samplerate);
}

fn latency(&self) -> usize {
self.feedforward.latency()
}
Expand Down

0 comments on commit b6200f8

Please sign in to comment.