refactor(app) what is UP with that init

This commit is contained in:
stop screaming 2026-02-20 14:50:42 +02:00
parent 9b4f7f25c1
commit 49a5451af2

View file

@ -908,8 +908,20 @@ pub mod glue {
midi_from, midi_from_re, midi_to, midi_to_re, midi_from, midi_from_re, midi_to, midi_to_re,
left_from, right_from, left_to, right_to, .. left_from, right_from, left_to, right_to, ..
} = &self.action { } = &self.action {
// Connect to JACK
let name = name.as_ref().map_or("tek", |x|x.as_str()); let name = name.as_ref().map_or("tek", |x|x.as_str());
let jack = Jack::new(&name)?; 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::<Result<Vec<_>, _>>()?;
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::<Result<Vec<_>, _>>()?;
// TODO: Collect audio IO:
let empty = &[] as &[&str]; let empty = &[] as &[&str];
let left_froms = Connect::collect(&left_from, empty, empty); let left_froms = Connect::collect(&left_from, empty, empty);
let left_tos = Connect::collect(&left_to, empty, empty); let left_tos = Connect::collect(&left_to, empty, empty);
@ -917,27 +929,33 @@ pub mod glue {
let right_tos = Connect::collect(&right_to, empty, empty); let right_tos = Connect::collect(&right_to, empty, empty);
let _audio_froms = &[left_froms.as_slice(), right_froms.as_slice()]; let _audio_froms = &[left_froms.as_slice(), right_froms.as_slice()];
let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()]; let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()];
let mut midi_ins = vec![];
let mut midi_outs = vec![]; // Create initial project:
for (index, connect) in Connect::collect(&midi_from, &[] as &[&str], &midi_from_re).iter().enumerate() { let clock = Clock::new(&jack, *bpm)?;
midi_ins.push(jack.midi_in(&format!("M/{index}"), &[connect.clone()])?); let mut project = Arrangement::new(&jack, None, clock, vec![], vec![],
} midi_ins, midi_outs);
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
);
project.tracks_add(tracks.unwrap_or(0), None, &[], &[])?; project.tracks_add(tracks.unwrap_or(0), None, &[], &[])?;
project.scenes_add(scenes.unwrap_or(0))?; project.scenes_add(scenes.unwrap_or(0))?;
if matches!(self.action, Action::Status) { if matches!(self.action, Action::Status) {
// Show status and exit
self.show_status(&project); self.show_status(&project);
} else { } else {
// Initialize the app state
let app = App::new(&jack, project, config, ":menu"); let app = App::new(&jack, project, config, ":menu");
let client = jack.run(move|jack|{
if matches!(self.action, Action::Headless) {
// TODO: Headless mode (daemon + client over IPC, then over network...)
println!("todo headless");
} else {
// Run the [Tui] and [Jack] threads with the [App] state.
Tui::run(true, jack.run(move|jack|{
jack.sync_lead(*sync_lead, |mut state|{ jack.sync_lead(*sync_lead, |mut state|{
let clock = app.clock(); let clock = app.clock();
clock.playhead.update_from_sample(state.position.frame() as f64); clock.playhead.update_from_sample(state.position.frame() as f64);
@ -946,12 +964,10 @@ pub mod glue {
})?; })?;
jack.sync_follow(*sync_follow)?; jack.sync_follow(*sync_follow)?;
Ok(app) Ok(app)
})?; })?)?;
if matches!(self.action, Action::Headless) {
println!("todo headless");
} else {
Tui::run(&client)?;
} }
} }
} }
Ok(()) Ok(())