From fec3f118f20f2b777f2e4aca32f1f2e0a60e5104 Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 23 Mar 2016 09:05:42 +0100 Subject: [PATCH] Update DPF --- dpf/README.md | 1 + dpf/distrho/DistrhoUI.hpp | 13 +++++++++-- dpf/distrho/extra/ExternalWindow.hpp | 1 + dpf/distrho/extra/Mutex.hpp | 10 ++++++-- dpf/distrho/extra/Thread.hpp | 2 +- dpf/distrho/src/DistrhoPluginLV2.cpp | 6 ++--- dpf/distrho/src/DistrhoUI.cpp | 20 +++++++++++----- dpf/distrho/src/DistrhoUIInternal.hpp | 33 +++++++++++++++++---------- dpf/distrho/src/DistrhoUILV2.cpp | 9 ++++---- 9 files changed, 65 insertions(+), 30 deletions(-) diff --git a/dpf/README.md b/dpf/README.md index a564328..2464ac3 100644 --- a/dpf/README.md +++ b/dpf/README.md @@ -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:
+ - [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) diff --git a/dpf/distrho/DistrhoUI.hpp b/dpf/distrho/DistrhoUI.hpp index debbff1..da8db41 100644 --- a/dpf/distrho/DistrhoUI.hpp +++ b/dpf/distrho/DistrhoUI.hpp @@ -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: diff --git a/dpf/distrho/extra/ExternalWindow.hpp b/dpf/distrho/extra/ExternalWindow.hpp index e3e4bcf..392a57e 100644 --- a/dpf/distrho/extra/ExternalWindow.hpp +++ b/dpf/distrho/extra/ExternalWindow.hpp @@ -21,6 +21,7 @@ #ifdef DISTRHO_OS_UNIX # include +# include # include # include #else diff --git a/dpf/distrho/extra/Mutex.hpp b/dpf/distrho/extra/Mutex.hpp index 3abd478..14a5c6e 100644 --- a/dpf/distrho/extra/Mutex.hpp +++ b/dpf/distrho/extra/Mutex.hpp @@ -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); diff --git a/dpf/distrho/extra/Thread.hpp b/dpf/distrho/extra/Thread.hpp index f2abb76..0352c34 100644 --- a/dpf/distrho/extra/Thread.hpp +++ b/dpf/distrho/extra/Thread.hpp @@ -37,7 +37,7 @@ protected: * Constructor. */ Thread(const char* const threadName = nullptr) noexcept - : fLock(), + : fLock(false), fName(threadName), #ifdef PTW32_DLLPORT fHandle({nullptr, 0}), diff --git a/dpf/distrho/src/DistrhoPluginLV2.cpp b/dpf/distrho/src/DistrhoPluginLV2.cpp index 8801fb9..907d882 100644 --- a/dpf/distrho/src/DistrhoPluginLV2.cpp +++ b/dpf/distrho/src/DistrhoPluginLV2.cpp @@ -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; diff --git a/dpf/distrho/src/DistrhoUI.cpp b/dpf/distrho/src/DistrhoUI.cpp index aa20967..a466309 100644 --- a/dpf/distrho/src/DistrhoUI.cpp +++ b/dpf/distrho/src/DistrhoUI.cpp @@ -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 /* ------------------------------------------------------------------------------------------------------------ diff --git a/dpf/distrho/src/DistrhoUIInternal.hpp b/dpf/distrho/src/DistrhoUIInternal.hpp index 4034081..f771781 100644 --- a/dpf/distrho/src/DistrhoUIInternal.hpp +++ b/dpf/distrho/src/DistrhoUIInternal.hpp @@ -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 } // ------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoUILV2.cpp b/dpf/distrho/src/DistrhoUILV2.cpp index eda57ca..7eaec20 100644 --- a/dpf/distrho/src/DistrhoUILV2.cpp +++ b/dpf/distrho/src/DistrhoUILV2.cpp @@ -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)