mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
pass around TransportTime
This commit is contained in:
parent
85e243f782
commit
67a5ea3a2b
6 changed files with 41 additions and 25 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue