Removing lookahead concept

This commit is contained in:
2026-02-04 20:01:17 +01:00
parent 3bb1fa6e51
commit 467c504071
11 changed files with 5 additions and 76 deletions

View File

@@ -8,6 +8,9 @@ All notable changes to this project will be documented in this file.
- TachyonFX based animations
### Removed
- Removed lookahead from sequencer; event timing now uses `engine_time + time_delta` directly.
### Changed
- Flattened model re-export indirection; `script.rs` now exports only `ScriptEngine`.
- Hue rotation step size increased from 1° to 5° for faster adjustment.

View File

@@ -22,7 +22,6 @@ Navigate with arrow keys, adjust values with left/right:
- **Channels**: number of output channels (2 for stereo).
- **Buffer Size**: audio buffer in samples (64-4096).
- **Max Voices**: polyphony limit (1-128, default 32).
- **Lookahead**: scheduling lookahead in milliseconds (0-50, default 15).
### Buffer Size

View File

@@ -104,7 +104,6 @@ impl App {
channels: self.audio.config.channels,
buffer_size: self.audio.config.buffer_size,
max_voices: self.audio.config.max_voices,
lookahead_ms: self.audio.config.lookahead_ms,
},
display: crate::settings::DisplaySettings {
fps: self.audio.config.refresh_rate.to_fps(),
@@ -1212,7 +1211,6 @@ impl App {
self.metrics.nudge_ms =
(self.metrics.nudge_ms + delta as f64).clamp(-50.0, 50.0);
}
SettingKind::Lookahead => self.audio.adjust_lookahead(delta),
}
}
AppCommand::AudioTriggerRestart => {

View File

@@ -134,7 +134,6 @@ struct CagireDesktop {
sequencer: Option<SequencerHandle>,
playing: Arc<AtomicBool>,
nudge_us: Arc<AtomicI64>,
lookahead_ms: Arc<AtomicU32>,
metrics: Arc<EngineMetrics>,
scope_buffer: Arc<ScopeBuffer>,
spectrum_buffer: Arc<SpectrumBuffer>,
@@ -172,7 +171,6 @@ impl CagireDesktop {
sequencer: Some(b.sequencer),
playing: b.playing,
nudge_us: b.nudge_us,
lookahead_ms: b.lookahead_ms,
metrics: b.metrics,
scope_buffer: b.scope_buffer,
spectrum_buffer: b.spectrum_buffer,
@@ -281,7 +279,6 @@ impl CagireDesktop {
audio_tx: &sequencer.audio_tx,
seq_cmd_tx: &sequencer.cmd_tx,
nudge_us: &self.nudge_us,
lookahead_ms: &self.lookahead_ms,
};
if let InputResult::Quit = handle_key(&mut input_ctx, key) {

View File

@@ -268,7 +268,6 @@ impl AudioState {
pub struct SequencerConfig {
pub audio_sample_pos: Arc<AtomicU64>,
pub sample_rate: Arc<std::sync::atomic::AtomicU32>,
pub lookahead_ms: Arc<std::sync::atomic::AtomicU32>,
pub cc_access: Option<Arc<dyn CcAccess>>,
#[cfg(feature = "desktop")]
pub mouse_x: Arc<AtomicU32>,
@@ -335,7 +334,6 @@ pub fn spawn_sequencer(
nudge_us,
config.audio_sample_pos,
config.sample_rate,
config.lookahead_ms,
config.cc_access,
#[cfg(feature = "desktop")]
mouse_x,
@@ -458,7 +456,6 @@ pub(crate) struct TickInput {
pub nudge_secs: f64,
pub current_time_us: SyncTime,
pub engine_time: f64,
pub lookahead_secs: f64,
#[cfg(feature = "desktop")]
pub mouse_x: f64,
#[cfg(feature = "desktop")]
@@ -700,7 +697,6 @@ impl SequencerState {
input.nudge_secs,
input.current_time_us,
input.engine_time,
input.lookahead_secs,
#[cfg(feature = "desktop")]
input.mouse_x,
#[cfg(feature = "desktop")]
@@ -816,7 +812,6 @@ impl SequencerState {
nudge_secs: f64,
_current_time_us: SyncTime,
engine_time: f64,
lookahead_secs: f64,
#[cfg(feature = "desktop")] mouse_x: f64,
#[cfg(feature = "desktop")] mouse_y: f64,
#[cfg(feature = "desktop")] mouse_down: f64,
@@ -865,7 +860,7 @@ impl SequencerState {
} else {
0.0
};
let event_time = Some(engine_time + lookahead_secs + time_delta);
let event_time = Some(engine_time + time_delta);
if let Some(step) = pattern.steps.get(step_idx) {
let resolved_script = pattern.resolve_script(step_idx);
@@ -1075,7 +1070,6 @@ fn sequencer_loop(
nudge_us: Arc<AtomicI64>,
audio_sample_pos: Arc<AtomicU64>,
sample_rate: Arc<std::sync::atomic::AtomicU32>,
lookahead_ms: Arc<std::sync::atomic::AtomicU32>,
cc_access: Option<Arc<dyn CcAccess>>,
#[cfg(feature = "desktop")] mouse_x: Arc<AtomicU32>,
#[cfg(feature = "desktop")] mouse_y: Arc<AtomicU32>,
@@ -1122,8 +1116,6 @@ fn sequencer_loop(
} else {
0.0
};
let lookahead_secs = lookahead_ms.load(Ordering::Relaxed) as f64 / 1000.0;
let input = TickInput {
commands,
playing: playing.load(Ordering::Relaxed),
@@ -1134,7 +1126,6 @@ fn sequencer_loop(
nudge_secs: nudge_us.load(Ordering::Relaxed) as f64 / 1_000_000.0,
current_time_us,
engine_time,
lookahead_secs,
#[cfg(feature = "desktop")]
mouse_x: f32::from_bits(mouse_x.load(Ordering::Relaxed)) as f64,
#[cfg(feature = "desktop")]
@@ -1405,7 +1396,6 @@ mod tests {
nudge_secs: 0.0,
current_time_us: 0,
engine_time: 0.0,
lookahead_secs: 0.0,
#[cfg(feature = "desktop")]
mouse_x: 0.5,
#[cfg(feature = "desktop")]
@@ -1426,7 +1416,6 @@ mod tests {
nudge_secs: 0.0,
current_time_us: 0,
engine_time: 0.0,
lookahead_secs: 0.0,
#[cfg(feature = "desktop")]
mouse_x: 0.5,
#[cfg(feature = "desktop")]

View File

@@ -31,7 +31,6 @@ pub struct Init {
pub sequencer: SequencerHandle,
pub playing: Arc<AtomicBool>,
pub nudge_us: Arc<AtomicI64>,
pub lookahead_ms: Arc<AtomicU32>,
pub metrics: Arc<EngineMetrics>,
pub scope_buffer: Arc<ScopeBuffer>,
pub spectrum_buffer: Arc<SpectrumBuffer>,
@@ -77,7 +76,6 @@ pub fn init(args: InitArgs) -> Init {
app.audio.config.channels = args.channels.unwrap_or(settings.audio.channels);
app.audio.config.buffer_size = args.buffer.unwrap_or(settings.audio.buffer_size);
app.audio.config.max_voices = settings.audio.max_voices;
app.audio.config.lookahead_ms = settings.audio.lookahead_ms;
app.audio.config.sample_paths = args.samples;
app.audio.config.refresh_rate = RefreshRate::from_fps(settings.display.fps);
app.ui.runtime_highlight = settings.display.runtime_highlight;
@@ -117,8 +115,6 @@ pub fn init(args: InitArgs) -> Init {
let audio_sample_pos = Arc::new(AtomicU64::new(0));
let sample_rate_shared = Arc::new(AtomicU32::new(44100));
let lookahead_ms = Arc::new(AtomicU32::new(settings.audio.lookahead_ms));
let mut initial_samples = Vec::new();
for path in &app.audio.config.sample_paths {
let index = doux::sampling::scan_samples_dir(path);
@@ -136,7 +132,6 @@ pub fn init(args: InitArgs) -> Init {
let seq_config = SequencerConfig {
audio_sample_pos: Arc::clone(&audio_sample_pos),
sample_rate: Arc::clone(&sample_rate_shared),
lookahead_ms: Arc::clone(&lookahead_ms),
cc_access: Some(Arc::new(app.midi.cc_memory.clone()) as Arc<dyn model::CcAccess>),
#[cfg(feature = "desktop")]
mouse_x: Arc::clone(&mouse_x),
@@ -193,7 +188,6 @@ pub fn init(args: InitArgs) -> Init {
sequencer,
playing,
nudge_us,
lookahead_ms,
metrics,
scope_buffer,
spectrum_buffer,

View File

@@ -1,7 +1,7 @@
use arc_swap::ArcSwap;
use crossbeam_channel::Sender;
use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU32, Ordering};
use std::sync::atomic::{AtomicBool, AtomicI64, Ordering};
use std::sync::Arc;
use std::time::{Duration, Instant};
@@ -28,7 +28,6 @@ pub struct InputContext<'a> {
pub audio_tx: &'a ArcSwap<Sender<AudioCommand>>,
pub seq_cmd_tx: &'a Sender<SeqCommand>,
pub nudge_us: &'a Arc<AtomicI64>,
pub lookahead_ms: &'a Arc<AtomicU32>,
}
impl<'a> InputContext<'a> {
@@ -1330,14 +1329,6 @@ fn handle_engine_page(ctx: &mut InputContext, key: KeyEvent) -> InputResult {
ctx.nudge_us
.store((prev - 1000).max(-100_000), Ordering::Relaxed);
}
SettingKind::Lookahead => {
ctx.dispatch(AppCommand::AdjustAudioSetting {
setting: SettingKind::Lookahead,
delta: -1,
});
ctx.lookahead_ms
.store(ctx.app.audio.config.lookahead_ms, Ordering::Relaxed);
}
}
ctx.app.save_settings(ctx.link);
}
@@ -1366,14 +1357,6 @@ fn handle_engine_page(ctx: &mut InputContext, key: KeyEvent) -> InputResult {
ctx.nudge_us
.store((prev + 1000).min(100_000), Ordering::Relaxed);
}
SettingKind::Lookahead => {
ctx.dispatch(AppCommand::AdjustAudioSetting {
setting: SettingKind::Lookahead,
delta: 1,
});
ctx.lookahead_ms
.store(ctx.app.audio.config.lookahead_ms, Ordering::Relaxed);
}
}
ctx.app.save_settings(ctx.link);
}

View File

@@ -75,7 +75,6 @@ fn main() -> io::Result<()> {
let sequencer = b.sequencer;
let playing = b.playing;
let nudge_us = b.nudge_us;
let lookahead_ms = b.lookahead_ms;
let metrics = b.metrics;
let scope_buffer = b.scope_buffer;
let spectrum_buffer = b.spectrum_buffer;
@@ -232,7 +231,6 @@ fn main() -> io::Result<()> {
audio_tx: &sequencer.audio_tx,
seq_cmd_tx: &sequencer.cmd_tx,
nudge_us: &nudge_us,
lookahead_ms: &lookahead_ms,
};
if let InputResult::Quit = handle_key(&mut ctx, key) {

View File

@@ -29,12 +29,9 @@ pub struct AudioSettings {
pub buffer_size: u32,
#[serde(default = "default_max_voices")]
pub max_voices: usize,
#[serde(default = "default_lookahead_ms")]
pub lookahead_ms: u32,
}
fn default_max_voices() -> usize { 32 }
fn default_lookahead_ms() -> u32 { 15 }
#[derive(Debug, Serialize, Deserialize)]
pub struct DisplaySettings {
@@ -73,7 +70,6 @@ impl Default for AudioSettings {
channels: 2,
buffer_size: 512,
max_voices: 32,
lookahead_ms: 15,
}
}
}

View File

@@ -83,7 +83,6 @@ pub struct AudioConfig {
pub refresh_rate: RefreshRate,
pub show_scope: bool,
pub show_spectrum: bool,
pub lookahead_ms: u32,
pub layout: MainLayout,
}
@@ -102,7 +101,6 @@ impl Default for AudioConfig {
refresh_rate: RefreshRate::default(),
show_scope: true,
show_spectrum: true,
lookahead_ms: 15,
layout: MainLayout::default(),
}
}
@@ -173,7 +171,6 @@ pub enum SettingKind {
BufferSize,
Polyphony,
Nudge,
Lookahead,
}
impl CyclicEnum for SettingKind {
@@ -182,7 +179,6 @@ impl CyclicEnum for SettingKind {
Self::BufferSize,
Self::Polyphony,
Self::Nudge,
Self::Lookahead,
];
}
@@ -311,11 +307,6 @@ impl AudioSettings {
self.config.max_voices = new_val;
}
pub fn adjust_lookahead(&mut self, delta: i32) {
let new_val = (self.config.lookahead_ms as i32 + delta).clamp(0, 50) as u32;
self.config.lookahead_ms = new_val;
}
pub fn toggle_refresh_rate(&mut self) {
self.config.refresh_rate = self.config.refresh_rate.toggle();
}

View File

@@ -344,8 +344,6 @@ fn render_settings(frame: &mut Frame, app: &App, area: Rect) {
let buffer_focused = section_focused && app.audio.setting_kind == SettingKind::BufferSize;
let polyphony_focused = section_focused && app.audio.setting_kind == SettingKind::Polyphony;
let nudge_focused = section_focused && app.audio.setting_kind == SettingKind::Nudge;
let lookahead_focused = section_focused && app.audio.setting_kind == SettingKind::Lookahead;
let nudge_ms = app.metrics.nudge_ms;
let nudge_label = if nudge_ms == 0.0 {
"0 ms".to_string()
@@ -353,12 +351,6 @@ fn render_settings(frame: &mut Frame, app: &App, area: Rect) {
format!("{nudge_ms:+.1} ms")
};
let lookahead_label = if app.audio.config.lookahead_ms == 0 {
"off".to_string()
} else {
format!("{} ms", app.audio.config.lookahead_ms)
};
let rows = vec![
Row::new(vec![
Span::styled(
@@ -419,17 +411,6 @@ fn render_settings(frame: &mut Frame, app: &App, area: Rect) {
),
render_selector(&nudge_label, nudge_focused, highlight, normal),
]),
Row::new(vec![
Span::styled(
if lookahead_focused {
"> Lookahead"
} else {
" Lookahead"
},
label_style,
),
render_selector(&lookahead_label, lookahead_focused, highlight, normal),
]),
Row::new(vec![
Span::styled(" Sample rate", label_style),
Span::styled(