summaryrefslogtreecommitdiff
path: root/audio/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'audio/src/lib.rs')
-rw-r--r--audio/src/lib.rs48
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();
}
}