| @@ -17,6 +17,7 @@ It uses the same format as the JACK Transport API, making porting some code easi | |||
| List of plugins made with DPF:<br/> | |||
| - [DISTRHO glBars](https://github.com/DISTRHO/glBars) | |||
| - [DISTRHO Kars](https://github.com/DISTRHO/Kars) | |||
| - [DISTRHO Mini-Series](https://github.com/DISTRHO/Mini-Series) | |||
| - [DISTRHO MVerb](https://github.com/DISTRHO/MVerb) | |||
| @@ -109,16 +109,25 @@ public: | |||
| void* getPluginInstancePointer() const noexcept; | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI && DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * External embeddable UI helpers */ | |||
| * External UI helpers */ | |||
| /** | |||
| Get the bundle path that will be used for the next UI. | |||
| @note: This function is only valid during createUI(), | |||
| it will return null when called from anywhere else. | |||
| */ | |||
| static const char* getNextBundlePath() noexcept; | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| /** | |||
| Get the Window Id that will be used for the next created window. | |||
| @note: This function is only valid during createUI(), | |||
| it will return 0 when called from anywhere else. | |||
| */ | |||
| static uintptr_t getNextWindowId() noexcept; | |||
| # endif | |||
| #endif | |||
| protected: | |||
| @@ -21,6 +21,7 @@ | |||
| #ifdef DISTRHO_OS_UNIX | |||
| # include <cerrno> | |||
| # include <signal.h> | |||
| # include <sys/wait.h> | |||
| # include <unistd.h> | |||
| #else | |||
| @@ -37,10 +37,15 @@ public: | |||
| /* | |||
| * Constructor. | |||
| */ | |||
| Mutex() noexcept | |||
| Mutex(bool inheritPriority = true) noexcept | |||
| : fMutex() | |||
| { | |||
| pthread_mutex_init(&fMutex, nullptr); | |||
| pthread_mutexattr_t atts; | |||
| pthread_mutexattr_init(&atts); | |||
| pthread_mutexattr_setprotocol(&atts, inheritPriority ? PTHREAD_PRIO_INHERIT : PTHREAD_PRIO_NONE); | |||
| pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_NORMAL); | |||
| pthread_mutex_init(&fMutex, &atts); | |||
| pthread_mutexattr_destroy(&atts); | |||
| } | |||
| /* | |||
| @@ -104,6 +109,7 @@ public: | |||
| #else | |||
| pthread_mutexattr_t atts; | |||
| pthread_mutexattr_init(&atts); | |||
| pthread_mutexattr_setprotocol(&atts, PTHREAD_PRIO_INHERIT); | |||
| pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_RECURSIVE); | |||
| pthread_mutex_init(&fMutex, &atts); | |||
| pthread_mutexattr_destroy(&atts); | |||
| @@ -37,7 +37,7 @@ protected: | |||
| * Constructor. | |||
| */ | |||
| Thread(const char* const threadName = nullptr) noexcept | |||
| : fLock(), | |||
| : fLock(false), | |||
| fName(threadName), | |||
| #ifdef PTW32_DLLPORT | |||
| fHandle({nullptr, 0}), | |||
| @@ -378,7 +378,7 @@ public: | |||
| if (fLastPositionData.barBeat >= 0.0f) | |||
| { | |||
| const double rest = std::fmod(fLastPositionData.barBeat, 1.0); | |||
| const double rest = std::fmod(fLastPositionData.barBeat, 1.0f); | |||
| fTimePosition.bbt.beat = fLastPositionData.barBeat-rest+1.0; | |||
| fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; | |||
| } | |||
| @@ -554,9 +554,9 @@ public: | |||
| if (fLastPositionData.barBeat >= 0.0f) | |||
| { | |||
| fLastPositionData.barBeat = std::fmod(fLastPositionData.barBeat+addedBarBeats, | |||
| fLastPositionData.beatsPerBar); | |||
| (double)fLastPositionData.beatsPerBar); | |||
| const double rest = std::fmod(fLastPositionData.barBeat, 1.0); | |||
| const double rest = std::fmod(fLastPositionData.barBeat, 1.0f); | |||
| fTimePosition.bbt.beat = fLastPositionData.barBeat-rest+1.0; | |||
| fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; | |||
| @@ -25,12 +25,13 @@ START_NAMESPACE_DISTRHO | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * Static data, see DistrhoUIInternal.hpp */ | |||
| double d_lastUiSampleRate = 0.0; | |||
| void* d_lastUiDspPtr = nullptr; | |||
| double d_lastUiSampleRate = 0.0; | |||
| void* d_lastUiDspPtr = nullptr; | |||
| #ifdef HAVE_DGL | |||
| Window* d_lastUiWindow = nullptr; | |||
| Window* d_lastUiWindow = nullptr; | |||
| #endif | |||
| uintptr_t g_nextWindowId = 0; | |||
| uintptr_t g_nextWindowId = 0; | |||
| const char* g_nextBundlePath = nullptr; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * UI */ | |||
| @@ -98,14 +99,21 @@ void* UI::getPluginInstancePointer() const noexcept | |||
| } | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI && DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * External embeddable UI helpers */ | |||
| * External UI helpers */ | |||
| const char* UI::getNextBundlePath() noexcept | |||
| { | |||
| return g_nextBundlePath; | |||
| } | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| uintptr_t UI::getNextWindowId() noexcept | |||
| { | |||
| return g_nextWindowId; | |||
| } | |||
| # endif | |||
| #endif | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| @@ -32,12 +32,13 @@ START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| // Static data, see DistrhoUI.cpp | |||
| extern double d_lastUiSampleRate; | |||
| extern void* d_lastUiDspPtr; | |||
| extern double d_lastUiSampleRate; | |||
| extern void* d_lastUiDspPtr; | |||
| #ifdef HAVE_DGL | |||
| extern Window* d_lastUiWindow; | |||
| extern Window* d_lastUiWindow; | |||
| #endif | |||
| extern uintptr_t g_nextWindowId; | |||
| extern uintptr_t g_nextWindowId; | |||
| extern const char* g_nextBundlePath; | |||
| // ----------------------------------------------------------------------- | |||
| // UI callbacks | |||
| @@ -199,13 +200,15 @@ private: | |||
| }; | |||
| #else | |||
| static inline | |||
| UI* createUiWrapper(void* const dspPtr, const uintptr_t winId) | |||
| UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const char* const bundlePath) | |||
| { | |||
| d_lastUiDspPtr = dspPtr; | |||
| g_nextWindowId = winId; | |||
| UI* const ret = createUI(); | |||
| d_lastUiDspPtr = nullptr; | |||
| g_nextWindowId = 0; | |||
| d_lastUiDspPtr = dspPtr; | |||
| g_nextWindowId = winId; | |||
| g_nextBundlePath = bundlePath; | |||
| UI* const ret = createUI(); | |||
| d_lastUiDspPtr = nullptr; | |||
| g_nextWindowId = 0; | |||
| g_nextBundlePath = nullptr; | |||
| return ret; | |||
| } | |||
| #endif | |||
| @@ -218,14 +221,15 @@ class UIExporter | |||
| public: | |||
| UIExporter(void* const ptr, const intptr_t winId, | |||
| const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const setSizeFunc setSizeCall, | |||
| void* const dspPtr = nullptr) | |||
| void* const dspPtr = nullptr, | |||
| const char* const bundlePath = nullptr) | |||
| #ifdef HAVE_DGL | |||
| : glApp(), | |||
| glWindow(glApp, winId, dspPtr), | |||
| fChangingSize(false), | |||
| fUI(glWindow.getUI()), | |||
| #else | |||
| : fUI(createUiWrapper(dspPtr, winId)), | |||
| : fUI(createUiWrapper(dspPtr, winId, bundlePath)), | |||
| #endif | |||
| fData((fUI != nullptr) ? fUI->pData : nullptr) | |||
| { | |||
| @@ -238,6 +242,11 @@ public: | |||
| fData->setStateCallbackFunc = setStateCall; | |||
| fData->sendNoteCallbackFunc = sendNoteCall; | |||
| fData->setSizeCallbackFunc = setSizeCall; | |||
| #ifdef HAVE_DGL | |||
| // unused | |||
| return; (void)bundlePath; | |||
| #endif | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| @@ -39,11 +39,11 @@ START_NAMESPACE_DISTRHO | |||
| class UiLv2 | |||
| { | |||
| public: | |||
| UiLv2(const intptr_t winId, | |||
| UiLv2(const char* const bundlePath, const intptr_t winId, | |||
| const LV2_Options_Option* options, const LV2_URID_Map* const uridMap, const LV2UI_Resize* const uiResz, const LV2UI_Touch* uiTouch, | |||
| const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, | |||
| LV2UI_Widget* const widget, void* const dspPtr) | |||
| : fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, dspPtr), | |||
| : fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, dspPtr, bundlePath), | |||
| fUridMap(uridMap), | |||
| fUiResize(uiResz), | |||
| fUiTouch(uiTouch), | |||
| @@ -319,7 +319,8 @@ private: | |||
| // ----------------------------------------------------------------------- | |||
| static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, const char*, LV2UI_Write_Function writeFunction, LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) | |||
| static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, const char* bundlePath, | |||
| LV2UI_Write_Function writeFunction, LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) | |||
| { | |||
| if (uri == nullptr || std::strcmp(uri, DISTRHO_PLUGIN_URI) != 0) | |||
| { | |||
| @@ -421,7 +422,7 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, | |||
| d_lastUiSampleRate = 44100.0; | |||
| } | |||
| return new UiLv2(winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, widget, instance); | |||
| return new UiLv2(bundlePath, winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, widget, instance); | |||
| } | |||
| #define uiPtr ((UiLv2*)ui) | |||