From 8f3c83f8c39c6e15733a22b3b459d0ec5a058134 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 11 Jul 2024 14:47:07 +0300 Subject: [PATCH] partially fix port autoconnect --- src/jack.rs | 19 ++++++------------- src/main.rs | 23 +++++++++++++++++++++++ src/model.rs | 3 +-- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/jack.rs b/src/jack.rs index f6b9aaf7..688a84f4 100644 --- a/src/jack.rs +++ b/src/jack.rs @@ -45,20 +45,13 @@ impl JackClient { } } pub fn transport (&self) -> Transport { - match self { - Self::Inactive(client) => - client.transport(), - Self::Active(client) => - client.as_client().transport(), - } + self.client().transport() } - fn register_port (&self, name: &str, spec: PS) -> Usually> { - Ok(match self { - Self::Inactive(client) => - client.register_port(name, spec)?, - Self::Active(client) => - client.as_client().register_port(name, spec)?, - }) + pub fn port_by_name (&self, name: &str) -> Option> { + self.client().port_by_name(name) + } + pub fn register_port (&self, name: &str, spec: PS) -> Usually> { + Ok(self.client().register_port(name, spec)?) } pub fn activate ( self, diff --git a/src/main.rs b/src/main.rs index fda579b6..fd04cdaa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,29 @@ pub fn main () -> Usually<()> { .with_midi_ins(&["nanoKEY Studio.*capture.*"])? .with_audio_outs(&["Komplete.+:playback_FL", "Komplete.+:playback_FR"])? .activate(Some(|app: &Arc>| { + let (midi_in, mut midi_outs) = { + let app = app.read().unwrap(); + let jack = app.jack.as_ref().unwrap(); + let midi_in = jack.register_port("midi-in", MidiIn)?; + let midi_outs = app.tracks.iter() + .map(|t|Some(jack.register_port(&t.name, MidiOut).unwrap())) + .collect::>(); + (midi_in, midi_outs) + }; + { + let mut app = app.write().unwrap(); + let jack = app.jack.as_ref().unwrap(); + for name in app.midi_ins.iter() { + if let Some(port) = jack.client().port_by_name(&name) { + jack.client().connect_ports(&port, &midi_in)?; + } + } + app.midi_in = Some(Arc::new(midi_in)); + for (index, track) in app.tracks.iter_mut().enumerate() { + track.midi_out = midi_outs[index].take(); + track.connect_first_device()?; + } + } Ok(()) }))?; run(app)?; diff --git a/src/model.rs b/src/model.rs index 79ac2d89..ee01387a 100644 --- a/src/model.rs +++ b/src/model.rs @@ -22,7 +22,7 @@ pub struct App { pub jack: Option, /// Map of external MIDI outs in the jack graph /// to internal MIDI ins of this app. - pub midi_in: Option>, + pub midi_in: Option>>, /// Names of ports to connect to main MIDI IN. pub midi_ins: Vec, /// Main audio outputs. @@ -172,7 +172,6 @@ impl App { }) .collect::>()) .collect::>()?; - self.midi_in = Some(midi_in); Ok(self) } pub fn activate (mut self, init: Option>)->Usually<()>>) -> Usually>> {