1
2use crate::FileLoader;
3
4
5#[derive(Debug)]
6pub struct WavFile {
7 data: Vec< f32 >,
8}
9
10impl WavFile {
11
12 pub fn new() -> Self {
13 Self {
14 data: Vec::new(),
15 }
16 }
17
18 pub fn data( &self ) -> &Vec<f32> {
19 &self.data
20 }
21
22 pub fn load( &mut self, fileloader: &mut dyn FileLoader, filename: &str ) -> bool {
23 let mut f = fileloader.open( &filename );
24 if ! f.is_valid() {
25 println!("Couldn't open file: {}", filename);
26 return false;
27 }
28 for b in &[ b'R', b'I', b'F', b'F' ] {
30 let b1 = f.read_u8();
31 if *b != b1 {
32 println!("Wrong RIFF signature {:#02x} != {:#02x}", b, b1 );
33 return false;
34 }
35 }
36
37 let size = f.read_u32();
38 dbg!(size);
39 for b in &[ b'W', b'A', b'V', b'E' ] {
48 let b1 = f.read_u8();
49 if *b != b1 {
50 println!("Wrong WAVE signature {:#02x} != {:#02x}", b, b1 );
51 return false;
52 }
53 }
54
55 for b in &[ b'f', b'm', b't', b' ' ] {
57 let b1 = f.read_u8();
58 if *b != b1 {
59 println!("Wrong fmt signature {:#02x} != {:#02x}", b, b1 );
60 return false;
61 }
62 }
63
64 let fmt_len = f.read_u32();
65 dbg!(fmt_len);
66 if fmt_len != 16 {
67 println!("Unexpected fmt length {}", fmt_len );
68 return false;
69 }
70
71 let fmt_type = f.read_u16();
72 dbg!(fmt_type);
73 if fmt_len != 16 {
74 println!("Unexpected fmt type {} (not 1/PCM", fmt_type );
75 return false;
76 }
77
78 let channels = f.read_u16();
79 dbg!(channels);
80
81 let sample_rate = f.read_u32();
82 let byte_rate = f.read_u32();
83 let block_size = f.read_u16();
84 let bits_per_sample = f.read_u16();
85
86
87 dbg!(sample_rate);
88 dbg!(byte_rate);
89 dbg!(block_size);
90 dbg!(bits_per_sample);
91
92
93 while !f.eof() {
94
95 let mut chunk_type = [0u8;4];
96
97 for b in &mut chunk_type {
98 *b = f.read_u8();
99 }
100
101 let chunk_size = f.read_u32();
102 let chunk_type = std::str::from_utf8( &chunk_type ).unwrap_or( "" );
103 dbg!( chunk_type );
104
105 match chunk_type {
106 "data" => {
107 println!("data chunk");
108let blocks = chunk_size / block_size as u32;
110 match bits_per_sample {
111 16 => {
112 for _ in 0..blocks {
113 let w = f.read_u16();
114 let w = unsafe {
115 std::mem::transmute::< u16, i16 >( w )
116 };
117
118 let f = 2.0*( w as f32 )/( 0xffff as f32 ) - 0.0;
120 self.data.push( f );
121 if channels == 1 { self.data.push( f );
123 }
124 };
125 println!("");
126 },
127 8 => {
128 for _ in 0..blocks {
129 let w = f.read_u8();
130 let f = 2.0*( w as f32 )/( 0xff as f32 ) - 1.0;
132 self.data.push( f );
133 if channels == 1 { self.data.push( f );
135 }
136 };
137 println!("");
138 },
139 bps => {
140 println!("Unhandled bits per sample {}", bps );
141 return false;
142 }
143 }
144},
146 "" => {
147 println!("None chunk ''");
148 break;
149 },
150 _ => {
151 println!("Unhandled chunk type: {:?} size: skipping {}", chunk_type, chunk_size);
152 for _ in 0..chunk_size {
153 f.read_u8();
154 };
155 },
156 };
157 }
158 false
159 }
160}