use crate::user::*;
use crate::audio::*;
pub struct App<T> {
user: User,
mic: MicrophoneSystem,
speaker: SpeakerSystem,
file: T,
changed: bool,
}
impl<T> App<T> {
pub fn new(file: T) -> App<T> {
App {
user: User::new(),
mic: MicrophoneSystem::new(SampleRate::Normal).unwrap(),
speaker: SpeakerSystem::new(SampleRate::Normal).unwrap(),
file,
changed: false,
}
}
pub fn user(&self) -> &User {
&self.user
}
pub fn file(&mut self) -> &mut T {
&mut self.file
}
pub fn fetch<U>(&mut self, res: &str) -> Option<U>
where for<'de> U: serde::Deserialize<'de>
{
stronghold::fetch(res)
}
pub fn open(&mut self, zip: &str, res: &str) -> Option<()>
where for<'de> T: serde::Deserialize<'de>
{
self.file = stronghold::load(zip, res)?;
Some(())
}
pub fn edit(&mut self) {
self.changed = true;
}
pub fn sync(&mut self, zip: &str, res: &str)
where T: serde::Serialize
{
if self.changed {
stronghold::save(zip, res, &self.file);
self.changed = false;
}
}
pub fn record(&mut self, callback: &mut FnMut(usize, i16, i16)) {
self.mic.record(callback);
}
pub fn play(&mut self, callback: &mut FnMut() -> AudioSample) {
self.speaker.play(callback);
}
}