diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp index 7866f594..9091763d 100644 --- a/distrho/src/DistrhoPluginJack.cpp +++ b/distrho/src/DistrhoPluginJack.cpp @@ -16,32 +16,91 @@ #include "DistrhoPluginInternal.hpp" -#if ! DISTRHO_PLUGIN_HAS_UI -# error JACK export requires an UI +#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) +# undef DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_PLUGIN_HAS_UI 0 #endif -#include "DistrhoUIInternal.hpp" +#if DISTRHO_PLUGIN_HAS_UI +# include "DistrhoUIInternal.hpp" +#else +# include "extra/d_sleep.hpp" +#endif #include "jack/jack.h" #include "jack/midiport.h" #include "jack/transport.h" +#ifndef DISTRHO_OS_WINDOWS +# include +#endif + // ----------------------------------------------------------------------- START_NAMESPACE_DISTRHO -#if ! DISTRHO_PLUGIN_WANT_STATE +#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_WANT_STATE static const setStateFunc setStateCallback = nullptr; #endif // ----------------------------------------------------------------------- +static volatile bool gCloseSignalReceived = false; + +#ifdef DISTRHO_OS_WINDOWS +static BOOL WINAPI winSignalHandler(DWORD dwCtrlType) noexcept +{ + if (dwCtrlType == CTRL_C_EVENT) + { + gCloseSignalReceived = true; + return TRUE; + } + return FALSE; +} + +static void initSignalHandler() +{ + SetConsoleCtrlHandler(winSignalHandler, TRUE); +} +#else +static void closeSignalHandler(int) noexcept +{ + gCloseSignalReceived = true; +} + +static void initSignalHandler() +{ + struct sigaction sint; + struct sigaction sterm; + + sint.sa_handler = closeSignalHandler; + sint.sa_flags = SA_RESTART; + sint.sa_restorer = nullptr; + sigemptyset(&sint.sa_mask); + sigaction(SIGINT, &sint, nullptr); + + sterm.sa_handler = closeSignalHandler; + sterm.sa_flags = SA_RESTART; + sterm.sa_restorer = nullptr; + sigemptyset(&sterm.sa_mask); + sigaction(SIGTERM, &sterm, nullptr); +} +#endif + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_HAS_UI class PluginJack : public IdleCallback +#else +class PluginJack +#endif { public: PluginJack(jack_client_t* const client) : fPlugin(), +#if DISTRHO_PLUGIN_HAS_UI fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, nullptr, setSizeCallback, fPlugin.getInstancePointer()), +#endif fClient(client) { char strBuf[0xff+1]; @@ -71,7 +130,9 @@ public: if (fPlugin.getProgramCount() > 0) { fPlugin.setProgram(0); +# if DISTRHO_PLUGIN_HAS_UI fUI.programChanged(0); +# endif } #endif @@ -88,7 +149,9 @@ public: else { fLastOutputValues[i] = 0.0f; +# if DISTRHO_PLUGIN_HAS_UI fUI.parameterChanged(i, fPlugin.getParameterValue(i)); +# endif } } } @@ -104,12 +167,17 @@ public: jack_activate(fClient); +#if DISTRHO_PLUGIN_HAS_UI if (const char* const name = jack_get_client_name(fClient)) fUI.setWindowTitle(name); else fUI.setWindowTitle(fPlugin.getName()); fUI.exec(this); +#else + while (! gCloseSignalReceived) + d_sleep(1); +#endif } ~PluginJack() @@ -146,8 +214,12 @@ public: // ------------------------------------------------------------------- protected: +#if DISTRHO_PLUGIN_HAS_UI void idleCallback() override { + if (gCloseSignalReceived) + return fUI.quit(); + float value; for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) @@ -166,6 +238,7 @@ protected: fUI.exec_idle(); } +#endif void jackBufferSize(const jack_nframes_t nframes) { @@ -273,7 +346,9 @@ protected: { d_stderr("jack has shutdown, quitting now..."); fClient = nullptr; +#if DISTRHO_PLUGIN_HAS_UI fUI.quit(); +#endif } // ------------------------------------------------------------------- @@ -290,16 +365,20 @@ protected: } #endif +#if DISTRHO_PLUGIN_HAS_UI void setSize(const uint width, const uint height) { fUI.setWindowSize(width, height); } +#endif // ------------------------------------------------------------------- private: PluginExporter fPlugin; +#if DISTRHO_PLUGIN_HAS_UI UIExporter fUI; +#endif jack_client_t* fClient; @@ -359,10 +438,12 @@ private: } #endif +#if DISTRHO_PLUGIN_HAS_UI static void setSizeCallback(void* ptr, uint width, uint height) { uiPtr->setSize(width, height); } +#endif #undef uiPtr }; @@ -422,9 +503,13 @@ int main() USE_NAMESPACE_DISTRHO; + initSignalHandler(); + d_lastBufferSize = jack_get_buffer_size(client); d_lastSampleRate = jack_get_sample_rate(client); +#if DISTRHO_PLUGIN_HAS_UI d_lastUiSampleRate = d_lastSampleRate; +#endif const PluginJack p(client);