Also fix mutual recursion across both components

When setting the state on the audio processor, it can happen that plugin
triggers a resize from the edit controller. We should also be able to
handle that situation.
This commit is contained in:
Robbert van der Helm
2021-04-30 02:10:09 +02:00
parent 949ddaf673
commit 52428c8749
2 changed files with 18 additions and 3 deletions
+15 -2
View File
@@ -374,9 +374,20 @@ tresult PLUGIN_API Vst3PluginProxyImpl::setState(Steinberg::IBStream* state) {
if (last_created_plug_view_active) { if (last_created_plug_view_active) {
return last_created_plug_view->send_mutually_recursive_message( return last_created_plug_view->send_mutually_recursive_message(
std::move(message)); std::move(message));
} else { } else if (connected_instance_id) {
return bridge.send_message(std::move(message)); // We should also be able to handle the above situation when a
// `setState()` on a processor triggers a resize coming from the
// edit controller. To do that, we'll also check if the connected
// instance has an active plug view.
Vst3PluginProxyImpl& other_instance =
bridge.plugin_proxies.at(*connected_instance_id).get();
if (other_instance.last_created_plug_view_active) {
return other_instance.last_created_plug_view
->send_mutually_recursive_message(std::move(message));
}
} }
return bridge.send_message(std::move(message));
} else { } else {
bridge.logger.log( bridge.logger.log(
"WARNING: Null pointer passed to " "WARNING: Null pointer passed to "
@@ -425,6 +436,8 @@ tresult PLUGIN_API Vst3PluginProxyImpl::connect(IConnectionPoint* other) {
// out which object the plugins are connected to, we'll still proxy the // out which object the plugins are connected to, we'll still proxy the
// host's connection proxy. // host's connection proxy.
if (auto other_instance = dynamic_cast<Vst3PluginProxy*>(other)) { if (auto other_instance = dynamic_cast<Vst3PluginProxy*>(other)) {
connected_instance_id = other_instance->instance_id();
return bridge.send_message( return bridge.send_message(
YaConnectionPoint::Connect{.instance_id = instance_id(), YaConnectionPoint::Connect{.instance_id = instance_id(),
.other = other_instance->instance_id()}); .other = other_instance->instance_id()});
+3 -1
View File
@@ -144,7 +144,7 @@ class Vst3PluginBridge : PluginBridge<Vst3Sockets<std::jthread>> {
*/ */
Steinberg::IPtr<Vst3PluginFactoryProxyImpl> plugin_factory = nullptr; Steinberg::IPtr<Vst3PluginFactoryProxyImpl> plugin_factory = nullptr;
private: public:
/** /**
* All VST3 plugin objects we created from this plugin. We keep track of * All VST3 plugin objects we created from this plugin. We keep track of
* these in case the plugin does a host callback, so we can associate that * these in case the plugin does a host callback, so we can associate that
@@ -156,5 +156,7 @@ class Vst3PluginBridge : PluginBridge<Vst3Sockets<std::jthread>> {
*/ */
std::map<size_t, std::reference_wrapper<Vst3PluginProxyImpl>> std::map<size_t, std::reference_wrapper<Vst3PluginProxyImpl>>
plugin_proxies; plugin_proxies;
private:
std::mutex plugin_proxies_mutex; std::mutex plugin_proxies_mutex;
}; };