diff options
Diffstat (limited to 'audio/src/lib.rs')
| -rw-r--r-- | audio/src/lib.rs | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/audio/src/lib.rs b/audio/src/lib.rs index 02800b9..2f0c4ed 100644 --- a/audio/src/lib.rs +++ b/audio/src/lib.rs @@ -1,11 +1,20 @@ //! The `audio` crate stores all audio assets that need to be loaded during runtime use raylib::audio::RaylibAudio; -use std::time::{Duration, Instant}; +use std::{ + collections::BinaryHeap, + sync::atomic::Ordering, + time::{Duration, Instant}, +}; use channel::Device; use data::Data; +use crate::{ + channel::Channels, + program::{Program, Track}, +}; + mod channel; mod data; mod parse; @@ -26,6 +35,7 @@ const TIME_SLICE: Duration = Duration::from_millis(1000 / AUDIO_FPS as u64); pub struct Audio { device: Device<'static>, last: Instant, + queue: BinaryHeap<Program>, pub data: Data, } impl Audio { @@ -42,17 +52,43 @@ impl Audio { let handle = Box::leak(Box::new(RaylibAudio::init_audio_device()?)); let device = Device::load(handle)?; let last = Instant::now(); + let queue = BinaryHeap::new(); let data = Data::load()?; - Ok(Self { device, last, data }) + Ok(Self { + device, + last, + queue, + data, + }) + } + + pub fn schedule(&mut self, track: Track, priority: u32) { + let program = Program::new(track, priority); + self.queue.push(program); + } + + pub fn clear(&mut self) { + self.queue.clear(); } - #[expect(clippy::unwrap_used)] pub fn update(&mut self) { if self.last.elapsed() >= TIME_SLICE { - let mut channels = self.device.channels.lock().unwrap(); - self.data.explore.exec(&mut channels); - self.data.megalovania.exec(&mut channels); + let res_opt = self + .queue + .peek_mut() + .map(|mut program| (program.exec(), program.is_finished())); + let channels = match res_opt { + Some((res, finished)) => { + if finished { + self.queue.pop(); + } + res + } + // make the output quiet! + None => Channels::new(), + }; + self.device.channels.store(channels, Ordering::Relaxed); self.last = Instant::now(); } } |