use std::time::Instant;
use crate::{
config::Config,
midi::{MidiError, MidiMessage, MidiStore},
resources::{
Resources,
params::{ParamError, ParamKey},
},
};
pub struct AudioContext {
config: Config,
midi_store: Option<MidiStore>,
resources: Resources,
block_start: Instant,
}
impl AudioContext {
pub fn new(config: Config, resources: Resources) -> Self {
Self {
config,
midi_store: None,
resources,
block_start: Instant::now(),
}
}
pub fn set_sample_rate(&mut self, sr: usize) {
self.config.sample_rate = sr;
}
pub fn set_block_size(&mut self, block_size: usize) {
self.config.block_size = block_size;
}
pub fn get_config(&self) -> Config {
self.config
}
pub fn get_resources(&self) -> &Resources {
&self.resources
}
pub fn set_resources(&mut self, resources: Resources) {
self.resources = resources;
}
pub fn get_resources_mut(&mut self) -> &mut Resources {
&mut self.resources
}
pub fn get_param(&self, key: &ParamKey) -> Result<f32, ParamError> {
self.resources.get_param(key)
}
pub fn set_midi_store(&mut self, store: MidiStore) {
self.midi_store = Some(store);
}
pub fn get_midi_store(&self) -> Option<&MidiStore> {
self.midi_store.as_ref()
}
pub fn set_instant(&mut self) {
self.block_start = Instant::now()
}
pub fn get_instant(&mut self) -> Instant {
self.block_start
}
#[inline(always)]
pub fn insert_midi_msg(&mut self, msg: MidiMessage) -> Result<(), MidiError> {
let store = self.midi_store.as_mut().unwrap();
store.insert(msg)
}
#[inline(always)]
pub fn clear_midi(&mut self) {
if let Some(store) = &mut self.midi_store {
store.clear();
}
}
}