From 16d6d764222fc8d3d613071aa01755692cb96d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Forment?= Date: Tue, 3 Mar 2026 13:10:22 +0100 Subject: [PATCH] Feat: crash bugfixes --- crates/forth/src/vm.rs | 4 ++-- crates/forth/src/words/sequencing.rs | 4 ++-- src/bin/desktop/main.rs | 10 +++++++--- src/engine/audio.rs | 2 +- src/init.rs | 11 ++++++++--- src/main.rs | 10 +++++++--- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/crates/forth/src/vm.rs b/crates/forth/src/vm.rs index 2e5a0f1..19a459d 100644 --- a/crates/forth/src/vm.rs +++ b/crates/forth/src/vm.rs @@ -1180,11 +1180,11 @@ impl Forth { } Op::Loop => { - let beats = pop_float(stack)?; + let steps = pop_float(stack)?; if ctx.tempo == 0.0 || ctx.speed == 0.0 { return Err("tempo and speed must be non-zero".into()); } - let dur = beats * 60.0 / ctx.tempo / ctx.speed; + let dur = steps * ctx.step_duration(); cmd.set_param("fit", Value::Float(dur, None)); cmd.set_param("dur", Value::Float(dur, None)); } diff --git a/crates/forth/src/words/sequencing.rs b/crates/forth/src/words/sequencing.rs index ed6003c..7b0fd3d 100644 --- a/crates/forth/src/words/sequencing.rs +++ b/crates/forth/src/words/sequencing.rs @@ -280,8 +280,8 @@ pub(super) const WORDS: &[Word] = &[ aliases: &[], category: "Time", stack: "(n --)", - desc: "Fit sample to n beats", - example: "\"break\" s 4 loop @", + desc: "Fit sample to n steps", + example: "\"break\" s 16 loop @", compile: Simple, varargs: false, }, diff --git a/src/bin/desktop/main.rs b/src/bin/desktop/main.rs index fb88657..d97fd68 100644 --- a/src/bin/desktop/main.rs +++ b/src/bin/desktop/main.rs @@ -251,9 +251,13 @@ impl CagireDesktop { let mut restart_samples = Vec::new(); self.app.audio.config.sample_counts.clear(); for path in &self.app.audio.config.sample_paths { - let index = doux::sampling::scan_samples_dir(path); - self.app.audio.config.sample_counts.push(index.len()); - restart_samples.extend(index); + if path.is_dir() { + let index = doux::sampling::scan_samples_dir(path); + self.app.audio.config.sample_counts.push(index.len()); + restart_samples.extend(index); + } else { + self.app.audio.config.sample_counts.push(0); + } } self.audio_sample_pos.store(0, Ordering::Release); diff --git a/src/engine/audio.rs b/src/engine/audio.rs index cbae77c..957adc4 100644 --- a/src/engine/audio.rs +++ b/src/engine/audio.rs @@ -320,7 +320,7 @@ pub fn build_stream( let sample_rate = default_config.sample_rate() as f32; let max_channels = doux::audio::max_output_channels(&device); - let channels = config.channels.min(max_channels); + let channels = config.channels.min(max_channels).max(2); let host_name = doux::audio::preferred_host().id().name().to_string(); let is_jack = host_name.to_lowercase().contains("jack"); diff --git a/src/init.rs b/src/init.rs index 7feb6a7..3d898e5 100644 --- a/src/init.rs +++ b/src/init.rs @@ -158,9 +158,14 @@ pub fn init(args: InitArgs) -> Init { let sample_rate_shared = Arc::new(AtomicU32::new(44100)); let mut initial_samples = Vec::new(); for path in &app.audio.config.sample_paths { - let index = doux::sampling::scan_samples_dir(path); - app.audio.config.sample_counts.push(index.len()); - initial_samples.extend(index); + if path.is_dir() { + let index = doux::sampling::scan_samples_dir(path); + app.audio.config.sample_counts.push(index.len()); + initial_samples.extend(index); + } else { + eprintln!("Sample path not found: {}", path.display()); + app.audio.config.sample_counts.push(0); + } } let preload_entries: Vec<(String, std::path::PathBuf)> = initial_samples .iter() diff --git a/src/main.rs b/src/main.rs index 3d865f1..37ad667 100644 --- a/src/main.rs +++ b/src/main.rs @@ -141,9 +141,13 @@ fn main() -> io::Result<()> { let mut restart_samples = Vec::new(); app.audio.config.sample_counts.clear(); for path in &app.audio.config.sample_paths { - let index = doux::sampling::scan_samples_dir(path); - app.audio.config.sample_counts.push(index.len()); - restart_samples.extend(index); + if path.is_dir() { + let index = doux::sampling::scan_samples_dir(path); + app.audio.config.sample_counts.push(index.len()); + restart_samples.extend(index); + } else { + app.audio.config.sample_counts.push(0); + } } audio_sample_pos.store(0, Ordering::Relaxed);