4b946860d3221f115516022c1d41767a561534ab
[mandelwow.git] / sound.rs
1 use libxm::XMContext;
2 use sdl2;
3 use sdl2::audio::{AudioCallback, AudioDevice, AudioSpecDesired};
4 use std::fs::File;
5 use std::io::Read;
6
7
8 struct XmCallback {
9     xm: XMContext,
10 }
11
12 impl AudioCallback for XmCallback {
13     type Channel = f32;
14
15     fn callback(&mut self, out: &mut [f32]) {
16         self.xm.generate_samples(out);
17     }
18 }
19
20 pub struct SoundPlayer {
21     _device: AudioDevice<XmCallback>,
22 }
23
24 fn play_xm(raw_xm: &[u8]) -> SoundPlayer {
25     let sdl_context = sdl2::init().unwrap();
26     let sdl_audio = sdl_context.audio().unwrap();
27
28     let sample_rate = 48000u32;
29     let desired_spec = AudioSpecDesired {
30         freq: Some(sample_rate as i32),
31         channels: Some(2u8),
32         samples: None,
33     };
34     let device = sdl_audio.open_playback(None, &desired_spec, |actual_spec| {
35         let xm = XMContext::new(&raw_xm, actual_spec.freq as u32).unwrap();
36
37         XmCallback {
38             xm: xm,
39         }
40     }).unwrap();
41
42     device.resume();
43
44     SoundPlayer {
45         _device: device,
46     }
47 }
48
49 pub fn start() -> SoundPlayer {
50     let mut xm = Vec::new();
51     let filename = "flora.xm";
52     File::open(filename).unwrap()
53         .read_to_end(&mut xm).unwrap();
54     return play_xm(&xm);
55 }