90 lines
2.3 KiB
Rust
90 lines
2.3 KiB
Rust
use std::sync::atomic::{AtomicU64, Ordering};
|
|
|
|
use rusty_link::{AblLink, SessionState};
|
|
|
|
pub struct LinkState {
|
|
link: AblLink,
|
|
quantum: AtomicU64,
|
|
}
|
|
|
|
impl LinkState {
|
|
pub fn new(tempo: f64, quantum: f64) -> Self {
|
|
let link = AblLink::new(tempo);
|
|
Self {
|
|
link,
|
|
quantum: AtomicU64::new(quantum.to_bits()),
|
|
}
|
|
}
|
|
|
|
pub fn is_enabled(&self) -> bool {
|
|
self.link.is_enabled()
|
|
}
|
|
|
|
pub fn set_enabled(&self, enabled: bool) {
|
|
self.link.enable(enabled);
|
|
}
|
|
|
|
pub fn enable(&self) {
|
|
self.link.enable(true);
|
|
}
|
|
|
|
pub fn is_start_stop_sync_enabled(&self) -> bool {
|
|
self.link.is_start_stop_sync_enabled()
|
|
}
|
|
|
|
pub fn set_start_stop_sync_enabled(&self, enabled: bool) {
|
|
self.link.enable_start_stop_sync(enabled);
|
|
}
|
|
|
|
pub fn quantum(&self) -> f64 {
|
|
f64::from_bits(self.quantum.load(Ordering::Relaxed))
|
|
}
|
|
|
|
pub fn set_quantum(&self, quantum: f64) {
|
|
let clamped = quantum.clamp(1.0, 16.0);
|
|
self.quantum.store(clamped.to_bits(), Ordering::Relaxed);
|
|
}
|
|
|
|
pub fn clock_micros(&self) -> i64 {
|
|
self.link.clock_micros()
|
|
}
|
|
|
|
pub fn tempo(&self) -> f64 {
|
|
let mut state = SessionState::new();
|
|
self.link.capture_app_session_state(&mut state);
|
|
state.tempo()
|
|
}
|
|
|
|
pub fn beat(&self) -> f64 {
|
|
let mut state = SessionState::new();
|
|
self.link.capture_app_session_state(&mut state);
|
|
let time = self.link.clock_micros();
|
|
state.beat_at_time(time, self.quantum())
|
|
}
|
|
|
|
pub fn phase(&self) -> f64 {
|
|
let mut state = SessionState::new();
|
|
self.link.capture_app_session_state(&mut state);
|
|
let time = self.link.clock_micros();
|
|
state.phase_at_time(time, self.quantum())
|
|
}
|
|
|
|
pub fn peers(&self) -> u64 {
|
|
self.link.num_peers()
|
|
}
|
|
|
|
pub fn set_tempo(&self, tempo: f64) {
|
|
let mut state = SessionState::new();
|
|
self.link.capture_app_session_state(&mut state);
|
|
let time = self.link.clock_micros();
|
|
state.set_tempo(tempo, time);
|
|
self.link.commit_app_session_state(&state);
|
|
}
|
|
|
|
pub fn capture_app_state(&self) -> SessionState {
|
|
let mut state = SessionState::new();
|
|
self.link.capture_app_session_state(&mut state);
|
|
state
|
|
}
|
|
}
|