From 67a5ea3a2bb16052d0f01ecde3830d02a03d02f3 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 26 Oct 2024 17:31:44 +0300 Subject: [PATCH] pass around TransportTime --- crates/tek_sequencer/src/arranger.rs | 17 +++++++++---- crates/tek_sequencer/src/arranger_cli.rs | 2 +- crates/tek_sequencer/src/sequencer.rs | 2 ++ crates/tek_sequencer/src/sequencer_cli.rs | 14 +++++------ crates/tek_sequencer/src/transport.rs | 29 ++++++++++++++--------- crates/tek_sequencer/src/transport_cli.rs | 2 +- 6 files changed, 41 insertions(+), 25 deletions(-) diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index a436cbdc..89d468d5 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -6,6 +6,8 @@ pub struct Arranger { pub focus_cursor: (usize, usize), /// Controls the JACK transport. pub transport: Option>>>, + /// Global timebase + pub clock: Arc, /// Contains all the sequencers. pub arrangement: Arrangement, /// Pool of all phrases in the arrangement @@ -117,14 +119,19 @@ impl Arranger { phrases: Arc>>, ) -> Self { let mut app = Self { - focus_cursor: (0, 1), - editor: PhraseEditor::new(), - status: ArrangerStatusBar::ArrangementClip, + focus_cursor: (0, 1), + phrases_split: 20, + arrangement_split: 20, + editor: PhraseEditor::new(), + status: ArrangerStatusBar::ArrangementClip, + clock: if let Some(ref transport) = transport { + transport.read().unwrap().clock.clone() + } else { + Arc::new(TransportTime::default()) + }, transport, arrangement, phrases, - phrases_split: 20, - arrangement_split: 20, }; app.update_focus(); app diff --git a/crates/tek_sequencer/src/arranger_cli.rs b/crates/tek_sequencer/src/arranger_cli.rs index 7e883bd6..10dcdce3 100644 --- a/crates/tek_sequencer/src/arranger_cli.rs +++ b/crates/tek_sequencer/src/arranger_cli.rs @@ -21,7 +21,7 @@ impl ArrangerCli { fn run (&self) -> Usually<()> { let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; let jack = JackClient::Inactive(jack); - let transport = Arc::new(RwLock::new(TransportToolbar::new(Some(jack.transport())))); + let transport = Arc::new(RwLock::new(TransportToolbar::new(None, Some(jack.transport())))); let phrases = Arc::new(RwLock::new(PhrasePool::new())); let mut arrangement = Arrangement::new("", &phrases); if let Some(name) = self.name.as_ref() { diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index 1fb3ea0b..93f6f7d6 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -11,6 +11,8 @@ pub struct Sequencer { pub focus_cursor: (usize, usize), /// Controls the JACK transport. pub transport: Option>>>, + /// Global timebase + pub clock: Arc, /// Pool of all phrases available to the sequencer pub phrases: Arc>>, /// Phrase editor view diff --git a/crates/tek_sequencer/src/sequencer_cli.rs b/crates/tek_sequencer/src/sequencer_cli.rs index ef11b9f9..f718b984 100644 --- a/crates/tek_sequencer/src/sequencer_cli.rs +++ b/crates/tek_sequencer/src/sequencer_cli.rs @@ -20,7 +20,7 @@ impl SequencerCli { fn run (&self) -> Usually<()> { let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; let jack = JackClient::Inactive(jack); - let transport = Arc::new(RwLock::new(TransportToolbar::new(Some(jack.transport())))); + let transport = Arc::new(RwLock::new(TransportToolbar::new(None, Some(jack.transport())))); transport.write().unwrap().jack = Some( jack.activate( &transport.clone(), @@ -29,12 +29,12 @@ impl SequencerCli { } )? ); - let seq = Sequencer { - focus_cursor: (1, 1), - transport: self.transport.then_some(transport), - editor: PhraseEditor::new(), - phrases: Arc::new(RwLock::new(PhrasePool::new())), - }; + let focus_cursor = (1, 1); + let clock = transport.read().unwrap().clock.clone(); + let transport = self.transport.then_some(transport); + let editor = PhraseEditor::new(); + let phrases = Arc::new(RwLock::new(PhrasePool::new())); + let seq = Sequencer { focus_cursor, clock, transport, editor, phrases }; if let Some(_) = self.name.as_ref() { // TODO: seq.name = Arc::new(RwLock::new(name.clone())); } diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index 7885bf6d..36890e87 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -1,5 +1,5 @@ use crate::*; -#[derive(Debug)] +#[derive(Debug, Default)] pub struct TransportTime { /// Current sample sr, tempo, and PPQ. pub timebase: Timebase, @@ -72,7 +72,10 @@ impl LaunchSync for TransportTime { #[inline] fn set_sync (&self, sync: usize) { self.sync.store(sync, Ordering::Relaxed); } } impl TransportToolbar { - pub fn new (transport: Option) -> Self { + pub fn new ( + clock: Option<&Arc>, + transport: Option, + ) -> Self { let timebase = Timebase::default(); Self { _engine: Default::default(), @@ -82,15 +85,19 @@ impl TransportToolbar { started: None, jack: None, transport, - clock: Arc::new(TransportTime { - playing: Some(TransportState::Stopped).into(), - quant: 24.into(), - sync: (timebase.ppq() as usize * 4).into(), - frame: 0.into(), - pulse: 0.into(), - usecs: 0.into(), - timebase, - }) + clock: if let Some(clock) = clock { + clock.clone() + } else { + Arc::new(TransportTime { + playing: Some(TransportState::Stopped).into(), + quant: 24.into(), + sync: (timebase.ppq() as usize * 4).into(), + frame: 0.into(), + pulse: 0.into(), + usecs: 0.into(), + timebase, + }) + } } } pub fn bpm (&self) -> usize { self.clock.bpm() as usize } diff --git a/crates/tek_sequencer/src/transport_cli.rs b/crates/tek_sequencer/src/transport_cli.rs index 699a305f..83d62da7 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<()> { let jack = JackClient::Inactive( Client::new("tek_transport", ClientOptions::NO_START_SERVER)?.0 ); - let mut transport = TransportToolbar::new(Some(jack.transport())); + let mut transport = TransportToolbar::new(None, Some(jack.transport())); transport.focused = true; let transport = Arc::new(RwLock::new(transport)); transport.write().unwrap().jack = Some(