use crate::dsp::Frame;
use super::{Backend, Renderer};
enum State {
Uninitialized,
Initialized { renderer: Renderer },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MockBackendSettings {
pub sample_rate: u32,
}
impl Default for MockBackendSettings {
fn default() -> Self {
Self { sample_rate: 1 }
}
}
pub struct MockBackend {
sample_rate: u32,
state: State,
}
impl MockBackend {
pub fn set_sample_rate(&mut self, sample_rate: u32) {
self.sample_rate = sample_rate;
if let State::Initialized { renderer } = &mut self.state {
renderer.on_change_sample_rate(sample_rate);
}
}
pub fn on_start_processing(&mut self) {
if let State::Initialized { renderer } = &mut self.state {
renderer.on_start_processing();
} else {
panic!("backend is not initialized")
}
}
pub fn process(&mut self) -> Frame {
if let State::Initialized { renderer } = &mut self.state {
renderer.process()
} else {
panic!("backend is not initialized")
}
}
}
impl Backend for MockBackend {
type Settings = MockBackendSettings;
type Error = ();
fn setup(settings: Self::Settings) -> Result<(Self, u32), Self::Error> {
Ok((
Self {
sample_rate: settings.sample_rate,
state: State::Uninitialized,
},
settings.sample_rate,
))
}
fn start(&mut self, renderer: Renderer) -> Result<(), Self::Error> {
self.state = State::Initialized { renderer };
Ok(())
}
}