speexdsp_resampler/
lib.rs

1mod speex;
2
3pub struct State {
4    st: speex::SpeexResamplerState,
5}
6
7#[derive(Debug, Clone, Copy)]
8pub enum Error {
9    AllocFailed,
10    InvalidArg,
11}
12
13impl State {
14    pub fn new(
15        channels: usize,
16        in_rate: usize,
17        out_rate: usize,
18        quality: usize,
19    ) -> Result<Self, Error> {
20        let st = speex::SpeexResamplerState::new(channels, in_rate, out_rate, quality);
21
22        Ok(State { st })
23    }
24
25    pub fn set_rate(&mut self, in_rate: usize, out_rate: usize) -> Result<(), Error> {
26        if self.st.set_rate(in_rate, out_rate) != 0 {
27            Err(Error::InvalidArg)
28        } else {
29            Ok(())
30        }
31    }
32
33    pub fn get_rate(&self) -> (usize, usize) {
34        self.st.get_rate()
35    }
36
37    pub fn get_ratio(&self) -> (usize, usize) {
38        self.st.get_ratio()
39    }
40
41    pub fn process_float(
42        &mut self,
43        index: usize,
44        input: &[f32],
45        output: &mut [f32],
46    ) -> Result<(usize, usize), Error> {
47        let mut in_len = input.len() as u32;
48        let mut out_len = output.len() as u32;
49        let ret = self
50            .st
51            .process_float(index as u32, input, &mut in_len, output, &mut out_len);
52
53        if ret != 0 {
54            Err(Error::AllocFailed)
55        } else {
56            Ok((in_len as usize, out_len as usize))
57        }
58    }
59
60    pub fn skip_zeros(&mut self) {
61        self.st.skip_zeros();
62    }
63
64    pub fn reset(&mut self) {
65        self.st.reset_mem();
66    }
67
68    pub fn get_input_latency(&self) -> usize {
69        self.st.get_input_latency()
70    }
71
72    pub fn get_output_latency(&self) -> usize {
73        self.st.get_output_latency()
74    }
75
76    pub fn set_quality(&mut self, quality: usize) -> Result<(), Error> {
77        if self.st.set_quality(quality) != 0 {
78            Err(Error::InvalidArg)
79        } else {
80            Ok(())
81        }
82    }
83
84    pub fn get_quality(&self) -> usize {
85        self.st.get_quality()
86    }
87}