Video track, Audio Unit hosting, plugin state and editors, Renderer and UI Customization

Video (new standalone crate soundcraft-video):
- Pure-Rust H.264 (Baseline/Main/High), ProRes (all flavours) and Motion JPEG decoding with
  ISO-BMFF demux, adapted from FilmCraft's crates; fuzzed with mutated/truncated movies
- TrackKind::Video with ClipContent::Video referencing Session.videos; file.import_video adds
  the picture track and the movie's audio; relinking on open; video.offset/online/list
- Video and Video Universe windows, thumbnails on the timeline, background decoding

Third-party plugins:
- Plugin state (CLAP state ext, VST3 component + controller state) saved in sessions
- Hosted instances created, state-loaded and dropped on the UI thread, never the audio thread
- Plugin editors: floating CLAP GUIs and VST3 views on macOS (verified with Melodyne)
- New isolated FFI crate soundcraft-au-host: Audio Units on macOS (effects and instruments,
  parameters, latency, MIDI, ClassInfo state), wired into the mixer and plugin browser

UI: Window > Renderer (speaker layout with live levels and object positions), Window > UI
Customization (interface scale, reduce motion), Window > Configurations > Auto-Update.

Fix: saturating sample-index math in clip rendering (hostile stretch values overflowed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Thomas
2026-10-06 01:41:05 -04:00
co-authored by Claude Opus 5.5
parent c125a79a47
commit cdefc57c91
100 changed files with 22380 additions and 190 deletions
+4 -1
View File
@@ -21,9 +21,11 @@ const LAYERS: &[(&str, u8)] = &[
("time", 0),
("audio-io", 0),
("midi", 0),
("video", 0),
("dsp", 1),
("clap-host", 1),
("vst3-host", 1),
("au-host", 1),
("model", 2),
("mix", 3),
("engine", 4),
@@ -32,7 +34,7 @@ const LAYERS: &[(&str, u8)] = &[
("ui-egui", 6),
];
/// Standalone format crates: no workspace dependencies at all (publishable on their own).
const STANDALONE: &[&str] = &["time", "audio-io", "midi", "dsp"];
const STANDALONE: &[&str] = &["time", "audio-io", "midi", "video", "dsp"];
const UI_CRATES: &[&str] = &["egui", "eframe", "winit", "egui_kittest", "rfd", "egui-wgpu", "egui_glow"];
const EXEMPT: &[&str] = &["soundcraft", "soundcraft-cli", "soundcraft-web", "xtask"];
@@ -119,6 +121,7 @@ const WASM: &[&str] = &[
"soundcraft-time",
"soundcraft-audio-io",
"soundcraft-midi",
"soundcraft-video",
"soundcraft-dsp",
"soundcraft-model",
"soundcraft-mix",