Remove are_objects_directly_connected check

It's not necessary, since all of these objects are simple data objects
that will be passed as arguments to other functions. When we have to
pass through one of those functions we can just serialize the objects at
that point.
This commit is contained in:
Robbert van der Helm
2020-12-24 14:39:25 +01:00
parent 50b50418f4
commit b0fc8f2c5f
4 changed files with 18 additions and 55 deletions
-1
View File
@@ -16,7 +16,6 @@ This branch is still very far removed from being in a usable state. Below is an
incomplete list of things that still have to be done before this can be used: incomplete list of things that still have to be done before this can be used:
- Interfaces left to implement: - Interfaces left to implement:
- `IHostApplication::createComponent()` for indirectly connected objects
- `IConnectionPoint::notify()`, and support for indirectly connecting objects - `IConnectionPoint::notify()`, and support for indirectly connecting objects
through connction proxies through connction proxies
- `IEditController2` - `IEditController2`
@@ -97,15 +97,6 @@ class Vst3HostContextProxy : public YaHostApplication {
return arguments.owner_instance_id; return arguments.owner_instance_id;
} }
/**
* Used to shortcut calls to
* `IHostApplication::createInstance(IMessage::iid, IMessage::iid, &obj)`
* when two objects (a processor and a controller instance, for example) are
* directly connected. This way we don't have to proxy the message created
* by the host, which can save a lot of resoruces.
*/
std::atomic_bool are_objects_directly_connected = false;
private: private:
ConstructArgs arguments; ConstructArgs arguments;
}; };
@@ -66,40 +66,26 @@ Vst3HostContextProxyImpl::createInstance(Steinberg::TUID /*cid*/,
return Steinberg::kInvalidArgument; return Steinberg::kInvalidArgument;
} }
// These objects don't have to be created by the actual host since they'll
// only be used as an argument to other functions. We can just serialize
// them at that point.
Steinberg::FUID iid = Steinberg::FUID::fromTUID(_iid); Steinberg::FUID iid = Steinberg::FUID::fromTUID(_iid);
// If an objects wants to create an `IMessage` object to send it to some if (iid == Steinberg::Vst::IMessage::iid) {
// object it is directly connected to, then we can keep everything local // TODO: Add logging for this on verbosity level 1
// on the Wine side. This is mostly an optimization, because it saves a *obj = new Steinberg::Vst::HostMessage{};
// lot of unnecessary back and forth communication. return Steinberg::kResultTrue;
if (are_objects_directly_connected) { } else if (iid == Steinberg::Vst::IAttributeList::iid) {
if (iid == Steinberg::Vst::IMessage::iid) { // TODO: Add logging for this on verbosity level 1
// TODO: Add logging for this on verbosity level 1 *obj = new Steinberg::Vst::HostAttributeList{};
*obj = new Steinberg::Vst::HostMessage{}; return Steinberg::kResultTrue;
return Steinberg::kResultTrue;
} else if (iid == Steinberg::Vst::IAttributeList::iid) {
// TODO: Add logging for this on verbosity level 1
*obj = new Steinberg::Vst::HostAttributeList{};
return Steinberg::kResultTrue;
} else {
// When the host requests an interface we do not (yet) implement,
// we'll print a recognizable log message
const Steinberg::FUID uid = Steinberg::FUID::fromTUID(_iid);
std::cerr
<< "TODO: Implement unknown interface logging on Wine side "
"for Vst3HostContextProxyImpl::createInstance"
<< std::endl;
return Steinberg::kNotImplemented;
}
} else { } else {
// TODO: Implement for objects that are not directly connected // When the host requests an interface we do not (yet) implement,
std::cerr // we'll print a recognizable log message
<< "TODO: Creating <IMessage*> and <IAttributeList*> instances in " const Steinberg::FUID uid = Steinberg::FUID::fromTUID(_iid);
"IHostApplication::createInstance() for indirectly " std::cerr << "TODO: Implement unknown interface logging on Wine side "
"connected objects has not yet been implemented" "for Vst3HostContextProxyImpl::createInstance"
<< std::endl; << std::endl;
*obj = nullptr;
return Steinberg::kNotImplemented; return Steinberg::kNotImplemented;
} }
} }
+1 -14
View File
@@ -170,22 +170,9 @@ void Vst3Bridge::run() {
}, },
[&](const YaConnectionPoint::Connect& request) [&](const YaConnectionPoint::Connect& request)
-> YaConnectionPoint::Connect::Response { -> YaConnectionPoint::Connect::Response {
// We can directly connect the underlying objects. We'll mark // We can directly connect the underlying objects
// that we're using a direct connection on our host context
// proxy so that when the plugin wants to create an `IMessage`
// object, we can keep everything local and we Don't have to go
// through the host.
// TODO: Add support for connecting objects through a proxy // TODO: Add support for connecting objects through a proxy
// object provided by the host // object provided by the host
if (object_instances[request.instance_id].host_context_proxy) {
object_instances[request.instance_id]
.host_context_proxy->are_objects_directly_connected =
true;
object_instances[request.other_instance_id]
.host_context_proxy->are_objects_directly_connected =
true;
}
return object_instances[request.instance_id] return object_instances[request.instance_id]
.connection_point->connect( .connection_point->connect(
object_instances[request.other_instance_id] object_instances[request.other_instance_id]