aboutsummaryrefslogtreecommitdiffstats
path: root/src/music.rs
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar /dev/urandom <johnfkennedymaili2p>2025-02-15 04:30:29 +0100
committerLibravatarLarge Libravatar /dev/urandom <johnfkennedymaili2p>2025-02-15 04:30:29 +0100
commit36ffa2aab8ab998f7ed4c0af1044277dedaad92b (patch)
treedea273b8742683b93576f723de5cfb8b9dcf56af /src/music.rs
parentedf5f17e9cb3ce18dab539b2b4ed853b7606c3f7 (diff)
downloadcosin25-invite-mountainbytes-36ffa2aab8ab998f7ed4c0af1044277dedaad92b.tar.gz
cosin25-invite-mountainbytes-36ffa2aab8ab998f7ed4c0af1044277dedaad92b.tar.bz2
cosin25-invite-mountainbytes-36ffa2aab8ab998f7ed4c0af1044277dedaad92b.tar.lz
cosin25-invite-mountainbytes-36ffa2aab8ab998f7ed4c0af1044277dedaad92b.zip

feat: working music

Diffstat (limited to 'src/music.rs')
-rw-r--r--src/music.rs37
1 files changed, 37 insertions, 0 deletions
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<i16>,
+ 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<i16> {
+ let mut destination = Vec::<i16>::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);
+ }
+}