Init
This commit is contained in:
89
src/engine/link.rs
Normal file
89
src/engine/link.rs
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user