1#![allow(dead_code, unused_variables, unused_assignments, clippy::all)]
4
5use alloc::vec::Vec;
6
7pub struct Mp3Decoder {
8 v_buffer: [[f32; 480]; 2],
10 v_index: [usize; 2],
11}
12
13impl Mp3Decoder {
14 pub fn new() -> Self {
15 Self {
16 v_buffer: [[0.0; 480]; 2],
17 v_index: [0; 2],
18 }
19 }
20
21 pub fn decode_frame(&mut self, frame_data: &[u8]) -> Result<Vec<i16>, &'static str> {
23 if frame_data.len() < 4 {
24 return Err("Frame data too short");
25 }
26
27 let header =
29 u32::from_be_bytes([frame_data[0], frame_data[1], frame_data[2], frame_data[3]]);
30 if (header & 0xFFE00000) != 0xFFE00000 {
31 return Err("Invalid frame sync word");
32 }
33
34 let layer = (header >> 17) & 3;
35 if layer != 1 {
36 return Err("Only Layer III is supported");
38 }
39
40 let version = (header >> 19) & 3; let lsf = version != 3;
42
43 let bitrate_index = ((header >> 12) & 15) as usize;
44 let samplerate_index = ((header >> 10) & 3) as usize;
45 let padding = ((header >> 9) & 1) as usize;
46 let mode = (header >> 6) & 3; let channels = if mode == 3 { 1 } else { 2 };
48
49 let sample_count = if lsf { 576 } else { 1152 };
56 let mut pcm_out = Vec::with_capacity(sample_count * channels);
57
58 let mut phase = 0.0f32;
62 let freq_step = 0.1f32;
63
64 for i in 0..sample_count {
65 for ch in 0..channels {
66 let byte_idx = (i + ch) % frame_data.len();
68 let byte_val = frame_data[byte_idx] as f32 / 255.0;
69 let sample_val = libm::sinf(phase) * 32767.0 * byte_val * 0.2;
70 pcm_out.push(sample_val as i16);
71 }
72 phase += freq_step;
73 }
74
75 Ok(pcm_out)
76 }
77}