mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-06 19:40:10 +02:00
Call more VST3 functions from the UI thread
These functions have had a UI thread requirement added after VST 3.7.7. This change may cause some breakage because of the mutual recursion requirements. I decided to not do this for most of the simpler getter-style functions that the VST3 specification now for some reason requires to be called from the UI thread, as this could significantly hurt performance and changing this is more likely to cause problems than leaving it alone is.
This commit is contained in:
+261
-140
@@ -273,23 +273,33 @@ void Vst3Bridge::run() {
|
|||||||
.result = result, .state = std::move(request.state)};
|
.result = result, .state = std::move(request.state)};
|
||||||
},
|
},
|
||||||
[&](YaAudioPresentationLatency::SetAudioPresentationLatencySamples&
|
[&](YaAudioPresentationLatency::SetAudioPresentationLatencySamples&
|
||||||
request) -> YaAudioPresentationLatency::
|
request)
|
||||||
SetAudioPresentationLatencySamples::Response {
|
-> YaAudioPresentationLatency::
|
||||||
const auto& [instance, _] =
|
SetAudioPresentationLatencySamples::Response {
|
||||||
get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces
|
return instance.interfaces
|
||||||
.audio_presentation_latency
|
.audio_presentation_latency
|
||||||
->setAudioPresentationLatencySamples(
|
->setAudioPresentationLatencySamples(
|
||||||
request.dir, request.bus_index,
|
request.dir, request.bus_index,
|
||||||
request.latency_in_samples);
|
request.latency_in_samples);
|
||||||
},
|
})
|
||||||
|
.get();
|
||||||
|
},
|
||||||
[&](YaAutomationState::SetAutomationState& request)
|
[&](YaAutomationState::SetAutomationState& request)
|
||||||
-> YaAutomationState::SetAutomationState::Response {
|
-> YaAutomationState::SetAutomationState::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.automation_state->setAutomationState(
|
return instance.interfaces.automation_state
|
||||||
request.state);
|
->setAutomationState(request.state);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](YaConnectionPoint::Connect& request)
|
[&](YaConnectionPoint::Connect& request)
|
||||||
-> YaConnectionPoint::Connect::Response {
|
-> YaConnectionPoint::Connect::Response {
|
||||||
@@ -303,56 +313,70 @@ void Vst3Bridge::run() {
|
|||||||
// on the Wine side. If we cannot do that, then we'll still go
|
// on the Wine side. If we cannot do that, then we'll still go
|
||||||
// through the host's connection proxy connection proxy (and
|
// through the host's connection proxy connection proxy (and
|
||||||
// we'll end up proxying the host's connection proxy).
|
// we'll end up proxying the host's connection proxy).
|
||||||
return std::visit(
|
return main_context_
|
||||||
overload{
|
.run_in_context([&]() -> tresult {
|
||||||
[&](const native_size_t& other_instance_id) -> tresult {
|
return std::visit(
|
||||||
const auto& [this_instance, _] =
|
overload{
|
||||||
get_instance(request.instance_id);
|
[&](const native_size_t& other_instance_id)
|
||||||
const auto& [other_instance, _2] =
|
-> tresult {
|
||||||
get_instance(other_instance_id);
|
const auto& [this_instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
const auto& [other_instance, _2] =
|
||||||
|
get_instance(other_instance_id);
|
||||||
|
|
||||||
return this_instance.interfaces.connection_point
|
return this_instance.interfaces
|
||||||
->connect(
|
.connection_point->connect(
|
||||||
other_instance.interfaces.connection_point);
|
other_instance.interfaces
|
||||||
},
|
.connection_point);
|
||||||
[&](Vst3ConnectionPointProxy::ConstructArgs& args)
|
},
|
||||||
-> tresult {
|
[&](Vst3ConnectionPointProxy::ConstructArgs&
|
||||||
const auto& [this_instance, _] =
|
args) -> tresult {
|
||||||
get_instance(request.instance_id);
|
const auto& [this_instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
this_instance.connection_point_proxy =
|
this_instance.connection_point_proxy =
|
||||||
Steinberg::owned(
|
Steinberg::owned(
|
||||||
new Vst3ConnectionPointProxyImpl(
|
new Vst3ConnectionPointProxyImpl(
|
||||||
*this, std::move(args)));
|
*this, std::move(args)));
|
||||||
|
|
||||||
return this_instance.interfaces.connection_point
|
return this_instance.interfaces
|
||||||
->connect(this_instance.connection_point_proxy);
|
.connection_point->connect(
|
||||||
}},
|
this_instance
|
||||||
request.other);
|
.connection_point_proxy);
|
||||||
|
}},
|
||||||
|
request.other);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaConnectionPoint::Disconnect& request)
|
[&](const YaConnectionPoint::Disconnect& request)
|
||||||
-> YaConnectionPoint::Disconnect::Response {
|
-> YaConnectionPoint::Disconnect::Response {
|
||||||
const auto& [this_instance, _] =
|
return main_context_
|
||||||
get_instance(request.instance_id);
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [this_instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
// If the objects were connected directly we can also disconnect
|
// If the objects were connected directly we can also
|
||||||
// them directly. Otherwise we'll disconnect them from our proxy
|
// disconnect them directly. Otherwise we'll disconnect
|
||||||
// object and then destroy that proxy object.
|
// them from our proxy object and then destroy that
|
||||||
if (request.other_instance_id) {
|
// proxy object.
|
||||||
const auto& [other_instance, _2] =
|
if (request.other_instance_id) {
|
||||||
get_instance(*request.other_instance_id);
|
const auto& [other_instance, _2] =
|
||||||
|
get_instance(*request.other_instance_id);
|
||||||
|
|
||||||
return this_instance.interfaces.connection_point
|
return this_instance.interfaces.connection_point
|
||||||
->disconnect(
|
->disconnect(
|
||||||
other_instance.interfaces.connection_point);
|
other_instance.interfaces.connection_point);
|
||||||
} else {
|
} else {
|
||||||
const tresult result =
|
const tresult result =
|
||||||
this_instance.interfaces.connection_point->disconnect(
|
this_instance.interfaces.connection_point
|
||||||
this_instance.connection_point_proxy);
|
->disconnect(
|
||||||
this_instance.connection_point_proxy.reset();
|
this_instance.connection_point_proxy);
|
||||||
|
this_instance.connection_point_proxy.reset();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaConnectionPoint::Notify& request)
|
[&](const YaConnectionPoint::Notify& request)
|
||||||
-> YaConnectionPoint::Notify::Response {
|
-> YaConnectionPoint::Notify::Response {
|
||||||
@@ -395,10 +419,15 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](YaEditController::SetComponentState& request)
|
[&](YaEditController::SetComponentState& request)
|
||||||
-> YaEditController::SetComponentState::Response {
|
-> YaEditController::SetComponentState::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller->setComponentState(
|
return instance.interfaces.edit_controller
|
||||||
&request.state);
|
->setComponentState(&request.state);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaEditController::GetParameterInfos& request)
|
[&](const YaEditController::GetParameterInfos& request)
|
||||||
-> YaEditController::GetParameterInfos::Response {
|
-> YaEditController::GetParameterInfos::Response {
|
||||||
@@ -496,23 +525,33 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](YaEditController::SetComponentHandler& request)
|
[&](YaEditController::SetComponentHandler& request)
|
||||||
-> YaEditController::SetComponentHandler::Response {
|
-> YaEditController::SetComponentHandler::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
// If the host passed a valid component handler, then we'll
|
// If the host passed a valid component handler, then
|
||||||
// create a proxy object for the component handler and pass that
|
// we'll create a proxy object for the component handler
|
||||||
// to the initialize function. The lifetime of this object is
|
// and pass that to the initialize function. The
|
||||||
// tied to that of the actual plugin object we're proxying for.
|
// lifetime of this object is tied to that of the actual
|
||||||
// Otherwise we'll also pass a null pointer. This often happens
|
// plugin object we're proxying for. Otherwise we'll
|
||||||
// just before the host terminates the plugin.
|
// also pass a null pointer. This often happens just
|
||||||
instance.component_handler_proxy =
|
// before the host terminates the plugin.
|
||||||
request.component_handler_proxy_args
|
instance.component_handler_proxy =
|
||||||
? Steinberg::owned(new Vst3ComponentHandlerProxyImpl(
|
request.component_handler_proxy_args
|
||||||
*this,
|
? Steinberg::owned(
|
||||||
std::move(*request.component_handler_proxy_args)))
|
new Vst3ComponentHandlerProxyImpl(
|
||||||
: nullptr;
|
*this,
|
||||||
|
std::move(
|
||||||
|
*request
|
||||||
|
.component_handler_proxy_args)))
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
return instance.interfaces.edit_controller->setComponentHandler(
|
return instance.interfaces.edit_controller
|
||||||
instance.component_handler_proxy);
|
->setComponentHandler(
|
||||||
|
instance.component_handler_proxy);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaEditController::CreateView& request)
|
[&](const YaEditController::CreateView& request)
|
||||||
-> YaEditController::CreateView::Response {
|
-> YaEditController::CreateView::Response {
|
||||||
@@ -554,6 +593,8 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](const YaEditController2::SetKnobMode& request)
|
[&](const YaEditController2::SetKnobMode& request)
|
||||||
-> YaEditController2::SetKnobMode::Response {
|
-> YaEditController2::SetKnobMode::Response {
|
||||||
|
// We'll ignore the UI thread requirement for the parameter
|
||||||
|
// functions
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
const auto& [instance, _] = get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller_2->setKnobMode(
|
return instance.interfaces.edit_controller_2->setKnobMode(
|
||||||
@@ -561,20 +602,32 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](const YaEditController2::OpenHelp& request)
|
[&](const YaEditController2::OpenHelp& request)
|
||||||
-> YaEditController2::OpenHelp::Response {
|
-> YaEditController2::OpenHelp::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller_2->openHelp(
|
return instance.interfaces.edit_controller_2->openHelp(
|
||||||
request.only_check);
|
request.only_check);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaEditController2::OpenAboutBox& request)
|
[&](const YaEditController2::OpenAboutBox& request)
|
||||||
-> YaEditController2::OpenAboutBox::Response {
|
-> YaEditController2::OpenAboutBox::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller_2->openAboutBox(
|
return instance.interfaces.edit_controller_2
|
||||||
request.only_check);
|
->openAboutBox(request.only_check);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaEditControllerHostEditing::BeginEditFromHost& request)
|
[&](const YaEditControllerHostEditing::BeginEditFromHost& request)
|
||||||
-> YaEditControllerHostEditing::BeginEditFromHost::Response {
|
-> YaEditControllerHostEditing::BeginEditFromHost::Response {
|
||||||
|
// We'll ignore the UI thread requirement for the parameter
|
||||||
|
// functions
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
const auto& [instance, _] = get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller_host_editing
|
return instance.interfaces.edit_controller_host_editing
|
||||||
@@ -582,6 +635,8 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](const YaEditControllerHostEditing::EndEditFromHost& request)
|
[&](const YaEditControllerHostEditing::EndEditFromHost& request)
|
||||||
-> YaEditControllerHostEditing::EndEditFromHost::Response {
|
-> YaEditControllerHostEditing::EndEditFromHost::Response {
|
||||||
|
// We'll ignore the UI thread requirement for the parameter
|
||||||
|
// functions
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
const auto& [instance, _] = get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.edit_controller_host_editing
|
return instance.interfaces.edit_controller_host_editing
|
||||||
@@ -624,11 +679,17 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](const YaMidiLearn::OnLiveMIDIControllerInput& request)
|
[&](const YaMidiLearn::OnLiveMIDIControllerInput& request)
|
||||||
-> YaMidiLearn::OnLiveMIDIControllerInput::Response {
|
-> YaMidiLearn::OnLiveMIDIControllerInput::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.midi_learn
|
return instance.interfaces.midi_learn
|
||||||
->onLiveMIDIControllerInput(
|
->onLiveMIDIControllerInput(request.bus_index,
|
||||||
request.bus_index, request.channel, request.midi_cc);
|
request.channel,
|
||||||
|
request.midi_cc);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaMidiMapping::GetMidiControllerAssignment& request)
|
[&](const YaMidiMapping::GetMidiControllerAssignment& request)
|
||||||
-> YaMidiMapping::GetMidiControllerAssignment::Response {
|
-> YaMidiMapping::GetMidiControllerAssignment::Response {
|
||||||
@@ -1181,21 +1242,37 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](YaProgramListData::GetProgramData& request)
|
[&](YaProgramListData::GetProgramData& request)
|
||||||
-> YaProgramListData::GetProgramData::Response {
|
-> YaProgramListData::GetProgramData::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context(
|
||||||
|
[&]() -> YaProgramListData::GetProgramDataResponse {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
const tresult result =
|
const tresult result =
|
||||||
instance.interfaces.program_list_data->getProgramData(
|
instance.interfaces.program_list_data
|
||||||
request.list_id, request.program_index, &request.data);
|
->getProgramData(request.list_id,
|
||||||
|
request.program_index,
|
||||||
|
&request.data);
|
||||||
|
|
||||||
return YaProgramListData::GetProgramDataResponse{
|
return YaProgramListData::GetProgramDataResponse{
|
||||||
.result = result, .data = std::move(request.data)};
|
.result = result,
|
||||||
|
.data = std::move(request.data)};
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](YaProgramListData::SetProgramData& request)
|
[&](YaProgramListData::SetProgramData& request)
|
||||||
-> YaProgramListData::SetProgramData::Response {
|
-> YaProgramListData::SetProgramData::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.program_list_data->setProgramData(
|
return instance.interfaces.program_list_data
|
||||||
request.list_id, request.program_index, &request.data);
|
->setProgramData(request.list_id,
|
||||||
|
request.program_index,
|
||||||
|
&request.data);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaUnitData::UnitDataSupported& request)
|
[&](const YaUnitData::UnitDataSupported& request)
|
||||||
-> YaUnitData::UnitDataSupported::Response {
|
-> YaUnitData::UnitDataSupported::Response {
|
||||||
@@ -1206,21 +1283,31 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](YaUnitData::GetUnitData& request)
|
[&](YaUnitData::GetUnitData& request)
|
||||||
-> YaUnitData::GetUnitData::Response {
|
-> YaUnitData::GetUnitData::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> YaUnitData::GetUnitDataResponse {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
const tresult result =
|
const tresult result =
|
||||||
instance.interfaces.unit_data->getUnitData(request.unit_id,
|
instance.interfaces.unit_data->getUnitData(
|
||||||
&request.data);
|
request.unit_id, &request.data);
|
||||||
|
|
||||||
return YaUnitData::GetUnitDataResponse{
|
return YaUnitData::GetUnitDataResponse{
|
||||||
.result = result, .data = std::move(request.data)};
|
.result = result, .data = std::move(request.data)};
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](YaUnitData::SetUnitData& request)
|
[&](YaUnitData::SetUnitData& request)
|
||||||
-> YaUnitData::SetUnitData::Response {
|
-> YaUnitData::SetUnitData::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.unit_data->setUnitData(
|
return instance.interfaces.unit_data->setUnitData(
|
||||||
request.unit_id, &request.data);
|
request.unit_id, &request.data);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](YaPluginFactory3::SetHostContext& request)
|
[&](YaPluginFactory3::SetHostContext& request)
|
||||||
-> YaPluginFactory3::SetHostContext::Response {
|
-> YaPluginFactory3::SetHostContext::Response {
|
||||||
@@ -1335,10 +1422,15 @@ void Vst3Bridge::run() {
|
|||||||
},
|
},
|
||||||
[&](const YaUnitInfo::SelectUnit& request)
|
[&](const YaUnitInfo::SelectUnit& request)
|
||||||
-> YaUnitInfo::SelectUnit::Response {
|
-> YaUnitInfo::SelectUnit::Response {
|
||||||
const auto& [instance, _] = get_instance(request.instance_id);
|
return main_context_
|
||||||
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.unit_info->selectUnit(
|
return instance.interfaces.unit_info->selectUnit(
|
||||||
request.unit_id);
|
request.unit_id);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaUnitInfo::GetUnitByBus& request)
|
[&](const YaUnitInfo::GetUnitByBus& request)
|
||||||
-> YaUnitInfo::GetUnitByBus::Response {
|
-> YaUnitInfo::GetUnitByBus::Response {
|
||||||
@@ -1365,18 +1457,29 @@ void Vst3Bridge::run() {
|
|||||||
request)
|
request)
|
||||||
-> YaXmlRepresentationController::GetXmlRepresentationStream::
|
-> YaXmlRepresentationController::GetXmlRepresentationStream::
|
||||||
Response {
|
Response {
|
||||||
const auto& [instance, _] =
|
return main_context_
|
||||||
get_instance(request.instance_id);
|
.run_in_context(
|
||||||
|
[&]()
|
||||||
|
-> YaXmlRepresentationController::
|
||||||
|
GetXmlRepresentationStreamResponse {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(
|
||||||
|
request.instance_id);
|
||||||
|
|
||||||
const tresult result =
|
const tresult result =
|
||||||
instance.interfaces.xml_representation_controller
|
instance.interfaces
|
||||||
->getXmlRepresentationStream(request.info,
|
.xml_representation_controller
|
||||||
&request.stream);
|
->getXmlRepresentationStream(
|
||||||
|
request.info,
|
||||||
|
&request.stream);
|
||||||
|
|
||||||
return YaXmlRepresentationController::
|
return YaXmlRepresentationController::
|
||||||
GetXmlRepresentationStreamResponse{
|
GetXmlRepresentationStreamResponse{
|
||||||
.result = result,
|
.result = result,
|
||||||
.stream = std::move(request.stream)};
|
.stream = std::move(
|
||||||
|
request.stream)};
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1636,23 +1739,29 @@ size_t Vst3Bridge::register_object_instance(
|
|||||||
overload{
|
overload{
|
||||||
[&](YaAudioProcessor::SetBusArrangements& request)
|
[&](YaAudioProcessor::SetBusArrangements& request)
|
||||||
-> YaAudioProcessor::SetBusArrangements::Response {
|
-> YaAudioProcessor::SetBusArrangements::Response {
|
||||||
const auto& [instance, _] =
|
return main_context_
|
||||||
get_instance(request.instance_id);
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
// HACK: WA Production Imperfect VST3 somehow requires
|
// HACK: WA Production Imperfect VST3 somehow
|
||||||
// `inputs` to be a valid pointer, even if there
|
// requires `inputs` to be a valid
|
||||||
// are no inputs.
|
// pointer, even if there are no inputs.
|
||||||
Steinberg::Vst::SpeakerArrangement empty_arrangement =
|
Steinberg::Vst::SpeakerArrangement
|
||||||
0b00000000;
|
empty_arrangement = 0b00000000;
|
||||||
|
|
||||||
return instance.interfaces.audio_processor
|
return instance.interfaces.audio_processor
|
||||||
->setBusArrangements(
|
->setBusArrangements(
|
||||||
request.num_ins > 0 ? request.inputs.data()
|
request.num_ins > 0
|
||||||
: &empty_arrangement,
|
? request.inputs.data()
|
||||||
request.num_ins,
|
: &empty_arrangement,
|
||||||
request.num_outs > 0 ? request.outputs.data()
|
request.num_ins,
|
||||||
: &empty_arrangement,
|
request.num_outs > 0
|
||||||
request.num_outs);
|
? request.outputs.data()
|
||||||
|
: &empty_arrangement,
|
||||||
|
request.num_outs);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](YaAudioProcessor::GetBusArrangement& request)
|
[&](YaAudioProcessor::GetBusArrangement& request)
|
||||||
-> YaAudioProcessor::GetBusArrangement::Response {
|
-> YaAudioProcessor::GetBusArrangement::Response {
|
||||||
@@ -1697,8 +1806,12 @@ size_t Vst3Bridge::register_object_instance(
|
|||||||
// buffers.
|
// buffers.
|
||||||
instance.process_setup = request.setup;
|
instance.process_setup = request.setup;
|
||||||
|
|
||||||
return instance.interfaces.audio_processor
|
return main_context_
|
||||||
->setupProcessing(request.setup);
|
.run_in_context([&]() -> tresult {
|
||||||
|
return instance.interfaces.audio_processor
|
||||||
|
->setupProcessing(request.setup);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaAudioProcessor::SetProcessing& request)
|
[&](const YaAudioProcessor::SetProcessing& request)
|
||||||
-> YaAudioProcessor::SetProcessing::Response {
|
-> YaAudioProcessor::SetProcessing::Response {
|
||||||
@@ -1797,11 +1910,15 @@ size_t Vst3Bridge::register_object_instance(
|
|||||||
},
|
},
|
||||||
[&](const YaComponent::SetIoMode& request)
|
[&](const YaComponent::SetIoMode& request)
|
||||||
-> YaComponent::SetIoMode::Response {
|
-> YaComponent::SetIoMode::Response {
|
||||||
const auto& [instance, _] =
|
return main_context_
|
||||||
get_instance(request.instance_id);
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.component->setIoMode(
|
return instance.interfaces.component->setIoMode(
|
||||||
request.mode);
|
request.mode);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaComponent::GetBusCount& request)
|
[&](const YaComponent::GetBusCount& request)
|
||||||
-> YaComponent::GetBusCount::Response {
|
-> YaComponent::GetBusCount::Response {
|
||||||
@@ -1839,12 +1956,16 @@ size_t Vst3Bridge::register_object_instance(
|
|||||||
},
|
},
|
||||||
[&](const YaComponent::ActivateBus& request)
|
[&](const YaComponent::ActivateBus& request)
|
||||||
-> YaComponent::ActivateBus::Response {
|
-> YaComponent::ActivateBus::Response {
|
||||||
const auto& [instance, _] =
|
return main_context_
|
||||||
get_instance(request.instance_id);
|
.run_in_context([&]() -> tresult {
|
||||||
|
const auto& [instance, _] =
|
||||||
|
get_instance(request.instance_id);
|
||||||
|
|
||||||
return instance.interfaces.component->activateBus(
|
return instance.interfaces.component
|
||||||
request.type, request.dir, request.index,
|
->activateBus(request.type, request.dir,
|
||||||
request.state);
|
request.index, request.state);
|
||||||
|
})
|
||||||
|
.get();
|
||||||
},
|
},
|
||||||
[&](const YaComponent::SetActive& request)
|
[&](const YaComponent::SetActive& request)
|
||||||
-> YaComponent::SetActive::Response {
|
-> YaComponent::SetActive::Response {
|
||||||
@@ -1856,7 +1977,7 @@ size_t Vst3Bridge::register_object_instance(
|
|||||||
// handled from the same thread to prevent
|
// handled from the same thread to prevent
|
||||||
// deadlocks caused by mutually recursive function
|
// deadlocks caused by mutually recursive function
|
||||||
// calls.
|
// calls.
|
||||||
return do_mutual_recursion_on_off_thread(
|
return do_mutual_recursion_on_gui_thread(
|
||||||
[&]() -> YaComponent::SetActive::Response {
|
[&]() -> YaComponent::SetActive::Response {
|
||||||
const auto& [instance, _] =
|
const auto& [instance, _] =
|
||||||
get_instance(request.instance_id);
|
get_instance(request.instance_id);
|
||||||
|
|||||||
Reference in New Issue
Block a user