13
0

VST3: handle offline FX processing callbacks

This fixes potential deadlocks, when not using rt
process threads.
This commit is contained in:
Robin Gareus 2024-08-06 20:30:20 +02:00
parent 3f1486fa12
commit 558e32e639
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -1676,7 +1676,7 @@ VST3PI::restartComponent (int32 flags)
if (flags & Vst::kReloadComponent) { if (flags & Vst::kReloadComponent) {
Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK); Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK);
if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced) { if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced && !_process_offline) {
pl.acquire (); pl.acquire ();
} else { } else {
assert (0); // a plugin should not call this while processing assert (0); // a plugin should not call this while processing
@ -1694,7 +1694,7 @@ VST3PI::restartComponent (int32 flags)
} }
if (flags & Vst::kParamValuesChanged) { if (flags & Vst::kParamValuesChanged) {
Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK); Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK);
if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced) { if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced && !_process_offline) {
pl.acquire (); pl.acquire ();
} }
update_shadow_data (); update_shadow_data ();
@ -1709,7 +1709,7 @@ VST3PI::restartComponent (int32 flags)
* changes are automatically picked up. * changes are automatically picked up.
*/ */
Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK); Glib::Threads::Mutex::Lock pl (_process_lock, Glib::Threads::NOT_LOCK);
if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced) { if (!AudioEngine::instance ()->in_process_thread () && !_is_loading_state && !_restart_component_is_synced && !_process_offline) {
/* Some plugins (e.g BlendEQ) call this from the process, /* Some plugins (e.g BlendEQ) call this from the process,
* IPlugProcessor::ProcessBuffers. In that case taking the * IPlugProcessor::ProcessBuffers. In that case taking the
* _process_lock would deadlock. * _process_lock would deadlock.