//! ***Tek*** is a MIDI sequencer, sampler, and audio plugin host for the Linux terminal. //#[global_allocator] //static A: rlsf::SmallGlobalTlsf = rlsf::SmallGlobalTlsf::new(); //#![feature(fn_traits)] //#![feature(unboxed_closures)] #![allow(macro_expanded_macro_exports_accessed_by_absolute_paths)] #![allow(ambiguous_glob_reexports)] pub(crate) use tek_core::{*, jack::*}; pub(crate) use tek_sequencer::*; pub(crate) use tek_mixer::*; pub(crate) use microxdg::XdgApp; submod! { app app_focus app_paths cli control edn help setup } /// Global modal dialog pub static MODAL: Lazy>>>> = Lazy::new(||Arc::new(Mutex::new(None))); /// Application entrypoint. pub fn main () -> Usually<()> { run(App::from_edn(include_str!("../example.edn"))? .activate(Some(|app: &Arc>|Ok({ 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.arranger.tracks.iter() .map(|t|Some(jack.register_port(&t.name.read().unwrap(), 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() { let ports = jack.client().ports(Some(name), None, PortFlags::empty()); for port in ports.iter() { if let Some(port) = jack.client().port_by_name(port) { jack.client().connect_ports(&port, &midi_in)?; } } } app.midi_in = Some(Arc::new(midi_in)); for (index, track) in app.arranger.tracks.iter_mut().enumerate() { track.midi_out = midi_outs[index].take(); } //for track in app.arranger.tracks.iter() { //track.connect_first_device()?; //track.connect_last_device(&app)?; //} }; })))?)?; Ok(()) }