From 49a5451af29d8e1f513ddd9f43dca9044f2fdc4c Mon Sep 17 00:00:00 2001 From: stop screaming Date: Fri, 20 Feb 2026 14:50:42 +0200 Subject: [PATCH] refactor(app) what is UP with that init --- app/tek.rs | 72 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/app/tek.rs b/app/tek.rs index 11cb8652..cdb057e9 100644 --- a/app/tek.rs +++ b/app/tek.rs @@ -908,50 +908,66 @@ pub mod glue { midi_from, midi_from_re, midi_to, midi_to_re, left_from, right_from, left_to, right_to, .. } = &self.action { - let name = name.as_ref().map_or("tek", |x|x.as_str()); - let jack = Jack::new(&name)?; + + // Connect to JACK + let name = name.as_ref().map_or("tek", |x|x.as_str()); + let jack = Jack::new(&name)?; + + // Collect MIDI IO: + let midi_ins = Connect::collect(&midi_from, &[] as &[&str], &midi_from_re).iter().enumerate() + .map(|(index, connect)|jack.midi_in(&format!("M/{index}"), &[connect.clone()])) + .collect::, _>>()?; + let midi_outs = Connect::collect(&midi_to, &[] as &[&str], &midi_to_re).iter().enumerate() + .map(|(index, connect)|jack.midi_out(&format!("{index}/M"), &[connect.clone()])) + .collect::, _>>()?; + + // TODO: Collect audio IO: let empty = &[] as &[&str]; let left_froms = Connect::collect(&left_from, empty, empty); let left_tos = Connect::collect(&left_to, empty, empty); let right_froms = Connect::collect(&right_from, empty, empty); let right_tos = Connect::collect(&right_to, empty, empty); let _audio_froms = &[left_froms.as_slice(), right_froms.as_slice()]; - let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()]; - let mut midi_ins = vec![]; - let mut midi_outs = vec![]; - for (index, connect) in Connect::collect(&midi_from, &[] as &[&str], &midi_from_re).iter().enumerate() { - midi_ins.push(jack.midi_in(&format!("M/{index}"), &[connect.clone()])?); - } - for (index, connect) in Connect::collect(&midi_to, &[] as &[&str], &midi_to_re).iter().enumerate() { - midi_outs.push(jack.midi_out(&format!("{index}/M"), &[connect.clone()])?); - }; - let clock = Clock::new( - &jack, *bpm - )?; - let mut project = Arrangement::new( - &jack, None, clock, vec![], vec![], midi_ins, midi_outs - ); + let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()]; + + // Create initial project: + let clock = Clock::new(&jack, *bpm)?; + let mut project = Arrangement::new(&jack, None, clock, vec![], vec![], + midi_ins, midi_outs); project.tracks_add(tracks.unwrap_or(0), None, &[], &[])?; project.scenes_add(scenes.unwrap_or(0))?; + if matches!(self.action, Action::Status) { + + // Show status and exit self.show_status(&project); + } else { + + // Initialize the app state let app = App::new(&jack, project, config, ":menu"); - let client = jack.run(move|jack|{ - jack.sync_lead(*sync_lead, |mut state|{ - let clock = app.clock(); - clock.playhead.update_from_sample(state.position.frame() as f64); - state.position.bbt = Some(clock.bbt()); - state.position - })?; - jack.sync_follow(*sync_follow)?; - Ok(app) - })?; + if matches!(self.action, Action::Headless) { + + // TODO: Headless mode (daemon + client over IPC, then over network...) println!("todo headless"); + } else { - Tui::run(&client)?; + + // Run the [Tui] and [Jack] threads with the [App] state. + Tui::run(true, jack.run(move|jack|{ + jack.sync_lead(*sync_lead, |mut state|{ + let clock = app.clock(); + clock.playhead.update_from_sample(state.position.frame() as f64); + state.position.bbt = Some(clock.bbt()); + state.position + })?; + jack.sync_follow(*sync_follow)?; + Ok(app) + })?)?; + } + } } Ok(())