use crate::*; pub trait JackActivate: Sized { fn activate_with ( self, init: impl FnOnce(&Arc>)->Usually ) -> Usually>>; } impl JackActivate for JackConnection { fn activate_with ( self, init: impl FnOnce(&Arc>)->Usually ) -> Usually>> { let client = Arc::new(RwLock::new(self)); let target = Arc::new(RwLock::new(init(&client)?)); let event = Box::new(move|_|{/*TODO*/}) as Box; 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) } }