summaryrefslogtreecommitdiff
path: root/audio
diff options
context:
space:
mode:
Diffstat (limited to 'audio')
-rw-r--r--audio/src/channel.rs5
-rw-r--r--audio/src/data.rs46
-rw-r--r--audio/src/lib.rs12
-rw-r--r--audio/src/program.rs17
4 files changed, 18 insertions, 62 deletions
diff --git a/audio/src/channel.rs b/audio/src/channel.rs
index 48d416b..b74792e 100644
--- a/audio/src/channel.rs
+++ b/audio/src/channel.rs
@@ -149,6 +149,11 @@ impl Channels {
}
}
}
+impl Default for Channels {
+ fn default() -> Self {
+ Self::new()
+ }
+}
pub struct Device<'s> {
pub channels: Arc<Atomic<Channels>>,
diff --git a/audio/src/data.rs b/audio/src/data.rs
deleted file mode 100644
index 934e186..0000000
--- a/audio/src/data.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-use crate::program::Track;
-use std::fs;
-
-macro_rules! load_asm {
- ($path:tt) => {{
- let res = if cfg!(any(feature = "static", target_arch = "wasm32")) {
- let src = include_str!(concat!("../../", $path));
- Track::parse(src)
- } else {
- let src = fs::read_to_string($path)?;
- Track::parse(&src)
- };
- res.map_err(|mut err| {
- err.file = Some(String::from($path));
- err
- })?
- }};
- ($first:tt, $($arg:tt),*) => {
- load_asm!($first)$(.merge(load_asm!($arg)))*
- };
-}
-
-pub struct Data {
- pub explore: Track,
- pub megalovania: Track,
- pub test: Track,
-}
-impl Data {
- pub fn load() -> crate::Result<Self> {
- let explore = load_asm!(
- "assets/asm/explore_melody.asm",
- "assets/asm/explore_harmony1.asm",
- "assets/asm/explore_harmony2.asm"
- );
- let megalovania = load_asm!(
- "assets/asm/megalovania_melody.asm",
- "assets/asm/megalovania_base.asm"
- );
- let test = load_asm!("assets/asm/test.asm");
- Ok(Self {
- explore,
- megalovania,
- test,
- })
- }
-}
diff --git a/audio/src/lib.rs b/audio/src/lib.rs
index 814bcd0..8158c35 100644
--- a/audio/src/lib.rs
+++ b/audio/src/lib.rs
@@ -3,12 +3,12 @@
use raylib::audio::RaylibAudio;
use std::{
collections::BinaryHeap,
+ rc::Rc,
sync::atomic::Ordering,
time::{Duration, Instant},
};
use channel::Device;
-use data::Data;
use crate::{
channel::Channels,
@@ -16,9 +16,8 @@ use crate::{
};
mod channel;
-mod data;
mod parse;
-mod program;
+pub mod program;
/// The `Error` type used within this crate
pub type Error = Box<dyn std::error::Error>;
@@ -36,7 +35,6 @@ pub struct Audio {
device: Device<'static>,
last: Instant,
queue: BinaryHeap<Program>,
- pub data: Data,
}
impl Audio {
pub fn load() -> crate::Result<Self> {
@@ -53,17 +51,15 @@ impl Audio {
let device = Device::load(handle)?;
let last = Instant::now();
let queue = BinaryHeap::new();
- let data = Data::load()?;
Ok(Self {
device,
last,
queue,
- data,
})
}
- pub fn schedule(&mut self, track: Track, priority: u32, looping: bool) {
+ pub fn schedule(&mut self, track: Rc<Track>, priority: u32, looping: bool) {
let program = Program::new(track, priority, looping);
self.queue.push(program);
}
@@ -86,7 +82,7 @@ impl Audio {
res
}
// make the output quiet!
- None => Channels::new(),
+ None => Channels::default(),
};
self.device.channels.store(channels, Ordering::Relaxed);
self.last = Instant::now();
diff --git a/audio/src/program.rs b/audio/src/program.rs
index b775e24..cd050e3 100644
--- a/audio/src/program.rs
+++ b/audio/src/program.rs
@@ -52,22 +52,23 @@ use Instruction as I;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Track {
- pub ins: Rc<Vec<Instruction>>,
+ pub ins: Vec<Instruction>,
}
impl Track {
pub fn parse(src: &str) -> parse::Result<Self> {
- let ins = Rc::new(parse::parse(src)?);
+ let ins = parse::parse(src)?;
Ok(Self { ins })
}
- pub fn merge(self, other: Self) -> Self {
+ #[must_use]
+ pub fn merge(&self, other: &Self) -> Self {
let mut res = vec![];
let mut l = 0;
let mut r = 0;
let mut l_pause = 0;
let mut r_pause = 0;
- let l_ins = self.ins;
- let r_ins = other.ins;
+ let l_ins = &self.ins;
+ let r_ins = &other.ins;
loop {
if l >= l_ins.len() && r >= r_ins.len() {
@@ -124,7 +125,7 @@ impl Track {
}
}
- Self { ins: Rc::new(res) }
+ Self { ins: res }
}
}
impl fmt::Display for Track {
@@ -141,7 +142,7 @@ impl fmt::Display for Track {
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Program {
- track: Track,
+ track: Rc<Track>,
priority: u32,
looping: bool,
pc: usize,
@@ -150,7 +151,7 @@ pub struct Program {
channels: Channels,
}
impl Program {
- pub const fn new(track: Track, priority: u32, looping: bool) -> Self {
+ pub const fn new(track: Rc<Track>, priority: u32, looping: bool) -> Self {
Self {
track,
priority,