wip: refactor pt.24: 45 errors

This commit is contained in:
🪞👃🪞 2024-11-14 15:09:30 +01:00
parent ff4698d046
commit da074eb5fa
5 changed files with 120 additions and 199 deletions

View file

@ -1,30 +1,16 @@
use crate::*;
pub type TransportApp = AppContainer<
Tui,
Transport,
TransportView<Tui>,
TransportViewCommand,
TransportAudio,
TransportStatusBar
>;
pub type TransportApp<E: Engine> = AppView<E, TransportView<E>, TransportViewCommand>;
impl TryFrom<&Arc<RwLock<JackClient>>> for TransportApp {
impl TryFrom<&Arc<RwLock<JackClient>>> for TransportApp<Tui> {
type Error = Box<dyn std::error::Error>;
fn try_from (jack: &Arc<RwLock<JackClient>>) -> Usually<Self> {
let model = Arc::new(RwLock::new(TransportModel {
metronome: false,
transport: jack.read().unwrap().transport(),
jack: jack.clone(),
clock: Arc::new(Clock::from(Instant::default()))
}));
Ok(Self::new(
&model,
TransportView::from(&model),
TransportAudio(model.clone()),
None,
None,
))
Ok(Self::new(TransportModel {
metronome: false,
transport: jack.read().unwrap().transport(),
jack: jack.clone(),
clock: Arc::new(Clock::from(Instant::default()))
}.into(), None, None))
}
}
@ -38,42 +24,14 @@ pub struct TransportView<E: Engine> {
pub size: Measure<E>,
}
impl<E: Engine> From<&Arc<RwLock<Transport>>> for TransportView<E> {
fn from (model: &Arc<RwLock<Transport>>) -> Self {
impl<E: Engine> From<TransportModel> for TransportView<E> {
fn from (model: TransportModel) -> Self {
Self {
_engine: Default::default(),
focused: false,
focus: TransportViewFocus::PlayPause,
size: Measure::new(),
model: model.clone()
}
}
}
impl<E: Engine> TransportView<E> {
pub fn new (jack: &Arc<RwLock<JackClient>>, clock: Option<&Arc<Clock>>) -> Self {
Self {
_engine: Default::default(),
focused: false,
focus: TransportViewFocus::PlayPause,
size: Measure::new(),
model: Transport {
metronome: false,
transport: jack.read().unwrap().transport(),
jack: jack.clone(),
clock: if let Some(clock) = clock {
clock.clone()
} else {
let current = Instant::default();
Arc::new(Clock {
playing: Some(TransportState::Stopped).into(),
started: None.into(),
quant: 24.into(),
sync: (current.timebase.ppq.get() * 4.).into(),
current,
})
}
}
model
}
}
}
@ -84,7 +42,7 @@ impl Content for TransportView<Tui> {
lay!(
self.focus.wrap(self.focused, TransportViewFocus::PlayPause, &Styled(
None,
match *self.model.clock.playing.read().unwrap() {
match *self.model.clock().playing.read().unwrap() {
Some(TransportState::Rolling) => "▶ PLAYING",
Some(TransportState::Starting) => "READY ...",
Some(TransportState::Stopped) => "⏹ STOPPED",
@ -94,23 +52,29 @@ impl Content for TransportView<Tui> {
row!(
self.focus.wrap(self.focused, TransportViewFocus::Bpm, &Outset::X(1u16, {
let bpm = self.model.clock.timebase().bpm.get();
let bpm = self.model.clock().timebase().bpm.get();
row! { "BPM ", format!("{}.{:03}", bpm as usize, (bpm * 1000.0) % 1000.0) }
})),
//let quant = self.focus.wrap(self.focused, TransportViewFocus::Quant, &Outset::X(1u16, row! {
//"QUANT ", ppq_to_name(self.quant as usize)
//})),
self.focus.wrap(self.focused, TransportViewFocus::Sync, &Outset::X(1u16, row! {
"SYNC ", pulses_to_name(self.model.clock.sync.get() as usize)
"SYNC ", pulses_to_name(self.model.clock().sync.get() as usize)
}))
).align_w().fill_x(),
self.focus.wrap(self.focused, TransportViewFocus::Clock, &{
let time1 = self.model.clock.current.format_beat();
let time2 = self.model.clock.current.usec.format_msu();
let time1 = self.model.clock().current.format_beat();
let time2 = self.model.clock().current.usec.format_msu();
row!("B" ,time1.as_str(), " T", time2.as_str()).outset_x(1)
}).align_e().fill_x(),
).fill_x().bg(Color::Rgb(40, 50, 30))
}
}
impl Audio for TransportView<Tui> {
fn process (&mut self, client: &Client, scope: &ProcessScope) -> Control {
self.model.process(client, scope)
}
}