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
|
- TachyonFX based animations
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Removed lookahead from sequencer; event timing now uses `engine_time + time_delta` directly.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Flattened model re-export indirection; `script.rs` now exports only `ScriptEngine`.
|
- Flattened model re-export indirection; `script.rs` now exports only `ScriptEngine`.
|
||||||
- Hue rotation step size increased from 1° to 5° for faster adjustment.
|
- 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).
|
- **Channels**: number of output channels (2 for stereo).
|
||||||
- **Buffer Size**: audio buffer in samples (64-4096).
|
- **Buffer Size**: audio buffer in samples (64-4096).
|
||||||
- **Max Voices**: polyphony limit (1-128, default 32).
|
- **Max Voices**: polyphony limit (1-128, default 32).
|
||||||
- **Lookahead**: scheduling lookahead in milliseconds (0-50, default 15).
|
|
||||||
|
|
||||||
### Buffer Size
|
### Buffer Size
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ impl App {
|
|||||||
channels: self.audio.config.channels,
|
channels: self.audio.config.channels,
|
||||||
buffer_size: self.audio.config.buffer_size,
|
buffer_size: self.audio.config.buffer_size,
|
||||||
max_voices: self.audio.config.max_voices,
|
max_voices: self.audio.config.max_voices,
|
||||||
lookahead_ms: self.audio.config.lookahead_ms,
|
|
||||||
},
|
},
|
||||||
display: crate::settings::DisplaySettings {
|
display: crate::settings::DisplaySettings {
|
||||||
fps: self.audio.config.refresh_rate.to_fps(),
|
fps: self.audio.config.refresh_rate.to_fps(),
|
||||||
@@ -1212,7 +1211,6 @@ impl App {
|
|||||||
self.metrics.nudge_ms =
|
self.metrics.nudge_ms =
|
||||||
(self.metrics.nudge_ms + delta as f64).clamp(-50.0, 50.0);
|
(self.metrics.nudge_ms + delta as f64).clamp(-50.0, 50.0);
|
||||||
}
|
}
|
||||||
SettingKind::Lookahead => self.audio.adjust_lookahead(delta),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AppCommand::AudioTriggerRestart => {
|
AppCommand::AudioTriggerRestart => {
|
||||||
|
|||||||
@@ -134,7 +134,6 @@ struct CagireDesktop {
|
|||||||
sequencer: Option<SequencerHandle>,
|
sequencer: Option<SequencerHandle>,
|
||||||
playing: Arc<AtomicBool>,
|
playing: Arc<AtomicBool>,
|
||||||
nudge_us: Arc<AtomicI64>,
|
nudge_us: Arc<AtomicI64>,
|
||||||
lookahead_ms: Arc<AtomicU32>,
|
|
||||||
metrics: Arc<EngineMetrics>,
|
metrics: Arc<EngineMetrics>,
|
||||||
scope_buffer: Arc<ScopeBuffer>,
|
scope_buffer: Arc<ScopeBuffer>,
|
||||||
spectrum_buffer: Arc<SpectrumBuffer>,
|
spectrum_buffer: Arc<SpectrumBuffer>,
|
||||||
@@ -172,7 +171,6 @@ impl CagireDesktop {
|
|||||||
sequencer: Some(b.sequencer),
|
sequencer: Some(b.sequencer),
|
||||||
playing: b.playing,
|
playing: b.playing,
|
||||||
nudge_us: b.nudge_us,
|
nudge_us: b.nudge_us,
|
||||||
lookahead_ms: b.lookahead_ms,
|
|
||||||
metrics: b.metrics,
|
metrics: b.metrics,
|
||||||
scope_buffer: b.scope_buffer,
|
scope_buffer: b.scope_buffer,
|
||||||
spectrum_buffer: b.spectrum_buffer,
|
spectrum_buffer: b.spectrum_buffer,
|
||||||
@@ -281,7 +279,6 @@ impl CagireDesktop {
|
|||||||
audio_tx: &sequencer.audio_tx,
|
audio_tx: &sequencer.audio_tx,
|
||||||
seq_cmd_tx: &sequencer.cmd_tx,
|
seq_cmd_tx: &sequencer.cmd_tx,
|
||||||
nudge_us: &self.nudge_us,
|
nudge_us: &self.nudge_us,
|
||||||
lookahead_ms: &self.lookahead_ms,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let InputResult::Quit = handle_key(&mut input_ctx, key) {
|
if let InputResult::Quit = handle_key(&mut input_ctx, key) {
|
||||||
|
|||||||
@@ -268,7 +268,6 @@ impl AudioState {
|
|||||||
pub struct SequencerConfig {
|
pub struct SequencerConfig {
|
||||||
pub audio_sample_pos: Arc<AtomicU64>,
|
pub audio_sample_pos: Arc<AtomicU64>,
|
||||||
pub sample_rate: Arc<std::sync::atomic::AtomicU32>,
|
pub sample_rate: Arc<std::sync::atomic::AtomicU32>,
|
||||||
pub lookahead_ms: Arc<std::sync::atomic::AtomicU32>,
|
|
||||||
pub cc_access: Option<Arc<dyn CcAccess>>,
|
pub cc_access: Option<Arc<dyn CcAccess>>,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
pub mouse_x: Arc<AtomicU32>,
|
pub mouse_x: Arc<AtomicU32>,
|
||||||
@@ -335,7 +334,6 @@ pub fn spawn_sequencer(
|
|||||||
nudge_us,
|
nudge_us,
|
||||||
config.audio_sample_pos,
|
config.audio_sample_pos,
|
||||||
config.sample_rate,
|
config.sample_rate,
|
||||||
config.lookahead_ms,
|
|
||||||
config.cc_access,
|
config.cc_access,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
mouse_x,
|
mouse_x,
|
||||||
@@ -458,7 +456,6 @@ pub(crate) struct TickInput {
|
|||||||
pub nudge_secs: f64,
|
pub nudge_secs: f64,
|
||||||
pub current_time_us: SyncTime,
|
pub current_time_us: SyncTime,
|
||||||
pub engine_time: f64,
|
pub engine_time: f64,
|
||||||
pub lookahead_secs: f64,
|
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
pub mouse_x: f64,
|
pub mouse_x: f64,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
@@ -700,7 +697,6 @@ impl SequencerState {
|
|||||||
input.nudge_secs,
|
input.nudge_secs,
|
||||||
input.current_time_us,
|
input.current_time_us,
|
||||||
input.engine_time,
|
input.engine_time,
|
||||||
input.lookahead_secs,
|
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
input.mouse_x,
|
input.mouse_x,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
@@ -816,7 +812,6 @@ impl SequencerState {
|
|||||||
nudge_secs: f64,
|
nudge_secs: f64,
|
||||||
_current_time_us: SyncTime,
|
_current_time_us: SyncTime,
|
||||||
engine_time: f64,
|
engine_time: f64,
|
||||||
lookahead_secs: f64,
|
|
||||||
#[cfg(feature = "desktop")] mouse_x: f64,
|
#[cfg(feature = "desktop")] mouse_x: f64,
|
||||||
#[cfg(feature = "desktop")] mouse_y: f64,
|
#[cfg(feature = "desktop")] mouse_y: f64,
|
||||||
#[cfg(feature = "desktop")] mouse_down: f64,
|
#[cfg(feature = "desktop")] mouse_down: f64,
|
||||||
@@ -865,7 +860,7 @@ impl SequencerState {
|
|||||||
} else {
|
} else {
|
||||||
0.0
|
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) {
|
if let Some(step) = pattern.steps.get(step_idx) {
|
||||||
let resolved_script = pattern.resolve_script(step_idx);
|
let resolved_script = pattern.resolve_script(step_idx);
|
||||||
@@ -1075,7 +1070,6 @@ fn sequencer_loop(
|
|||||||
nudge_us: Arc<AtomicI64>,
|
nudge_us: Arc<AtomicI64>,
|
||||||
audio_sample_pos: Arc<AtomicU64>,
|
audio_sample_pos: Arc<AtomicU64>,
|
||||||
sample_rate: Arc<std::sync::atomic::AtomicU32>,
|
sample_rate: Arc<std::sync::atomic::AtomicU32>,
|
||||||
lookahead_ms: Arc<std::sync::atomic::AtomicU32>,
|
|
||||||
cc_access: Option<Arc<dyn CcAccess>>,
|
cc_access: Option<Arc<dyn CcAccess>>,
|
||||||
#[cfg(feature = "desktop")] mouse_x: Arc<AtomicU32>,
|
#[cfg(feature = "desktop")] mouse_x: Arc<AtomicU32>,
|
||||||
#[cfg(feature = "desktop")] mouse_y: Arc<AtomicU32>,
|
#[cfg(feature = "desktop")] mouse_y: Arc<AtomicU32>,
|
||||||
@@ -1122,8 +1116,6 @@ fn sequencer_loop(
|
|||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
};
|
};
|
||||||
let lookahead_secs = lookahead_ms.load(Ordering::Relaxed) as f64 / 1000.0;
|
|
||||||
|
|
||||||
let input = TickInput {
|
let input = TickInput {
|
||||||
commands,
|
commands,
|
||||||
playing: playing.load(Ordering::Relaxed),
|
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,
|
nudge_secs: nudge_us.load(Ordering::Relaxed) as f64 / 1_000_000.0,
|
||||||
current_time_us,
|
current_time_us,
|
||||||
engine_time,
|
engine_time,
|
||||||
lookahead_secs,
|
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
mouse_x: f32::from_bits(mouse_x.load(Ordering::Relaxed)) as f64,
|
mouse_x: f32::from_bits(mouse_x.load(Ordering::Relaxed)) as f64,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
@@ -1405,7 +1396,6 @@ mod tests {
|
|||||||
nudge_secs: 0.0,
|
nudge_secs: 0.0,
|
||||||
current_time_us: 0,
|
current_time_us: 0,
|
||||||
engine_time: 0.0,
|
engine_time: 0.0,
|
||||||
lookahead_secs: 0.0,
|
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
mouse_x: 0.5,
|
mouse_x: 0.5,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
@@ -1426,7 +1416,6 @@ mod tests {
|
|||||||
nudge_secs: 0.0,
|
nudge_secs: 0.0,
|
||||||
current_time_us: 0,
|
current_time_us: 0,
|
||||||
engine_time: 0.0,
|
engine_time: 0.0,
|
||||||
lookahead_secs: 0.0,
|
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
mouse_x: 0.5,
|
mouse_x: 0.5,
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ pub struct Init {
|
|||||||
pub sequencer: SequencerHandle,
|
pub sequencer: SequencerHandle,
|
||||||
pub playing: Arc<AtomicBool>,
|
pub playing: Arc<AtomicBool>,
|
||||||
pub nudge_us: Arc<AtomicI64>,
|
pub nudge_us: Arc<AtomicI64>,
|
||||||
pub lookahead_ms: Arc<AtomicU32>,
|
|
||||||
pub metrics: Arc<EngineMetrics>,
|
pub metrics: Arc<EngineMetrics>,
|
||||||
pub scope_buffer: Arc<ScopeBuffer>,
|
pub scope_buffer: Arc<ScopeBuffer>,
|
||||||
pub spectrum_buffer: Arc<SpectrumBuffer>,
|
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.channels = args.channels.unwrap_or(settings.audio.channels);
|
||||||
app.audio.config.buffer_size = args.buffer.unwrap_or(settings.audio.buffer_size);
|
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.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.sample_paths = args.samples;
|
||||||
app.audio.config.refresh_rate = RefreshRate::from_fps(settings.display.fps);
|
app.audio.config.refresh_rate = RefreshRate::from_fps(settings.display.fps);
|
||||||
app.ui.runtime_highlight = settings.display.runtime_highlight;
|
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 audio_sample_pos = Arc::new(AtomicU64::new(0));
|
||||||
let sample_rate_shared = Arc::new(AtomicU32::new(44100));
|
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();
|
let mut initial_samples = Vec::new();
|
||||||
for path in &app.audio.config.sample_paths {
|
for path in &app.audio.config.sample_paths {
|
||||||
let index = doux::sampling::scan_samples_dir(path);
|
let index = doux::sampling::scan_samples_dir(path);
|
||||||
@@ -136,7 +132,6 @@ pub fn init(args: InitArgs) -> Init {
|
|||||||
let seq_config = SequencerConfig {
|
let seq_config = SequencerConfig {
|
||||||
audio_sample_pos: Arc::clone(&audio_sample_pos),
|
audio_sample_pos: Arc::clone(&audio_sample_pos),
|
||||||
sample_rate: Arc::clone(&sample_rate_shared),
|
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>),
|
cc_access: Some(Arc::new(app.midi.cc_memory.clone()) as Arc<dyn model::CcAccess>),
|
||||||
#[cfg(feature = "desktop")]
|
#[cfg(feature = "desktop")]
|
||||||
mouse_x: Arc::clone(&mouse_x),
|
mouse_x: Arc::clone(&mouse_x),
|
||||||
@@ -193,7 +188,6 @@ pub fn init(args: InitArgs) -> Init {
|
|||||||
sequencer,
|
sequencer,
|
||||||
playing,
|
playing,
|
||||||
nudge_us,
|
nudge_us,
|
||||||
lookahead_ms,
|
|
||||||
metrics,
|
metrics,
|
||||||
scope_buffer,
|
scope_buffer,
|
||||||
spectrum_buffer,
|
spectrum_buffer,
|
||||||
|
|||||||
19
src/input.rs
19
src/input.rs
@@ -1,7 +1,7 @@
|
|||||||
use arc_swap::ArcSwap;
|
use arc_swap::ArcSwap;
|
||||||
use crossbeam_channel::Sender;
|
use crossbeam_channel::Sender;
|
||||||
use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
|
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::sync::Arc;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
@@ -28,7 +28,6 @@ pub struct InputContext<'a> {
|
|||||||
pub audio_tx: &'a ArcSwap<Sender<AudioCommand>>,
|
pub audio_tx: &'a ArcSwap<Sender<AudioCommand>>,
|
||||||
pub seq_cmd_tx: &'a Sender<SeqCommand>,
|
pub seq_cmd_tx: &'a Sender<SeqCommand>,
|
||||||
pub nudge_us: &'a Arc<AtomicI64>,
|
pub nudge_us: &'a Arc<AtomicI64>,
|
||||||
pub lookahead_ms: &'a Arc<AtomicU32>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> InputContext<'a> {
|
impl<'a> InputContext<'a> {
|
||||||
@@ -1330,14 +1329,6 @@ fn handle_engine_page(ctx: &mut InputContext, key: KeyEvent) -> InputResult {
|
|||||||
ctx.nudge_us
|
ctx.nudge_us
|
||||||
.store((prev - 1000).max(-100_000), Ordering::Relaxed);
|
.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);
|
ctx.app.save_settings(ctx.link);
|
||||||
}
|
}
|
||||||
@@ -1366,14 +1357,6 @@ fn handle_engine_page(ctx: &mut InputContext, key: KeyEvent) -> InputResult {
|
|||||||
ctx.nudge_us
|
ctx.nudge_us
|
||||||
.store((prev + 1000).min(100_000), Ordering::Relaxed);
|
.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);
|
ctx.app.save_settings(ctx.link);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ fn main() -> io::Result<()> {
|
|||||||
let sequencer = b.sequencer;
|
let sequencer = b.sequencer;
|
||||||
let playing = b.playing;
|
let playing = b.playing;
|
||||||
let nudge_us = b.nudge_us;
|
let nudge_us = b.nudge_us;
|
||||||
let lookahead_ms = b.lookahead_ms;
|
|
||||||
let metrics = b.metrics;
|
let metrics = b.metrics;
|
||||||
let scope_buffer = b.scope_buffer;
|
let scope_buffer = b.scope_buffer;
|
||||||
let spectrum_buffer = b.spectrum_buffer;
|
let spectrum_buffer = b.spectrum_buffer;
|
||||||
@@ -232,7 +231,6 @@ fn main() -> io::Result<()> {
|
|||||||
audio_tx: &sequencer.audio_tx,
|
audio_tx: &sequencer.audio_tx,
|
||||||
seq_cmd_tx: &sequencer.cmd_tx,
|
seq_cmd_tx: &sequencer.cmd_tx,
|
||||||
nudge_us: &nudge_us,
|
nudge_us: &nudge_us,
|
||||||
lookahead_ms: &lookahead_ms,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let InputResult::Quit = handle_key(&mut ctx, key) {
|
if let InputResult::Quit = handle_key(&mut ctx, key) {
|
||||||
|
|||||||
@@ -29,12 +29,9 @@ pub struct AudioSettings {
|
|||||||
pub buffer_size: u32,
|
pub buffer_size: u32,
|
||||||
#[serde(default = "default_max_voices")]
|
#[serde(default = "default_max_voices")]
|
||||||
pub max_voices: usize,
|
pub max_voices: usize,
|
||||||
#[serde(default = "default_lookahead_ms")]
|
|
||||||
pub lookahead_ms: u32,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_max_voices() -> usize { 32 }
|
fn default_max_voices() -> usize { 32 }
|
||||||
fn default_lookahead_ms() -> u32 { 15 }
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct DisplaySettings {
|
pub struct DisplaySettings {
|
||||||
@@ -73,7 +70,6 @@ impl Default for AudioSettings {
|
|||||||
channels: 2,
|
channels: 2,
|
||||||
buffer_size: 512,
|
buffer_size: 512,
|
||||||
max_voices: 32,
|
max_voices: 32,
|
||||||
lookahead_ms: 15,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ pub struct AudioConfig {
|
|||||||
pub refresh_rate: RefreshRate,
|
pub refresh_rate: RefreshRate,
|
||||||
pub show_scope: bool,
|
pub show_scope: bool,
|
||||||
pub show_spectrum: bool,
|
pub show_spectrum: bool,
|
||||||
pub lookahead_ms: u32,
|
|
||||||
pub layout: MainLayout,
|
pub layout: MainLayout,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +101,6 @@ impl Default for AudioConfig {
|
|||||||
refresh_rate: RefreshRate::default(),
|
refresh_rate: RefreshRate::default(),
|
||||||
show_scope: true,
|
show_scope: true,
|
||||||
show_spectrum: true,
|
show_spectrum: true,
|
||||||
lookahead_ms: 15,
|
|
||||||
layout: MainLayout::default(),
|
layout: MainLayout::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -173,7 +171,6 @@ pub enum SettingKind {
|
|||||||
BufferSize,
|
BufferSize,
|
||||||
Polyphony,
|
Polyphony,
|
||||||
Nudge,
|
Nudge,
|
||||||
Lookahead,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CyclicEnum for SettingKind {
|
impl CyclicEnum for SettingKind {
|
||||||
@@ -182,7 +179,6 @@ impl CyclicEnum for SettingKind {
|
|||||||
Self::BufferSize,
|
Self::BufferSize,
|
||||||
Self::Polyphony,
|
Self::Polyphony,
|
||||||
Self::Nudge,
|
Self::Nudge,
|
||||||
Self::Lookahead,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,11 +307,6 @@ impl AudioSettings {
|
|||||||
self.config.max_voices = new_val;
|
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) {
|
pub fn toggle_refresh_rate(&mut self) {
|
||||||
self.config.refresh_rate = self.config.refresh_rate.toggle();
|
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 buffer_focused = section_focused && app.audio.setting_kind == SettingKind::BufferSize;
|
||||||
let polyphony_focused = section_focused && app.audio.setting_kind == SettingKind::Polyphony;
|
let polyphony_focused = section_focused && app.audio.setting_kind == SettingKind::Polyphony;
|
||||||
let nudge_focused = section_focused && app.audio.setting_kind == SettingKind::Nudge;
|
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_ms = app.metrics.nudge_ms;
|
||||||
let nudge_label = if nudge_ms == 0.0 {
|
let nudge_label = if nudge_ms == 0.0 {
|
||||||
"0 ms".to_string()
|
"0 ms".to_string()
|
||||||
@@ -353,12 +351,6 @@ fn render_settings(frame: &mut Frame, app: &App, area: Rect) {
|
|||||||
format!("{nudge_ms:+.1} ms")
|
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![
|
let rows = vec![
|
||||||
Row::new(vec![
|
Row::new(vec![
|
||||||
Span::styled(
|
Span::styled(
|
||||||
@@ -419,17 +411,6 @@ fn render_settings(frame: &mut Frame, app: &App, area: Rect) {
|
|||||||
),
|
),
|
||||||
render_selector(&nudge_label, nudge_focused, highlight, normal),
|
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![
|
Row::new(vec![
|
||||||
Span::styled(" Sample rate", label_style),
|
Span::styled(" Sample rate", label_style),
|
||||||
Span::styled(
|
Span::styled(
|
||||||
|
|||||||
Reference in New Issue
Block a user