From 7ae583895d5bd27a205b90121ba15c19495993bc Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 24 Oct 2026 00:54:00 -0400 Subject: [PATCH] audiosuite: saturating budget product; the budget test expects the total-budget error Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/cmd/audiosuite.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/engine/src/cmd/audiosuite.rs b/crates/engine/src/cmd/audiosuite.rs index 7f942841..ac2bde9f 100644 --- a/crates/engine/src/cmd/audiosuite.rs +++ b/crates/engine/src/cmd/audiosuite.rs @@ -148,7 +148,9 @@ fn generate(e: &mut Engine, p: &Value, name: &str, params: &[(String, f32)], r: // Each track keeps its generated buffer for the life of the command (and undo holds it), so // cap the total samples generated across tracks, not just each one. let frames = usize::try_from(r.len()).unwrap_or(0).min(crate::io::render_limit(channels)); - budget = budget.checked_sub(frames * channels).ok_or_else(|| bad("audiosuite.process", "too much audio to generate in one command"))?; + budget = budget + .checked_sub(frames.saturating_mul(channels)) + .ok_or_else(|| bad("audiosuite.process", "too much audio to generate in one command"))?; } let mut clips = Vec::new(); for track in tracks { @@ -299,7 +301,7 @@ mod tests { "audiosuite.process", &serde_json::json!({"process": "signal_generator", "tracks": [t[0], t[1]], "params": {"freq": 440.0}, "start": 0, "end": len}), ); - let ok = matches!(out, Err(crate::EngineError::BadParams(_, ref m)) if m.contains("too long to generate") || m.contains("too much audio")); + let ok = matches!(out, Err(crate::EngineError::BadParams(_, ref m)) if m.contains("too much audio")); assert!(ok, "two tracks over budget, but got: {out:?}"); } }