The exact bit and file-hash pins were taken on one machine and failed
in CI, where the platform maths library rounds differently in the last
bit. Levels are now checked within 1e-3 dB of the pinned values, and
the maximizer and plate reverb tests check that the output does not
depend on the block size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Profiling a demo-session bounce showed the time going to per-sample work that
can be done more cheaply while producing bit-identical results:
- mix: the fader ramp converted dB to gain (two powf) for every sample of every
strip and of the master; GainRamp converts once per block.
- mix: apply_matrix_span has slice fast paths for one and two taps per output,
summing in the same order as the general loop.
- mix/dsp: strip meters and the bounce peak use an 8-lane max (channel_peak);
max is order-independent, so the result is unchanged.
- dsp: LoudnessMeter true peak keeps its history in a doubled ring instead of
shifting it every sample and runs the four phases side by side, each phase
still summing its taps in the original order.
- dsp: Maximizer finds the window minimum with a monotonic queue instead of
scanning the whole lookahead window every sample.
- dsp: flush() tests both bounds without short-circuiting; audio-io quantize
rounds half away from zero without the libm call (exact on its clamped range).
Demo bounce (24-bit dithered WAV, 55.9 s, 3 bounces per run, interleaved,
15 runs each, Ryzen 16 threads, shared machine): median 3.677 s -> 2.955 s
(-19.6 %), min 3.116 s -> 2.394 s (-23.2 %). Output WAV byte-identical, reported
LUFS/true peak/peak identical. New tests pin meter, maximizer, plate reverb and
demo bounce output against values taken from the previous implementation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
examples/bounce_bench drives file.bounce_mix on the built-in demo session (the same path the
Bounce dialog and soundcraft-cli --bounce use) and prints per-run wall time, so export speed can
be measured and compared between builds:
cargo run --release -p soundcraft-engine --example bounce_bench -- OUT.wav [reps] [JSON params]
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ui): use craft-libs' ComboBox so menus grow back, and its menu for the send destination list
Repin craft-libs to 62bb0e1d (includes craft-libs#384 and #387). Every egui::ComboBox
becomes craft_ui::ComboBox, and clippy.toml disallows the egui one. The send destination
menu moves to craft_ui::combo::Menu with the title and search in the header and
"new bus..." / "Remove send" in a footer.
* chore(deps): craft-libs 6af63481 (dropdown fixes)
* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)
* chore(deps): craft-libs 92d392cf (#387 merged)