Re-enable fullscreen toggling
[mandelwow.git] / sound.rs
index d88850b1631d03640fc1d8abd7dc5f73f0ddad06..9f116ad05f531cdaef992ee07b0d760020b670e0 100644 (file)
--- a/sound.rs
+++ b/sound.rs
@@ -5,6 +5,8 @@ use std::fs::File;
 use std::io::Read;
 
 
+const SAMPLE_RATE: i32 = 48000;
+
 struct XmCallback {
     xm: XMContext,
 }
@@ -18,21 +20,20 @@ impl AudioCallback for XmCallback {
 }
 
 pub struct SoundPlayer {
-    _device: Option<AudioDevice<XmCallback>>,
+    device: Option<AudioDevice<XmCallback>>,
 }
 
 fn play_xm(raw_xm: &[u8]) -> SoundPlayer {
     let sdl_context = sdl2::init().unwrap();
     let sdl_audio = sdl_context.audio().unwrap();
 
-    let sample_rate = 48000u32;
     let desired_spec = AudioSpecDesired {
-        freq: Some(sample_rate as i32),
-        channels: Some(2u8),
-        samples: None,
+        freq: Some(SAMPLE_RATE),
+        channels: Some(2),
+        samples: Some(4096),  // 85ms
     };
     let device = sdl_audio.open_playback(None, &desired_spec, |actual_spec| {
-        let xm = XMContext::new(&raw_xm, actual_spec.freq as u32).unwrap();
+        let xm = XMContext::new(raw_xm, actual_spec.freq as u32).unwrap();
 
         XmCallback {
             xm: xm,
@@ -42,7 +43,7 @@ fn play_xm(raw_xm: &[u8]) -> SoundPlayer {
     device.resume();
 
     SoundPlayer {
-        _device: Some(device),
+        device: Some(device),
     }
 }
 
@@ -58,5 +59,14 @@ pub fn start() -> SoundPlayer {
             println!("Couldn't open module {}: {:?}", filename, err);
         },
     }
-    return SoundPlayer { _device: None };
+    SoundPlayer { device: None }
+}
+
+pub fn hit_event(player: &mut SoundPlayer) -> f32 {
+    use std::ops::Deref;
+    let audio_device_lock = player.device.as_mut().unwrap().lock();
+    let xm_callback = audio_device_lock.deref();
+    let xm = &xm_callback.xm;
+    let n_samples = xm.latest_trigger_of_instrument(0x1D);
+    n_samples as f32 / SAMPLE_RATE as f32
 }