testresample/
testresample.rs1use speexdsp_resampler::*;
2
3use std::f32::consts::PI;
4
5const PERIOD: f32 = 32f32;
6const INBLOCK: usize = 1024;
7const RATE: usize = 48000;
8
9fn main() {
10 let mut rate = 1000;
11 let mut off = 0;
12 let mut avail = INBLOCK as isize;
13
14 let fin: Vec<f32> = (0..INBLOCK * 4)
15 .map(|i| ((i as f32) / PERIOD * 2.0 * PI).sin() * 0.9)
16 .collect();
17 let mut fout = vec![0f32; INBLOCK * 8];
18
19 let mut st = State::new(1, RATE, RATE, 4).unwrap();
20
21 st.set_rate(RATE, rate).unwrap();
22 st.skip_zeros();
23
24 st.set_quality(10).unwrap();
25
26 eprintln!("Quality: {}", st.get_quality());
27
28 let mut data = Vec::new();
29
30 loop {
31 let in_len = avail as usize;
32 let out_len = (in_len * rate + RATE - 1) / RATE;
33
34 let prev_in_len = in_len;
35 let prev_out_len = out_len;
36
37 let (in_len, out_len) = st
38 .process_float(0, &fin[off..off + in_len], &mut fout[..out_len])
39 .unwrap();
40
41 eprintln!(
42 "{} {} {} {} -> {} {}",
43 rate, off, prev_in_len, prev_out_len, in_len, out_len
44 );
45
46 off += in_len as usize;
47 avail += INBLOCK as isize - in_len as isize;
48
49 if off >= INBLOCK {
50 off -= INBLOCK;
51 }
52
53 data.push(fout[..out_len as usize].to_vec());
54
55 rate += 5000;
56 if rate > 128000 {
57 break;
58 }
59
60 st.set_rate(RATE, rate).unwrap();
61 }
62
63 println!("{:#?}", data);
64}