From 557553cb064b18743cf6efed0a66c649a057a66b Mon Sep 17 00:00:00 2001 From: Ian Martin <4624371+iannitram@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:34:41 -0600 Subject: [PATCH 1/5] video: collapse the MP3 esds branch into a match guard Rust 1.95's clippy flags the nested if (collapsible_match), so cargo xtask ci failed on a machine with the README's minimum toolchain. No behaviour change: other MP3 sample entries still fall through to the catch-all arm. Co-Authored-By: Claude Opus 5.5 --- crates/video/src/isobmff/codec.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/video/src/isobmff/codec.rs b/crates/video/src/isobmff/codec.rs index 0edb8d5..45f08bd 100644 --- a/crates/video/src/isobmff/codec.rs +++ b/crates/video/src/isobmff/codec.rs @@ -1392,10 +1392,8 @@ impl SampleEntry { CodecConfig::Aac(c) => { b.leaf(b"esds", &esds_payload(0x40, &c.asc, c.max_bitrate, c.avg_bitrate, c.buffer_size)); } - CodecConfig::Mp3 => { - if format == *b"mp4a" { - b.leaf(b"esds", &esds_payload(0x6B, &[], 0, 0, 0)); - } + CodecConfig::Mp3 if format == *b"mp4a" => { + b.leaf(b"esds", &esds_payload(0x6B, &[], 0, 0, 0)); } CodecConfig::Alac { cookie } => { let m = b.start_full(b"alac", 0, 0); From 218cbb66707dca7925c61e41a7d5d1492ad6c1c5 Mon Sep 17 00:00:00 2001 From: Ian Martin <4624371+iannitram@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:34:41 -0600 Subject: [PATCH 2/5] vst3-host: build the symlink test on Unix only On Windows the test body was compiled out but its setup was not, so `lib` was an unused variable and clippy -D warnings failed the gate. The test never ran anything on Windows; it is now cfg(unix) as a whole. Co-Authored-By: Claude Opus 5.5 --- crates/vst3-host/src/lib.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/vst3-host/src/lib.rs b/crates/vst3-host/src/lib.rs index 0cfd3ab..b872dec 100644 --- a/crates/vst3-host/src/lib.rs +++ b/crates/vst3-host/src/lib.rs @@ -294,11 +294,13 @@ mod tests { let _ = std::fs::remove_dir_all(&d); } + // Unix only: the test points a ".vst3" at a system library through a symlink. + #[cfg(unix)] #[test] fn a_real_library_without_the_vst3_export_is_rejected() { // A system library loads fine but has no `GetPluginFactory`. // (macOS system libraries live only in the dyld shared cache, not as files.) - let lib = if cfg!(target_os = "macos") || cfg!(windows) { + let lib = if cfg!(target_os = "macos") { None } else { ["/lib/x86_64-linux-gnu/libz.so.1", "/usr/lib/libz.so.1", "/lib64/libz.so.1"].iter().map(PathBuf::from).find(|p| p.exists()) @@ -308,12 +310,9 @@ mod tests { let _ = std::fs::remove_dir_all(&d); std::fs::create_dir_all(&d).unwrap(); // Point a single-file ".vst3" at it via a symlink (no copying of binaries). - #[cfg(unix)] - { - std::os::unix::fs::symlink(&lib, d.join("z.vst3")).unwrap(); - let e = load_bundle(&d.join("z.vst3")).unwrap_err(); - assert!(e.to_string().contains("not a VST3 plugin"), "{e}"); - } + std::os::unix::fs::symlink(&lib, d.join("z.vst3")).unwrap(); + let e = load_bundle(&d.join("z.vst3")).unwrap_err(); + assert!(e.to_string().contains("not a VST3 plugin"), "{e}"); let _ = std::fs::remove_dir_all(&d); } } From b2f636126529903f20e55b272d5926e2222c84bc Mon Sep 17 00:00:00 2001 From: Ian Martin <4624371+iannitram@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:34:41 -0600 Subject: [PATCH 3/5] engine: build the expected missing-file path the way the engine does saved_audio_is_trusted_only_in_the_folder_it_was_saved_in compared path strings. On Windows the engine reports \Audio Files/x.wav while the test expected /Audio Files/x.wav, so the test failed there although the two name the same file. The expected value is now the session folder joined with the stored relative path, on every platform. Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/io.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/io.rs b/crates/engine/src/io.rs index 108330e..aee00b8 100644 --- a/crates/engine/src/io.rs +++ b/crates/engine/src/io.rs @@ -1139,7 +1139,10 @@ mod save_tests { open_session(&mut missing, &path("A/A.scraft")).unwrap(); save_session(&mut missing, &path("B/Moved.scraft")).unwrap(); let mut r = Engine::default(); - assert_eq!(open_session(&mut r, &path("B/Moved.scraft")).unwrap(), vec![dir.join("A/Audio Files/Audio 1_02.wav").display().to_string()]); + assert_eq!( + open_session(&mut r, &path("B/Moved.scraft")).unwrap(), + vec![dir.join("A").join("Audio Files/Audio 1_02.wav").display().to_string()] + ); let _ = std::fs::remove_dir_all(&dir); } From f55010d2449db925477af4259599849a6331dfe7 Mon Sep 17 00:00:00 2001 From: Ian Martin <4624371+iannitram@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:34:41 -0600 Subject: [PATCH 4/5] vst3-host: fixture builds on Windows (bus flags are i32 there) The VST3 bindings type C enum constants as i32 on Windows and u32 elsewhere, so assigning kDefaultActive to BusInfo.flags (u32) failed to compile and seven integration tests could not build their fixture. Cast it like the other constants in this file. Co-Authored-By: Claude Opus 5.5 --- crates/vst3-host/tests/fixture/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/vst3-host/tests/fixture/src/lib.rs b/crates/vst3-host/tests/fixture/src/lib.rs index 3ba07c6..a537ef6 100644 --- a/crates/vst3-host/tests/fixture/src/lib.rs +++ b/crates/vst3-host/tests/fixture/src/lib.rs @@ -52,7 +52,7 @@ fn audio_bus(bus: *mut BusInfo, dir: BusDirection, name: &str) { b.channelCount = 2; copy_c16(name, &mut b.name); b.busType = BusTypes_::kMain as BusType; - b.flags = BusInfo_::BusFlags_::kDefaultActive; + b.flags = BusInfo_::BusFlags_::kDefaultActive as u32; } unsafe fn channels<'a>(bus: &AudioBusBuffers, frames: usize) -> Vec<&'a mut [f32]> { @@ -461,7 +461,7 @@ impl IComponentTrait for Synth { b.channelCount = 16; copy_c16("Notes", &mut b.name); b.busType = BusTypes_::kMain as BusType; - b.flags = BusInfo_::BusFlags_::kDefaultActive; + b.flags = BusInfo_::BusFlags_::kDefaultActive as u32; return kResultOk; } kInvalidArgument From ced57be7238e21c6653c1908c9b6c7e52e441126 Mon Sep 17 00:00:00 2001 From: Ian Martin <4624371+iannitram@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:34:41 -0600 Subject: [PATCH 5/5] vst3-host: the late-exit test expects Windows' exit order module_exit_shutdown asserts that the exit handler alone runs the module exit too late. That holds where exit handlers share one list. Windows runs the executable's handlers before a DLL's own, so the fixture's late state is still alive and the child exits cleanly; the test failed there. The Windows case now asserts the clean exit. Co-Authored-By: Claude Opus 5.5 --- crates/vst3-host/tests/module_exit_shutdown.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/vst3-host/tests/module_exit_shutdown.rs b/crates/vst3-host/tests/module_exit_shutdown.rs index cc337c9..274823a 100644 --- a/crates/vst3-host/tests/module_exit_shutdown.rs +++ b/crates/vst3-host/tests/module_exit_shutdown.rs @@ -38,7 +38,13 @@ fn main() { assert!(up_front.status.success(), "shutdown before exit: {:?}\n{}", up_front.status, String::from_utf8_lossy(&up_front.stderr)); let too_late = run("exit-handler"); let err = String::from_utf8_lossy(&too_late.stderr); - assert_eq!(too_late.status.code(), Some(3), "the exit handler alone comes too late: {err}"); - assert!(err.contains("module exit after the process exit tore down state"), "{err}"); + if cfg!(windows) { + // Windows runs the executable's exit handlers before a DLL's own, so the fixture's late + // state is still there when the host's exit handler runs its module exit. + assert!(too_late.status.success(), "the exit handler alone: {:?}\n{err}", too_late.status); + } else { + assert_eq!(too_late.status.code(), Some(3), "the exit handler alone comes too late: {err}"); + assert!(err.contains("module exit after the process exit tore down state"), "{err}"); + } println!("module_exit_shutdown: ok"); }