cxx_juce/
juce_audio_basics.rs

1//! Classes for audio buffer manipulation, midi message handling, synthesis, etc.
2
3use {
4    std::f64::consts::FRAC_1_SQRT_2,
5    {crate::juce, cxx::UniquePtr},
6};
7
8/// An infinite impulse response (IIR) filter.
9pub struct IIRFilter(UniquePtr<juce::SingleThreadedIIRFilter>);
10
11unsafe impl Send for IIRFilter {}
12
13/// The quality (Q) factor of a filter.
14#[derive(Debug, Copy, Clone)]
15pub struct Q(pub f64);
16
17impl Default for Q {
18    fn default() -> Self {
19        Self(FRAC_1_SQRT_2)
20    }
21}
22
23impl IIRFilter {
24    /// Create a low-pass filter.
25    pub fn low_pass(sample_rate: f64, frequency: f64, Q(q): Q) -> Self {
26        Self(juce::create_iir_filter(juce::make_low_pass(
27            sample_rate,
28            frequency,
29            q,
30        )))
31    }
32
33    /// Create a high-pass filter.
34    pub fn high_pass(sample_rate: f64, frequency: f64, Q(q): Q) -> Self {
35        Self(juce::create_iir_filter(juce::make_high_pass(
36            sample_rate,
37            frequency,
38            q,
39        )))
40    }
41
42    /// Create a notch filter.
43    pub fn notch(sample_rate: f64, frequency: f64, Q(q): Q) -> Self {
44        Self(juce::create_iir_filter(juce::make_notch_filter(
45            sample_rate,
46            frequency,
47            q,
48        )))
49    }
50
51    /// Filter the given samples.
52    pub fn process(&mut self, samples: &mut [f32]) {
53        unsafe {
54            self.0
55                .pin_mut()
56                .process_samples(samples.as_mut_ptr(), samples.len() as i32)
57        }
58    }
59}