lc3_codec/common/
config.rs1#[derive(Clone, Copy)]
2pub enum SamplingFrequency {
3 Hz8000,
4 Hz16000,
5 Hz24000,
6 Hz32000,
7 Hz44100,
8 Hz48000,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum FrameDuration {
13 SevenPointFiveMs,
14 TenMs,
15}
16
17#[derive(Clone, Copy)]
18pub struct Lc3Config {
19 pub fs_ind: usize,
21
22 pub fs: usize,
24
25 pub ne: usize,
27
28 pub n_ms: FrameDuration,
30
31 pub nb: usize,
33
34 pub nf: usize,
36
37 pub z: usize,
39}
40
41impl Lc3Config {
42 pub const fn new(sampling_frequency: SamplingFrequency, frame_duration: FrameDuration) -> Self {
43 let (fs_ind, fs) = match sampling_frequency {
44 SamplingFrequency::Hz8000 => (0, 8000),
45 SamplingFrequency::Hz16000 => (1, 16000),
46 SamplingFrequency::Hz24000 => (2, 24000),
47 SamplingFrequency::Hz32000 => (3, 32000),
48 SamplingFrequency::Hz44100 => (4, 44100),
49 SamplingFrequency::Hz48000 => (4, 48000),
50 };
51
52 let nf;
53 let ne;
54 let nb;
55 let z;
56
57 match frame_duration {
58 FrameDuration::SevenPointFiveMs => {
59 nf = match sampling_frequency {
60 SamplingFrequency::Hz8000 => 60,
61 SamplingFrequency::Hz16000 => 120,
62 SamplingFrequency::Hz24000 => 180,
63 SamplingFrequency::Hz32000 => 240,
64 SamplingFrequency::Hz44100 => 360,
65 SamplingFrequency::Hz48000 => 360,
66 };
67
68 ne = if nf == 360 { 300 } else { nf };
69 nb = match sampling_frequency {
70 SamplingFrequency::Hz8000 => 60,
71 _ => 64,
72 };
73 z = 7 * nf / 30;
74 }
75 FrameDuration::TenMs => {
76 nf = match sampling_frequency {
77 SamplingFrequency::Hz8000 => 80,
78 SamplingFrequency::Hz16000 => 160,
79 SamplingFrequency::Hz24000 => 240,
80 SamplingFrequency::Hz32000 => 320,
81 SamplingFrequency::Hz44100 => 480,
82 SamplingFrequency::Hz48000 => 480,
83 };
84
85 ne = if nf == 480 { 400 } else { nf };
86 nb = 64;
87 z = 3 * nf / 8;
88 }
89 }
90
91 Self {
92 fs_ind,
93 fs,
94 n_ms: frame_duration,
95 nb,
96 ne,
97 nf,
98 z,
99 }
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 extern crate std;
106 use super::*;
107
108 #[test]
109 fn simple_config() {
110 let config = Lc3Config::new(SamplingFrequency::Hz48000, FrameDuration::TenMs);
111
112 assert_eq!(config.fs, 48000);
113 assert_eq!(config.fs_ind, 4);
114 assert_eq!(config.n_ms, FrameDuration::TenMs);
115 assert_eq!(config.z, 180);
116 assert_eq!(config.nf, 480);
117 assert_eq!(config.nb, 64);
118 assert_eq!(config.ne, 400);
119 }
120}