Open and close editors without realtime priority

This commit is contained in:
Robbert van der Helm
2021-01-11 18:50:41 +01:00
parent 10b8ef7870
commit f015739942
3 changed files with 26 additions and 7 deletions
+14 -5
View File
@@ -386,21 +386,30 @@ intptr_t Vst2Bridge::dispatch_wrapper(AEffect* plugin,
// provided by the host, and let the plugin embed itself into
// the Wine window
const auto x11_handle = reinterpret_cast<size_t>(data);
// NOTE: Just like in the event loop, we want to run this with lower
// priority to prevent whatever operation the plugin does
// while it's loading its editor from preempting the audio
// thread.
set_realtime_priority(false);
Editor& editor_instance =
editor.emplace(config, x11_handle, [plugin = this->plugin]() {
plugin->dispatcher(plugin, effEditIdle, 0, 0, nullptr, 0.0);
});
const intptr_t result =
plugin->dispatcher(plugin, opcode, index, value,
editor_instance.get_win32_handle(), option);
set_realtime_priority(true);
return plugin->dispatcher(plugin, opcode, index, value,
editor_instance.get_win32_handle(),
option);
return result;
} break;
case effEditClose: {
// Cleanup is handled through RAII
set_realtime_priority(false);
const intptr_t return_value =
plugin->dispatcher(plugin, opcode, index, value, data, option);
// Cleanup is handled through RAII
editor.reset();
set_realtime_priority(true);
return return_value;
} break;
+9 -2
View File
@@ -552,15 +552,20 @@ void Vst3Bridge::run() {
// be done in the main UI thread
return main_context
.run_in_context<tresult>([&]() {
// NOTE: Just like in the event loop, we want to run
// this with lower priority to prevent whatever
// operation the plugin does while it's loading
// its editor from preempting the audio thread.
set_realtime_priority(false);
Editor& editor_instance =
object_instances[request.owner_instance_id]
.editor.emplace(config, x11_handle);
const tresult result =
object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->attached(
editor_instance.get_win32_handle(),
type.c_str());
set_realtime_priority(true);
// Get rid of the editor again if the plugin didn't
// embed itself in it
@@ -577,12 +582,14 @@ void Vst3Bridge::run() {
-> YaPlugView::Removed::Response {
return main_context
.run_in_context<tresult>([&]() {
// Cleanup is handled through RAII
set_realtime_priority(false);
const tresult result =
object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->removed();
object_instances[request.owner_instance_id]
.editor.reset();
set_realtime_priority(true);
return result;
})