use std::rc::Rc;
use std::sync::mpsc;
use pw::context::ContextRc;
use pw::core::CoreRc;
use pw::main_loop::MainLoopRc;
use crate::common::result::Result;
use crate::platform::linux::command::{CmdListener, Response, StreamStates};
use crate::platform::linux::manager::Command;
use crate::platform::linux::registry::RegState;
pub fn pw_thread(sender: &mpsc::Sender<Response>, receiver: pw::channel::Receiver<Command>) {
if let Err(e) = || -> Result<()> {
let mainloop = MainLoopRc::new(None)?;
let context = ContextRc::new(&mainloop, None)?;
let core = context.connect_rc(None)?;
let registry = core.get_registry()?;
let reg_state = Rc::new(RegState::default());
let streams = Rc::new(StreamStates::default());
let listener = Rc::new(CmdListener::new(&mainloop, &core, ®_state, sender, &streams));
let _reg_listener = reg_state.monitor(®istry, &streams, sender, &listener);
let _attached_receiver = receiver.attach(mainloop.loop_(), listener.recv());
drain_queue(&mainloop, &core);
send!(sender, Response::Ready)?;
mainloop.run();
Ok(())
}() {
send_logged!(sender, Response::Error(e));
}
}
fn drain_queue(mainloop: &MainLoopRc, core: &CoreRc) {
let _core_listener = core
.add_listener_local()
.done({
let mainloop = mainloop.clone();
move |_id, _seq| {
mainloop.quit();
}
})
.register();
core.sync(0).expect("Core sync should never fail");
mainloop.run();
}