Remove null pointer support in setComponentHandler

This should be an implementation fault.
This commit is contained in:
Robbert van der Helm
2020-12-22 13:54:55 +01:00
parent 37897da2b7
commit 51876a024c
4 changed files with 28 additions and 47 deletions
+2 -7
View File
@@ -209,13 +209,8 @@ bool Vst3Logger::log_request(
const YaEditController::SetComponentHandler& request) {
return log_request_base(is_host_vst, [&](auto& message) {
message << request.instance_id
<< ": IEditController::setComponentHandler(handler = ";
if (request.component_handler_proxy_args) {
message << "<IComponentHandler*>";
} else {
message << "<nullptr>";
}
message << ")";
<< ": IEditController::setComponentHandler(handler = "
"<IComponentHandler*>)";
});
}
@@ -345,18 +345,12 @@ class YaEditController : public Steinberg::Vst::IEditController {
native_size_t instance_id;
/**
* Arguments for instantiating the proxy object. Even though it should
* never happen, if the host passed a null pointer to this function
* we'll mimic that as well.
*/
std::optional<Vst3ComponentHandlerProxy::ConstructArgs>
component_handler_proxy_args;
Vst3ComponentHandlerProxy::ConstructArgs component_handler_proxy_args;
template <typename S>
void serialize(S& s) {
s.value8b(instance_id);
s.ext(component_handler_proxy_args, bitsery::ext::StdOptional{});
s.object(component_handler_proxy_args);
}
};
+16 -18
View File
@@ -337,28 +337,26 @@ Vst3PluginProxyImpl::setParamNormalized(Steinberg::Vst::ParamID id,
tresult PLUGIN_API Vst3PluginProxyImpl::setComponentHandler(
Steinberg::Vst::IComponentHandler* handler) {
// We'll store the pointer for when the plugin later makes a callback to
// this component handler
component_handler = handler;
// Automatically converted smart pointers for when the plugin performs a
// callback later
host_application = host_context;
std::optional<Vst3ComponentHandlerProxy::ConstructArgs>
component_handler_proxy_args = std::nullopt;
if (handler) {
component_handler_proxy_args = Vst3ComponentHandlerProxy::ConstructArgs(
component_handler, instance_id());
// We'll store the pointer for when the plugin later makes a callback to
// this component handler
component_handler = handler;
// Automatically converted smart pointers for when the plugin performs a
// callback later
host_application = host_context;
return bridge.send_message(YaEditController::SetComponentHandler{
.instance_id = instance_id(),
.component_handler_proxy_args =
Vst3ComponentHandlerProxy::ConstructArgs(component_handler,
instance_id())});
} else {
bridge.logger.log(
"Null pointer passed to 'IEditController::setComponentHandler()'");
"WARNING: Null pointer passed to "
"'IEditController::setComponentHandler()'");
return Steinberg::kInvalidArgument;
}
return bridge.send_message(YaEditController::SetComponentHandler{
.instance_id = instance_id(),
.component_handler_proxy_args =
std::move(component_handler_proxy_args)});
}
Steinberg::IPlugView* PLUGIN_API
+8 -14
View File
@@ -255,22 +255,16 @@ void Vst3Bridge::run() {
},
[&](YaEditController::SetComponentHandler& request)
-> YaEditController::SetComponentHandler::Response {
// If we got passed a component handler, we'll create a proxy
// object and pass that to the initialize function. The lifetime
// of this object is tied to that of the actual plugin object
// we're proxying for.
// We'll create a proxy object for the component handler and
// pass that to the initialize function. The lifetime of this
// object is tied to that of the actual plugin object we're
// proxying for.
// TODO: Does this have to be run from the UI thread? Figure out
// if it does
if (request.component_handler_proxy_args) {
object_instances[request.instance_id]
.component_handler_proxy =
Steinberg::owned(new Vst3ComponentHandlerProxyImpl(
*this,
std::move(*request.component_handler_proxy_args)));
} else {
object_instances[request.instance_id]
.component_handler_proxy = nullptr;
}
object_instances[request.instance_id].component_handler_proxy =
Steinberg::owned(new Vst3ComponentHandlerProxyImpl(
*this,
std::move(request.component_handler_proxy_args)));
return object_instances[request.instance_id]
.edit_controller->setComponentHandler(