From b1ff5495148b774c8a1ff8568b11167303c3d4cf Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 3 Nov 2024 05:00:29 +0200 Subject: [PATCH] AudioEngine pt.3: arranger init with jack --- crates/tek_core/src/audio.rs | 4 +- crates/tek_sequencer/src/arranger_cli.rs | 68 +++++++++++------------ crates/tek_sequencer/src/sequencer_cli.rs | 11 ++-- crates/tek_sequencer/src/transport_cli.rs | 4 +- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/crates/tek_core/src/audio.rs b/crates/tek_core/src/audio.rs index 4057ad2b..e904ed96 100644 --- a/crates/tek_core/src/audio.rs +++ b/crates/tek_core/src/audio.rs @@ -36,12 +36,12 @@ impl JackClient { } pub fn activate_with ( self, - init: impl FnOnce(&Arc>)->T + init: impl FnOnce(&Arc>)->Usually ) -> Usually>> { let client = Arc::new(RwLock::new(self)); - let target = Arc::new(RwLock::new(init(&client))); + let target = Arc::new(RwLock::new(init(&client)?)); let event = Box::new(move|_|{/*TODO*/}) as Box; let events = Notifications(event); let frame = Box::new({ diff --git a/crates/tek_sequencer/src/arranger_cli.rs b/crates/tek_sequencer/src/arranger_cli.rs index 0d157c4e..2ad4fee2 100644 --- a/crates/tek_sequencer/src/arranger_cli.rs +++ b/crates/tek_sequencer/src/arranger_cli.rs @@ -19,43 +19,37 @@ pub struct ArrangerCli { impl ArrangerCli { /// Run the arranger TUI from CLI arguments. fn run (&self) -> Usually<()> { - let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; - let jack = JackClient::Inactive(jack); - let transport = TransportToolbar::new(None, Some(jack.transport())); - let phrases = Arc::new(RwLock::new(PhrasePool::new())); - let mut arrangement = Arrangement::new(&jack, &transport.clock, "", &phrases); - let transport = Arc::new(RwLock::new(transport)); - if let Some(name) = self.name.as_ref() { - *arrangement.name.write().unwrap() = name.clone(); - } - let track_color_1 = ItemColor::random(); - let track_color_2 = ItemColor::random(); - for i in 0..self.tracks { - let _track = arrangement.track_add( - None, - Some(track_color_1.mix(track_color_2, i as f32 / self.tracks as f32)) - )?; - } - let scene_color_1 = ItemColor::random(); - let scene_color_2 = ItemColor::random(); - for i in 0..self.scenes { - let _scene = arrangement.scene_add( - None, - Some(scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32)) - )?; - } - let arranger = Arc::new(RwLock::new(Arranger::new( - self.transport.then_some(transport), - arrangement, - phrases, - ))); - let jack = jack.activate(&arranger.clone(), Arranger::callback)?; - let jack = Some(jack.into()); - if let Some(ref transport) = arranger.read().unwrap().transport { - transport.write().unwrap().jack = jack.clone(); - } - arranger.write().unwrap().jack = jack.clone(); - Tui::run(arranger)?; + Tui::run(JackClient::new("tek_arranger")?.activate_with(|jack|{ + let transport = TransportToolbar::new(jack, None); + let phrases = Arc::new(RwLock::new(PhrasePool::new())); + let mut arrangement = Arrangement::new(&jack, &transport.clock, "", &phrases); + let transport = Arc::new(RwLock::new(transport)); + if let Some(name) = self.name.as_ref() { + *arrangement.name.write().unwrap() = name.clone(); + } + let track_color_1 = ItemColor::random(); + let track_color_2 = ItemColor::random(); + for i in 0..self.tracks { + let _track = arrangement.track_add( + None, + Some(track_color_1.mix(track_color_2, i as f32 / self.tracks as f32)) + )?; + } + let scene_color_1 = ItemColor::random(); + let scene_color_2 = ItemColor::random(); + for i in 0..self.scenes { + let _scene = arrangement.scene_add( + None, + Some(scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32)) + )?; + } + Ok(Arranger::new( + jack, + self.transport.then_some(transport), + arrangement, + phrases, + )) + })?)?; Ok(()) } } diff --git a/crates/tek_sequencer/src/sequencer_cli.rs b/crates/tek_sequencer/src/sequencer_cli.rs index e9b0dd35..14a9c758 100644 --- a/crates/tek_sequencer/src/sequencer_cli.rs +++ b/crates/tek_sequencer/src/sequencer_cli.rs @@ -18,16 +18,15 @@ pub struct SequencerCli { impl SequencerCli { fn run (&self) -> Usually<()> { - let name = self.name.map(|name|name.as_str()).unwrap_or("tek_arranger"); - Tui::run(JackClient::new(name)?.activate_with(|jack|{ - let mut transport = TransportToolbar::new(jack, None); + Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{ + let transport = TransportToolbar::new(jack, None); let sequencer = Sequencer { jack: jack.clone(), focus_cursor: (1, 1), phrases: Arc::new(RwLock::new(PhrasePool::new())), editor: PhraseEditor::new(), clock: transport.clock.clone(), - player: Some(PhrasePlayer::new(jack, &transport.clock)), + player: PhrasePlayer::new(jack, &transport.clock), transport: self.transport.then_some(Arc::new(RwLock::new(transport))), }; if let Some(_) = self.name.as_ref() { @@ -41,8 +40,8 @@ impl SequencerCli { //phrase.write().unwrap().length = length; //} } - sequencer - }))?; + Ok(sequencer) + })?)?; Ok(()) } } diff --git a/crates/tek_sequencer/src/transport_cli.rs b/crates/tek_sequencer/src/transport_cli.rs index e8c7e1a2..4cd2278e 100644 --- a/crates/tek_sequencer/src/transport_cli.rs +++ b/crates/tek_sequencer/src/transport_cli.rs @@ -4,7 +4,7 @@ pub fn main () -> Usually<()> { Tui::run(JackClient::new("tek_transport")?.activate_with(|jack|{ let mut transport = TransportToolbar::new(jack, None); transport.focused = true; - transport - }))?; + Ok(transport) + })?)?; Ok(()) }