pass around TransportTime

This commit is contained in:
🪞👃🪞 2024-10-26 17:31:44 +03:00
parent 85e243f782
commit 67a5ea3a2b
6 changed files with 41 additions and 25 deletions

View file

@ -6,6 +6,8 @@ pub struct Arranger<E: Engine> {
pub focus_cursor: (usize, usize),
/// Controls the JACK transport.
pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>,
/// Global timebase
pub clock: Arc<TransportTime>,
/// Contains all the sequencers.
pub arrangement: Arrangement<E>,
/// Pool of all phrases in the arrangement
@ -117,14 +119,19 @@ impl<E: Engine> Arranger<E> {
phrases: Arc<RwLock<PhrasePool<E>>>,
) -> 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

View file

@ -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() {

View file

@ -11,6 +11,8 @@ pub struct Sequencer<E: Engine> {
pub focus_cursor: (usize, usize),
/// Controls the JACK transport.
pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>,
/// Global timebase
pub clock: Arc<TransportTime>,
/// Pool of all phrases available to the sequencer
pub phrases: Arc<RwLock<PhrasePool<E>>>,
/// Phrase editor view

View file

@ -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()));
}

View file

@ -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<usize> for TransportTime {
#[inline] fn set_sync (&self, sync: usize) { self.sync.store(sync, Ordering::Relaxed); }
}
impl<E: Engine> TransportToolbar<E> {
pub fn new (transport: Option<Transport>) -> Self {
pub fn new (
clock: Option<&Arc<TransportTime>>,
transport: Option<Transport>,
) -> Self {
let timebase = Timebase::default();
Self {
_engine: Default::default(),
@ -82,15 +85,19 @@ impl<E: Engine> TransportToolbar<E> {
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 }

View file

@ -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(