diff options
feat: basic audio
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/src/main.rs b/src/main.rs index edd7f87..7d42d2f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ mod interpolation;  mod render;  pub mod vendored; +use std::io::{BufWriter, Write};  use std::time::{Duration, SystemTime};  use sdl2::{event::Event, keyboard::Keycode}; @@ -14,8 +15,52 @@ use sdl2::{event::Event, keyboard::Keycode};  #[cfg(all(not(feature = "notimeout"), not(feature = "32k")))]  const TIMEOUT_DEATH: f64 = render::JUST_DVD + 20.0; +use sdl2::audio::{AudioCallback, AudioSpecDesired}; +use vendored::micromod::MmC2r; + +struct Music<'a> { +  mm: MmC2r<'a>, +} + +impl<'a> AudioCallback for Music<'a> { +  type Channel = f32; + +  fn callback(&mut self, out_f: &mut [f32]) { +    let len = out_f.len(); +    println!("{len}"); +    let mut out = [0; 32768]; +    if !self.mm.get_audio(&mut out, len as isize) { +      return; +    } +    for i in 0..len { +      out_f[i] = f32::from(out[i]) / f32::from(0x7FFF as i16); +    } +  } +} +  pub fn main() {    let sdl_context = sdl2::init().unwrap(); + +  let audio_subsystem = sdl_context.audio().unwrap(); + +  let desired_spec = AudioSpecDesired { +    freq: Some(48_000), +    channels: Some(1), +    samples: Some(8192 as u16), +  }; + +  let device = audio_subsystem +    .open_playback(None, &desired_spec, |spec| { +      // initialize the audio callback +      Music { +        mm: MmC2r::new(include_bytes!("../uwudhd.mod"), spec.freq as isize).unwrap(), +      } +    }) +    .unwrap(); + +  // Start playback +  device.resume(); +    let video_subsystem = sdl_context.video().unwrap();    let mut builder = video_subsystem.window("Cosin25 Invite", 512, 256); |