oml_audio/
wav_file.rs

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		// RIFF
29		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		/*
40		if size + 8 != f.size() {
41			println!("Wrong size {} != {}", size + 8, f.size() );
42			return false;
43		}
44		*/
45
46		// WAVE
47		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		// fmt%20
56		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");
108//					let mut data = Vec::new();
109					let 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								// :TODO:
119								let f = 2.0*( w as f32 )/( 0xffff as f32 ) - 0.0;
120								self.data.push( f );
121								if channels == 1 {	// :HACK: just duplicate to enforce stereo
122									self.data.push( f );
123								}
124							};
125							println!("");
126						},
127						8 => {
128							for _ in 0..blocks {
129								let w = f.read_u8();
130								// :TODO:
131								let f = 2.0*( w as f32 )/( 0xff as f32 ) - 1.0;
132								self.data.push( f );
133								if channels == 1 {	// :HACK: just duplicate to enforce stereo
134									self.data.push( f );
135								}
136							};
137							println!("");
138						},
139						bps => {
140							println!("Unhandled bits per sample {}", bps );
141							return false;
142						}
143					}
144//					return false;
145				},
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}