VST3: fix deadlock when recalling program changes latency
The GUI thread may call set_program() which can triggers the plugin directly calling restartComponent from the same thread.
This commit is contained in:
parent
09bddcad10
commit
c92c8c8fa2
@ -167,6 +167,8 @@ public:
|
||||
Vst::ParamID index_to_id (uint32_t) const;
|
||||
|
||||
Glib::Threads::Mutex& process_lock () { return _process_lock; }
|
||||
bool& component_is_synced () { return _restart_component_is_synced; }
|
||||
|
||||
|
||||
enum ParameterChange { BeginGesture,
|
||||
EndGesture,
|
||||
|
@ -1025,9 +1025,10 @@ VST3Plugin::load_preset (PresetRecord r)
|
||||
return false;
|
||||
}
|
||||
|
||||
Glib::Threads::Mutex::Lock lx (_plug->process_lock ());
|
||||
|
||||
if (tmp[0] == "VST3-P") {
|
||||
Glib::Threads::Mutex::Lock lx (_plug->process_lock ());
|
||||
PBD::Unwinder<bool> uw (_plug->component_is_synced (), true);
|
||||
int program = PBD::atoi (tmp[2]);
|
||||
assert (!r.user);
|
||||
if (!_plug->set_program (program, 0)) {
|
||||
@ -1044,14 +1045,14 @@ VST3Plugin::load_preset (PresetRecord r)
|
||||
std::string const& fn = _preset_uri_map[r.uri];
|
||||
|
||||
if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
|
||||
Glib::Threads::Mutex::Lock lx (_plug->process_lock ());
|
||||
PBD::Unwinder<bool> uw (_plug->component_is_synced (), true);
|
||||
RAMStream stream (fn);
|
||||
ok = _plug->load_state (stream);
|
||||
DEBUG_TRACE (DEBUG::VST3Config, string_compose ("VST3Plugin::load_preset: file %1 status %2\n", fn, ok ? "OK" : "error"));
|
||||
}
|
||||
}
|
||||
|
||||
lx.release ();
|
||||
|
||||
if (ok) {
|
||||
Plugin::load_preset (r);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user