Add noexcept qualifications on the plugin side

See the last few commits.
This commit is contained in:
Robbert van der Helm
2021-05-14 17:50:12 +02:00
parent 8ba6e4a937
commit 37257298a1
7 changed files with 36 additions and 22 deletions
+1 -1
View File
@@ -105,7 +105,7 @@ class PluginBridge {
io_context.run(); io_context.run();
}) {} }) {}
virtual ~PluginBridge(){}; virtual ~PluginBridge() noexcept {};
protected: protected:
/** /**
+14 -8
View File
@@ -31,7 +31,7 @@ float get_parameter_proxy(AEffect*, int);
* is sadly needed as a workaround to avoid using globals since we need free * is sadly needed as a workaround to avoid using globals since we need free
* function pointers to interface with the VST C API. * function pointers to interface with the VST C API.
*/ */
Vst2PluginBridge& get_bridge_instance(const AEffect& plugin) { Vst2PluginBridge& get_bridge_instance(const AEffect& plugin) noexcept {
return *static_cast<Vst2PluginBridge*>(plugin.ptr3); return *static_cast<Vst2PluginBridge*>(plugin.ptr3);
} }
@@ -168,20 +168,26 @@ Vst2PluginBridge::Vst2PluginBridge(audioMasterCallback host_callback)
update_aeffect(plugin, initialized_plugin); update_aeffect(plugin, initialized_plugin);
} }
Vst2PluginBridge::~Vst2PluginBridge() { Vst2PluginBridge::~Vst2PluginBridge() noexcept {
// Drop all work make sure all sockets are closed try {
plugin_host->terminate(); // Drop all work make sure all sockets are closed
plugin_host->terminate();
// The `stop()` method will cause the IO context to just drop all of its // The `stop()` method will cause the IO context to just drop all of its
// outstanding work immediately // outstanding work immediately
io_context.stop(); io_context.stop();
} catch (const boost::system::system_error&) {
// It could be that the sockets have already been closed or that the
// process has already exited (at which point we probably won't be
// executing this, but maybe if all the stars align)
}
} }
class DispatchDataConverter : DefaultDataConverter { class DispatchDataConverter : DefaultDataConverter {
public: public:
DispatchDataConverter(std::vector<uint8_t>& chunk_data, DispatchDataConverter(std::vector<uint8_t>& chunk_data,
AEffect& plugin, AEffect& plugin,
VstRect& editor_rectangle) VstRect& editor_rectangle) noexcept
: chunk(chunk_data), plugin(plugin), rect(editor_rectangle) {} : chunk(chunk_data), plugin(plugin), rect(editor_rectangle) {}
EventPayload read(const int opcode, EventPayload read(const int opcode,
+1 -1
View File
@@ -52,7 +52,7 @@ class Vst2PluginBridge : PluginBridge<Vst2Sockets<std::jthread>> {
* Terminate the Wine plugin host process and drop all work when the module * Terminate the Wine plugin host process and drop all work when the module
* gets unloaded. * gets unloaded.
*/ */
~Vst2PluginBridge(); ~Vst2PluginBridge() noexcept override;
// The four below functions are the handlers from the VST2 API. They are // The four below functions are the handlers from the VST2 API. They are
// called through proxy functions in `plugin.cpp`. // called through proxy functions in `plugin.cpp`.
+10 -4
View File
@@ -363,10 +363,16 @@ Vst3PluginBridge::Vst3PluginBridge()
}); });
} }
Vst3PluginBridge::~Vst3PluginBridge() { Vst3PluginBridge::~Vst3PluginBridge() noexcept {
// Drop all work make sure all sockets are closed try {
plugin_host->terminate(); // Drop all work make sure all sockets are closed
io_context.stop(); plugin_host->terminate();
io_context.stop();
} catch (const boost::system::system_error&) {
// It could be that the sockets have already been closed or that the
// process has already exited (at which point we probably won't be
// executing this, but maybe if all the stars align)
}
} }
Steinberg::IPluginFactory* Vst3PluginBridge::get_plugin_factory() { Steinberg::IPluginFactory* Vst3PluginBridge::get_plugin_factory() {
+2 -2
View File
@@ -53,13 +53,13 @@ class Vst3PluginBridge : PluginBridge<Vst3Sockets<std::jthread>> {
* @throw std::runtime_error Thrown when the Wine plugin host could not be * @throw std::runtime_error Thrown when the Wine plugin host could not be
* found, or if it could not locate and load a VST3 module. * found, or if it could not locate and load a VST3 module.
*/ */
Vst3PluginBridge(); explicit Vst3PluginBridge();
/** /**
* Terminate the Wine plugin host process and drop all work when the module * Terminate the Wine plugin host process and drop all work when the module
* gets unloaded. * gets unloaded.
*/ */
~Vst3PluginBridge(); ~Vst3PluginBridge() noexcept;
/** /**
* When the host loads the module it will call `GetPluginFactory()` which * When the host loads the module it will call `GetPluginFactory()` which
+4 -2
View File
@@ -64,6 +64,8 @@ HostProcess::HostProcess(boost::asio::io_context& io_context,
logger.async_log_pipe_lines(stderr_pipe, stderr_buffer, "[Wine STDERR] "); logger.async_log_pipe_lines(stderr_pipe, stderr_buffer, "[Wine STDERR] ");
} }
HostProcess::~HostProcess() noexcept {}
IndividualHost::IndividualHost(boost::asio::io_context& io_context, IndividualHost::IndividualHost(boost::asio::io_context& io_context,
Logger& logger, Logger& logger,
const PluginInfo& plugin_info, const PluginInfo& plugin_info,
@@ -108,7 +110,7 @@ fs::path IndividualHost::path() {
return host_path; return host_path;
} }
bool IndividualHost::running() { bool IndividualHost::running() noexcept {
return host.running(); return host.running();
} }
@@ -219,7 +221,7 @@ fs::path GroupHost::path() {
return host_path; return host_path;
} }
bool GroupHost::running() { bool GroupHost::running() noexcept {
// When we are unable to connect to a new or existing group host process, // When we are unable to connect to a new or existing group host process,
// then we'll consider the startup failed and we'll allow the initialization // then we'll consider the startup failed and we'll allow the initialization
// process to terminate. // process to terminate.
+4 -4
View File
@@ -40,7 +40,7 @@
*/ */
class HostProcess { class HostProcess {
public: public:
virtual ~HostProcess(){}; virtual ~HostProcess() noexcept;
/** /**
* Return the full path to the host application in use. The host application * Return the full path to the host application in use. The host application
@@ -53,7 +53,7 @@ class HostProcess {
* Return true if the host process is still running. Used during startup to * Return true if the host process is still running. Used during startup to
* abort connecting to sockets if the Wine process has crashed. * abort connecting to sockets if the Wine process has crashed.
*/ */
virtual bool running() = 0; virtual bool running() noexcept = 0;
/** /**
* Kill the process or cause the plugin that's being hosted to exit. * Kill the process or cause the plugin that's being hosted to exit.
@@ -133,7 +133,7 @@ class IndividualHost : public HostProcess {
Sockets& sockets); Sockets& sockets);
boost::filesystem::path path() override; boost::filesystem::path path() override;
bool running() override; bool running() noexcept override;
void terminate() override; void terminate() override;
private: private:
@@ -180,7 +180,7 @@ class GroupHost : public HostProcess {
std::string group_name); std::string group_name);
boost::filesystem::path path() override; boost::filesystem::path path() override;
bool running() override; bool running() noexcept override;
void terminate() override; void terminate() override;
private: private: