diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e6c5f..fe56219 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/docs/engine_settings.md b/docs/engine_settings.md index 1b23a2e..df15e22 100644 --- a/docs/engine_settings.md +++ b/docs/engine_settings.md @@ -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 diff --git a/src/app.rs b/src/app.rs index 85c4bb7..c19779a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -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 => { diff --git a/src/bin/desktop.rs b/src/bin/desktop.rs index dd54f75..fddb098 100644 --- a/src/bin/desktop.rs +++ b/src/bin/desktop.rs @@ -134,7 +134,6 @@ struct CagireDesktop { sequencer: Option, playing: Arc, nudge_us: Arc, - lookahead_ms: Arc, metrics: Arc, scope_buffer: Arc, spectrum_buffer: Arc, @@ -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) { diff --git a/src/engine/sequencer.rs b/src/engine/sequencer.rs index 454da5b..f92dfb0 100644 --- a/src/engine/sequencer.rs +++ b/src/engine/sequencer.rs @@ -268,7 +268,6 @@ impl AudioState { pub struct SequencerConfig { pub audio_sample_pos: Arc, pub sample_rate: Arc, - pub lookahead_ms: Arc, pub cc_access: Option>, #[cfg(feature = "desktop")] pub mouse_x: Arc, @@ -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, audio_sample_pos: Arc, sample_rate: Arc, - lookahead_ms: Arc, cc_access: Option>, #[cfg(feature = "desktop")] mouse_x: Arc, #[cfg(feature = "desktop")] mouse_y: Arc, @@ -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")] diff --git a/src/init.rs b/src/init.rs index c815dc8..6618a72 100644 --- a/src/init.rs +++ b/src/init.rs @@ -31,7 +31,6 @@ pub struct Init { pub sequencer: SequencerHandle, pub playing: Arc, pub nudge_us: Arc, - pub lookahead_ms: Arc, pub metrics: Arc, pub scope_buffer: Arc, pub spectrum_buffer: Arc, @@ -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), #[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, diff --git a/src/input.rs b/src/input.rs index 93e3cdd..ac806d6 100644 --- a/src/input.rs +++ b/src/input.rs @@ -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>, pub seq_cmd_tx: &'a Sender, pub nudge_us: &'a Arc, - pub lookahead_ms: &'a Arc, } 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); } diff --git a/src/main.rs b/src/main.rs index 472deea..0611a44 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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) { diff --git a/src/settings.rs b/src/settings.rs index 10d2bd4..39fda44 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -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, } } } diff --git a/src/state/audio.rs b/src/state/audio.rs index 8755db1..877d6f2 100644 --- a/src/state/audio.rs +++ b/src/state/audio.rs @@ -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(); } diff --git a/src/views/engine_view.rs b/src/views/engine_view.rs index bbd793c..163e34e 100644 --- a/src/views/engine_view.rs +++ b/src/views/engine_view.rs @@ -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(