mirror of
https://github.com/storytold/soundcraft.git
synced 2026-10-14 14:26:46 -04:00
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:
1 parent
f4460e1ec7
commit
41c8561d51
2 files changed
+15
-2
No files matched your search
@@ -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)?;
|
||||
|
||||
@@ -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"}));
|
||||
}
|
||||
Reference in new issue
Block a user