Disable local repositories for glutin and glium.
[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: Option<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: Some(device),
46     }
47 }
48
49 pub fn start() -> SoundPlayer {
50     let filename = "flora.xm";
51     match File::open(filename) {
52         Result::Ok(mut f) => {
53             let mut xm = Vec::new();
54             f.read_to_end(&mut xm).unwrap();
55             return play_xm(&xm);
56         },
57         Result::Err(err) => {
58             println!("Couldn't open module {}: {:?}", filename, err);
59         },
60     }
61     return SoundPlayer { _device: None };
62 }