use std::io::Read;
+const SAMPLE_RATE: i32 = 48000;
+
struct XmCallback {
xm: XMContext,
}
}
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,
device.resume();
SoundPlayer {
- _device: Some(device),
+ device: Some(device),
}
}
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
}