From edf5f17e9cb3ce18dab539b2b4ed853b7606c3f7 Mon Sep 17 00:00:00 2001 From: ceemos Date: Sat, 15 Feb 2025 04:10:27 +0100 Subject: feat: basic audio --- .vscode/settings.json | 3 ++- src/main.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ uwudhd.mod | Bin 0 -> 6148 bytes 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 uwudhd.mod diff --git a/.vscode/settings.json b/.vscode/settings.json index ff30c44..a600de3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "editor.tabSize": 2 + "editor.tabSize": 2, + "editor.formatOnSave": true } \ No newline at end of file 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); diff --git a/uwudhd.mod b/uwudhd.mod new file mode 100644 index 0000000..ea3e090 Binary files /dev/null and b/uwudhd.mod differ -- cgit v1.2.3