mirror of
https://github.com/storytold/soundcraft.git
synced 2026-10-31 22:16:47 -06:00
Saving, bouncing and the two-minute autosave read every third-party plugin's state through the audio callback: a command made the callback call each plugin's save_state between two blocks and reply, while the UI waited for up to 2 s. So: - CLAP's clap.state and VST3's getState ran on the audio thread, although both formats want them on the main thread. - The callback allocated and waited on the plugins; a plugin with a large state (a sampler) could make the audio drop out on every save and autosave. - Without a running callback (a stalled or lost device), every save waited 2 s and then kept stale plugin states. Each instance now hands Side::prepare a state reader before it leaves for the audio thread, the way it hands over its editor handle. CLAP's GuiLink and VST3's EditorLink (which now holds the component as well) read the state under their lock; Audio Units get a StateLink that does the same. Each instance cuts its link off before it is destroyed, so a reader never calls into a dead plugin. Player::capture_states reads them on the calling (UI) thread, and the CaptureStates command is gone. Each host's tests read the state while another thread processes the instance, and get nothing once it is dropped. Playback reads states with no audio thread at all.