use crate::* /// A [AudioComponent] bound to a JACK client and a set of ports. pub struct JackDevice { /// The active JACK client of this device. pub client: DynamicAsyncClient, /// The device state, encapsulated for sharing between threads. pub state: Arc>>>, /// Unowned copies of the device's JACK ports, for connecting to the device. /// The "real" readable/writable `Port`s are owned by the `state`. pub ports: UnownedJackPorts, } impl std::fmt::Debug for JackDevice { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("JackDevice") .field("ports", &self.ports) .finish() } } impl Render for JackDevice { type Engine = E; fn min_size(&self, to: E::Size) -> Perhaps { self.state.read().unwrap().layout(to) } fn render(&self, to: &mut E::Output) -> Usually<()> { self.state.read().unwrap().render(to) } } impl Handle for JackDevice { fn handle(&mut self, from: &E::Input) -> Perhaps { self.state.write().unwrap().handle(from) } } impl Ports for JackDevice { fn audio_ins(&self) -> Usually>> { Ok(self.ports.audio_ins.values().collect()) } fn audio_outs(&self) -> Usually>> { Ok(self.ports.audio_outs.values().collect()) } fn midi_ins(&self) -> Usually>> { Ok(self.ports.midi_ins.values().collect()) } fn midi_outs(&self) -> Usually>> { Ok(self.ports.midi_outs.values().collect()) } } impl JackDevice { /// Returns a locked mutex of the state's contents. pub fn state(&self) -> LockResult>>> { self.state.read() } /// Returns a locked mutex of the state's contents. pub fn state_mut(&self) -> LockResult>>> { self.state.write() } pub fn connect_midi_in(&self, index: usize, port: &Port) -> Usually<()> { Ok(self .client .as_client() .connect_ports(port, self.midi_ins()?[index])?) } pub fn connect_midi_out(&self, index: usize, port: &Port) -> Usually<()> { Ok(self .client .as_client() .connect_ports(self.midi_outs()?[index], port)?) } pub fn connect_audio_in(&self, index: usize, port: &Port) -> Usually<()> { Ok(self .client .as_client() .connect_ports(port, self.audio_ins()?[index])?) } pub fn connect_audio_out(&self, index: usize, port: &Port) -> Usually<()> { Ok(self .client .as_client() .connect_ports(self.audio_outs()?[index], port)?) } }