Removing lookahead concept
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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,
|
||||
|
||||
19
src/input.rs
19
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<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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user