Remove redundant template arguments in MainContext

This commit is contained in:
Robbert van der Helm
2021-05-19 22:54:05 +02:00
parent 398ae789e0
commit 57d7141681
4 changed files with 46 additions and 45 deletions
+1 -1
View File
@@ -394,7 +394,7 @@ void Vst2Bridge::run() {
// handled. // handled.
if (unsafe_opcodes.contains(opcode)) { if (unsafe_opcodes.contains(opcode)) {
return main_context return main_context
.run_in_context<intptr_t>([&]() { .run_in_context([&]() -> intptr_t {
const intptr_t result = const intptr_t result =
dispatch_wrapper(plugin, opcode, index, dispatch_wrapper(plugin, opcode, index,
value, data, option); value, data, option);
+36 -37
View File
@@ -148,7 +148,7 @@ void Vst3Bridge::run() {
[&](const Vst3PlugViewProxy::Destruct& request) [&](const Vst3PlugViewProxy::Destruct& request)
-> Vst3PlugViewProxy::Destruct::Response { -> Vst3PlugViewProxy::Destruct::Response {
main_context main_context
.run_in_context<void>([&]() { .run_in_context([&]() -> void {
// When the pointer gets dropped by the host, we want to // When the pointer gets dropped by the host, we want to
// drop it here as well, along with the `IPlugFrame` // drop it here as well, along with the `IPlugFrame`
// proxy object it may have received in // proxy object it may have received in
@@ -179,29 +179,28 @@ void Vst3Bridge::run() {
// shouldn't) // shouldn't)
Steinberg::IPtr<Steinberg::FUnknown> object = Steinberg::IPtr<Steinberg::FUnknown> object =
main_context main_context
.run_in_context<Steinberg::IPtr<Steinberg::FUnknown>>( .run_in_context([&]() -> Steinberg::IPtr<
[&]() -> Steinberg::IPtr<Steinberg::FUnknown> { Steinberg::FUnknown> {
switch (request.requested_interface) { switch (request.requested_interface) {
case Vst3PluginProxy::Construct::Interface:: case Vst3PluginProxy::Construct::Interface::
IComponent: IComponent:
return module->getFactory() return module->getFactory()
.createInstance< .createInstance<
Steinberg::Vst::IComponent>( Steinberg::Vst::IComponent>(cid);
cid); break;
break; case Vst3PluginProxy::Construct::Interface::
case Vst3PluginProxy::Construct::Interface:: IEditController:
IEditController: return module->getFactory()
return module->getFactory() .createInstance<
.createInstance< Steinberg::Vst::IEditController>(
Steinberg::Vst:: cid);
IEditController>(cid); break;
break; default:
default: // Unreachable
// Unreachable return nullptr;
return nullptr; break;
break; }
} })
})
.get(); .get();
if (!object) { if (!object) {
@@ -466,7 +465,7 @@ void Vst3Bridge::run() {
-> YaEditController::CreateView::Response { -> YaEditController::CreateView::Response {
// Instantiate the object from the GUI thread // Instantiate the object from the GUI thread
main_context main_context
.run_in_context<void>([&]() { .run_in_context([&]() -> void {
// NOTE: Just like in the event loop, we want to run // NOTE: Just like in the event loop, we want to run
// this with lower priority to prevent whatever // this with lower priority to prevent whatever
// operation the plugin does while it's loading // operation the plugin does while it's loading
@@ -527,7 +526,7 @@ void Vst3Bridge::run() {
// certain channel context data, so this has to be run from the // certain channel context data, so this has to be run from the
// main thread // main thread
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.instance_id] return object_instances[request.instance_id]
.info_listener->setChannelContextInfos( .info_listener->setChannelContextInfos(
&request.list); &request.list);
@@ -703,7 +702,7 @@ void Vst3Bridge::run() {
// Creating the window and having the plugin embed in it should // Creating the window and having the plugin embed in it should
// be done in the main UI thread // be done in the main UI thread
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
set_realtime_priority(false); set_realtime_priority(false);
Editor& editor_instance = Editor& editor_instance =
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
@@ -730,7 +729,7 @@ void Vst3Bridge::run() {
[&](const YaPlugView::Removed& request) [&](const YaPlugView::Removed& request)
-> YaPlugView::Removed::Response { -> YaPlugView::Removed::Response {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
// Cleanup is handled through RAII // Cleanup is handled through RAII
set_realtime_priority(false); set_realtime_priority(false);
const tresult result = const tresult result =
@@ -749,7 +748,7 @@ void Vst3Bridge::run() {
// Since all of these `IPlugView::on*` functions can cause a // Since all of these `IPlugView::on*` functions can cause a
// redraw, they all have to be called from the UI thread // redraw, they all have to be called from the UI thread
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->onWheel( .plug_view_instance->plug_view->onWheel(
request.distance); request.distance);
@@ -759,7 +758,7 @@ void Vst3Bridge::run() {
[&](const YaPlugView::OnKeyDown& request) [&](const YaPlugView::OnKeyDown& request)
-> YaPlugView::OnKeyDown::Response { -> YaPlugView::OnKeyDown::Response {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->onKeyDown( .plug_view_instance->plug_view->onKeyDown(
request.key, request.key_code, request.key, request.key_code,
@@ -770,7 +769,7 @@ void Vst3Bridge::run() {
[&](const YaPlugView::OnKeyUp& request) [&](const YaPlugView::OnKeyUp& request)
-> YaPlugView::OnKeyUp::Response { -> YaPlugView::OnKeyUp::Response {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->onKeyUp( .plug_view_instance->plug_view->onKeyUp(
request.key, request.key_code, request.key, request.key_code,
@@ -810,7 +809,7 @@ void Vst3Bridge::run() {
[&](const YaPlugView::OnFocus& request) [&](const YaPlugView::OnFocus& request)
-> YaPlugView::OnFocus::Response { -> YaPlugView::OnFocus::Response {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->onFocus( .plug_view_instance->plug_view->onFocus(
request.state); request.state);
@@ -836,7 +835,7 @@ void Vst3Bridge::run() {
// since 80% of the `IPlugView` functions have to be we'll do it // since 80% of the `IPlugView` functions have to be we'll do it
// here anyways // here anyways
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->setFrame( .plug_view_instance->plug_view->setFrame(
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
@@ -878,7 +877,7 @@ void Vst3Bridge::run() {
return Steinberg::kNotImplemented; return Steinberg::kNotImplemented;
} else { } else {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances return object_instances
[request.owner_instance_id] [request.owner_instance_id]
.plug_view_instance .plug_view_instance
@@ -903,7 +902,7 @@ void Vst3Bridge::run() {
// `IPlugView::{initialize,terminate}`, we'll run these // `IPlugView::{initialize,terminate}`, we'll run these
// functions from the main GUI thread // functions from the main GUI thread
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
// This static cast is required to upcast to `FUnknown*` // This static cast is required to upcast to `FUnknown*`
const tresult result = const tresult result =
object_instances[request.instance_id] object_instances[request.instance_id]
@@ -925,7 +924,7 @@ void Vst3Bridge::run() {
[&](const YaPluginBase::Terminate& request) [&](const YaPluginBase::Terminate& request)
-> YaPluginBase::Terminate::Response { -> YaPluginBase::Terminate::Response {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context([&]() -> tresult {
return object_instances[request.instance_id] return object_instances[request.instance_id]
.plugin_base->terminate(); .plugin_base->terminate();
}) })
@@ -1377,7 +1376,7 @@ void Vst3Bridge::unregister_object_instance(size_t instance_id) {
// executed and when the actual host application context on // executed and when the actual host application context on
// the plugin side gets deallocated. // the plugin side gets deallocated.
main_context main_context
.run_in_context<void>([&, instance_id]() { .run_in_context([&, instance_id]() -> void {
std::lock_guard lock(object_instances_mutex); std::lock_guard lock(object_instances_mutex);
object_instances.erase(instance_id); object_instances.erase(instance_id);
}) })
+1 -1
View File
@@ -307,7 +307,7 @@ class Vst3Bridge : public HostBridge {
mutual_recursion.maybe_handle(std::forward<F>(fn))) { mutual_recursion.maybe_handle(std::forward<F>(fn))) {
return *result; return *result;
} else { } else {
return main_context.run_in_context<T>(std::forward<F>(fn)).get(); return main_context.run_in_context(std::forward<F>(fn)).get();
} }
} }
+8 -6
View File
@@ -239,13 +239,15 @@ class MainContext {
* return the results as a future. This is used to make sure that operations * return the results as a future. This is used to make sure that operations
* that may involve the Win32 message loop are all run from the same thread. * that may involve the Win32 message loop are all run from the same thread.
*/ */
template <typename T, typename F> template <std::invocable F>
std::future<T> run_in_context(F fn) { std::future<std::invoke_result_t<F>> run_in_context(F&& fn) {
std::packaged_task<T()> call_fn(std::move(fn)); using Result = std::invoke_result_t<F>;
std::future<T> response = call_fn.get_future();
std::packaged_task<Result()> call_fn(std::forward<F>(fn));
std::future<Result> result = call_fn.get_future();
boost::asio::dispatch(context, std::move(call_fn)); boost::asio::dispatch(context, std::move(call_fn));
return response; return result;
} }
/** /**
@@ -253,7 +255,7 @@ class MainContext {
* is that this version does not guarantee that it's going to be executed as * is that this version does not guarantee that it's going to be executed as
* soon as possible, and thus we also won't return a future. * soon as possible, and thus we also won't return a future.
*/ */
template <typename F> template <std::invocable F>
void schedule_task(F&& fn) { void schedule_task(F&& fn) {
boost::asio::post(context, std::forward<F>(fn)); boost::asio::post(context, std::forward<F>(fn));
} }