From 36ffa2aab8ab998f7ed4c0af1044277dedaad92b Mon Sep 17 00:00:00 2001 From: /dev/urandom Date: Sat, 15 Feb 2025 04:30:29 +0100 Subject: feat: working music --- src/music.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/music.rs (limited to 'src/music.rs') diff --git a/src/music.rs b/src/music.rs new file mode 100644 index 0000000..d44eabf --- /dev/null +++ b/src/music.rs @@ -0,0 +1,37 @@ +use sdl2::audio::AudioCallback; + +use crate::vendored::micromod::MmC2r; + +pub struct Music { + pub pcm: Vec, + pub offset: usize, +} + +impl AudioCallback for Music { + type Channel = f32; + + fn callback(&mut self, out_f: &mut [f32]) { + let len = out_f.len(); + pcm_to_f32pcm(&self.pcm[self.offset..(self.offset + len)], out_f, len); + self.offset += len; + } +} + +pub fn mmc2r_to_pcm(state: &mut MmC2r) -> Vec { + let mut destination = Vec::::new(); + loop { + let mut out = [0; 4096]; + if !state.get_audio(&mut out, 2048) { + break; + } + for sample in out { + destination.push(sample); + } + } + destination +} +pub fn pcm_to_f32pcm(input: &[i16], output: &mut [f32], len: usize) { + for i in 0..len { + output[i] = f32::from(input[i]) / f32::from(0x7FFF as i16); + } +} -- cgit v1.2.3