mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
36 lines
1.2 KiB
Rust
36 lines
1.2 KiB
Rust
use crate::*;
|
|
|
|
pub trait JackActivate: Sized {
|
|
fn activate_with <T: Audio + 'static> (
|
|
self,
|
|
init: impl FnOnce(&Arc<RwLock<JackConnection>>)->Usually<T>
|
|
)
|
|
-> Usually<Arc<RwLock<T>>>;
|
|
}
|
|
|
|
impl JackActivate for JackConnection {
|
|
fn activate_with <T: Audio + 'static> (
|
|
self,
|
|
init: impl FnOnce(&Arc<RwLock<JackConnection>>)->Usually<T>
|
|
)
|
|
-> Usually<Arc<RwLock<T>>>
|
|
{
|
|
let client = Arc::new(RwLock::new(self));
|
|
let target = Arc::new(RwLock::new(init(&client)?));
|
|
let event = Box::new(move|_|{/*TODO*/}) as Box<dyn Fn(JackEvent) + Send + Sync>;
|
|
let events = Notifications(event);
|
|
let frame = Box::new({
|
|
let target = target.clone();
|
|
move|c: &_, s: &_|if let Ok(mut target) = target.write() {
|
|
target.process(c, s)
|
|
} else {
|
|
Control::Quit
|
|
}
|
|
});
|
|
let frames = ClosureProcessHandler::new(frame as BoxedAudioHandler);
|
|
let mut buffer = Self::Activating;
|
|
std::mem::swap(&mut*client.write().unwrap(), &mut buffer);
|
|
*client.write().unwrap() = Self::Active(Client::from(buffer).activate_async(events, frames)?);
|
|
Ok(target)
|
|
}
|
|
}
|