speexdsp_resampler/
lib.rs1mod 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}