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)