Signal Generator refuses a selection longer than one render

It cut the new clip at MAX_RENDER_SAMPLES / channels without a word, after
allocating up to 2 GiB for it. Refuse such a selection up front, as #326
does for other renders, before anything is generated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Brandon ThomasandClaude Opus 5.5 committed 2026-10-13 04:33:35 -04:00
1 parent f4460e1ec7
commit 41c8561d51
2 files changed
+15 -2

No files matched your search

+7 -2
View File
@@ -136,11 +136,16 @@ fn process(e: &mut Engine, p: &Value) -> Result<Value> {
/// whatever was there, like Pro Tools' Signal Generator.
fn generate(e: &mut Engine, p: &Value, name: &str, params: &[(String, f32)], r: Range) -> Result<Value> {
let sr = e.session().sample_rate;
let tracks = tracks_param(e, "audiosuite.process", p)?;
// Refuse before generating anything, rather than cut the clip short.
for t in tracks.iter().filter_map(|t| e.session().track(*t)).filter(|t| t.kind == TrackKind::Audio) {
crate::io::refuse_longer(e.session(), "audiosuite.process", &t.name, "generate on", r.len(), crate::io::render_limit(t.channels()))?;
}
let mut clips = Vec::new();
for track in tracks_param(e, "audiosuite.process", p)? {
for track in tracks {
let Some(t) = e.session().track(track).filter(|t| t.kind == TrackKind::Audio) else { continue };
let channels = t.channels().max(1);
let frames = usize::try_from(r.len()).unwrap_or(0).min(soundcraft_mix::MAX_RENDER_SAMPLES / channels);
let frames = usize::try_from(r.len()).unwrap_or(0).min(crate::io::render_limit(channels));
let clip_name = format!("{}-{}", t.name, short(name));
let mut audio = vec![vec![0.0; frames]; channels];
apply(name, params, &mut audio, sr.as_f64() as f32)?;
+8
View File
@@ -47,3 +47,11 @@ fn audiosuite_refuses_results_longer_than_one_render() {
refused(&mut e, "audiosuite.process", &json!({"process": process, "params": params, "clips": [id.0]}));
}
}
#[test]
fn signal_generator_refuses_a_selection_longer_than_one_render() {
let (mut e, _) = long_clip(48_000);
let end = (MAX_RENDER_SAMPLES / 2 + 1) as i64;
e.execute("edit.select", &json!({"tracks": ["Talk"], "start": 0, "end": end})).unwrap();
refused(&mut e, "audiosuite.process", &json!({"process": "signal_generator"}));
}