Fix: lots of various fixes
All checks were successful
Deploy Website / deploy (push) Has been skipped
All checks were successful
Deploy Website / deploy (push) Has been skipped
This commit is contained in:
@@ -443,8 +443,11 @@ pub fn build_stream(
|
||||
&stream_config,
|
||||
move |data: &mut [f32], _| {
|
||||
if !rt_set {
|
||||
super::realtime::set_realtime_priority();
|
||||
let ok = super::realtime::set_realtime_priority();
|
||||
rt_set = true;
|
||||
if !ok {
|
||||
super::realtime::warn_no_rt("audio");
|
||||
}
|
||||
}
|
||||
|
||||
let buffer_samples = data.len() / channels;
|
||||
|
||||
@@ -6,7 +6,7 @@ use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
use super::link::LinkState;
|
||||
use super::realtime::{precise_sleep_us, set_realtime_priority};
|
||||
use super::realtime::{precise_sleep_us, set_realtime_priority, warn_no_rt};
|
||||
use super::sequencer::MidiCommand;
|
||||
use super::timing::SyncTime;
|
||||
|
||||
@@ -55,10 +55,8 @@ pub fn dispatcher_loop(
|
||||
link: Arc<LinkState>,
|
||||
) {
|
||||
let has_rt = set_realtime_priority();
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
if !has_rt {
|
||||
eprintln!("[cagire] Warning: Could not set realtime priority for dispatcher thread.");
|
||||
warn_no_rt("dispatcher");
|
||||
}
|
||||
|
||||
let mut queue: BinaryHeap<TimedMidiCommand> = BinaryHeap::with_capacity(256);
|
||||
|
||||
@@ -148,6 +148,17 @@ pub fn set_realtime_priority() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
pub fn warn_no_rt(thread_name: &str) {
|
||||
eprintln!(
|
||||
"[cagire] Warning: No realtime priority for {thread_name} thread. \
|
||||
Add user to 'audio' group and configure rtprio limits."
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
pub fn warn_no_rt(_thread_name: &str) {}
|
||||
|
||||
/// High-precision sleep using clock_nanosleep on Linux.
|
||||
/// Uses monotonic clock for jitter-free sleeping.
|
||||
#[cfg(target_os = "linux")]
|
||||
|
||||
@@ -1007,6 +1007,7 @@ impl SequencerState {
|
||||
speed: speed_mult,
|
||||
fill,
|
||||
nudge_secs,
|
||||
sr,
|
||||
cc_access: self.cc_access.as_deref(),
|
||||
speed_key,
|
||||
mouse_x,
|
||||
@@ -1128,6 +1129,7 @@ impl SequencerState {
|
||||
speed: speed_mult,
|
||||
fill,
|
||||
nudge_secs,
|
||||
sr,
|
||||
cc_access: self.cc_access.as_deref(),
|
||||
speed_key: "",
|
||||
mouse_x,
|
||||
@@ -1266,13 +1268,16 @@ fn sequencer_loop(
|
||||
) {
|
||||
use std::sync::atomic::Ordering;
|
||||
|
||||
set_realtime_priority();
|
||||
let has_rt = set_realtime_priority();
|
||||
if !has_rt {
|
||||
super::realtime::warn_no_rt("sequencer");
|
||||
}
|
||||
|
||||
let rng: Rng = Arc::new(Mutex::new(StdRng::seed_from_u64(0)));
|
||||
let mut seq_state = SequencerState::new(variables, dict, rng, cc_access);
|
||||
|
||||
// Lookahead window: ~20ms expressed in beats, recomputed each tick
|
||||
const LOOKAHEAD_SECS: f64 = 0.02;
|
||||
// Lookahead window: 20ms normally, 40ms on Linux without RT to compensate for jitter
|
||||
let lookahead_secs: f64 = if cfg!(target_os = "linux") && !has_rt { 0.04 } else { 0.02 };
|
||||
// Wake cadence: how long to sleep between scheduling passes
|
||||
const WAKE_INTERVAL: std::time::Duration = std::time::Duration::from_millis(3);
|
||||
|
||||
@@ -1302,7 +1307,7 @@ fn sequencer_loop(
|
||||
let tempo = state.tempo();
|
||||
|
||||
let lookahead_beats = if tempo > 0.0 {
|
||||
LOOKAHEAD_SECS * tempo / 60.0
|
||||
lookahead_secs * tempo / 60.0
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user