diff options
Diffstat (limited to 'src/music.rs')
-rw-r--r-- | src/music.rs | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/music.rs b/src/music.rs index 888de77..7cae5eb 100644 --- a/src/music.rs +++ b/src/music.rs @@ -8,6 +8,7 @@ use crate::vendored::micromod::MmC2r; pub struct Music { pub pcm: Vec<i16>, pub offset: usize, + pub playing: bool, } #[cfg(all(feature = "music", not(feature = "32k")))] @@ -15,13 +16,24 @@ impl AudioCallback for Music { type Channel = f32; fn callback(&mut self, out_f: &mut [f32]) { - let len = out_f.len(); - let slice = &self.pcm[self.offset..(self.offset + len).min(self.pcm.len() - 1)]; - let len = slice.len(); - pcm_to_f32pcm(&slice, out_f, len); - self.offset += len; - if self.offset > self.pcm.len() { - self.offset = 0; + if self.playing { + let len = out_f.len(); + let end_of_slice = (self.offset + len).min(self.pcm.len() - 1); + let slice = &self.pcm[self.offset..end_of_slice]; + let len = slice.len(); + pcm_to_f32pcm(&slice, out_f, len); + self.offset += len; + if end_of_slice == self.pcm.len() - 1 { + self.offset = 0; + #[cfg(not(feature = "loop_music"))] + { + self.playing = false; + } + } + } else { + for i in 0..out_f.len() - 1 { + out_f[i] = 0.0; + } } } } |