mirror of
https://github.com/storytold/soundcraft.git
synced 2026-11-01 22:46:49 -06:00
The input callback appended every block to one growing Vec: it reallocated on the audio thread as the take grew, kept every input channel in RAM, and the take existed only in memory until Stop, so a crash during a take lost it. - The input callback copies each block into a preallocated lock-free ring (atomic slots, no unsafe) and never locks or allocates. Samples that don't fit are paid back as silence before the next block, so the take keeps its timing; the loss is reported in the status line. - A writer thread drains the ring every 10 ms into one 32-bit float WAV per armed track, holding only that track's input channels. Files go to the session's Audio Files folder, or to its autosave folder while the session has never been saved, named like the incumbent's takes (<track>_<NN>.wav). An existing file is never overwritten. - The header is rewritten every second, so a file left by a crash plays up to the last update. Above 4 GiB it switches to RF64 in place. - If a take file can't be created, Record doesn't start and says why; a write error ends that take where it failed. - At Stop the files become the takes' sources. Loop recording keeps one file per track, one clip per pass (at most 1000) on its own playlist, in one undo step. - Saving uses a file already in the target's Audio Files folder in place instead of rewriting it, so neither Save nor autosave copies a take. A take recorded at another rate than the session's is saved once at the session's rate. soundcraft-audio-io gains wav_float_header (its length doesn't depend on the frame count, so it can be rewritten in place); encode shares the header code. Splitting a loop take into passes moved from the UI into soundcraft_engine::io::add_recording, where it is tested.