diff --git a/dgl/ImageKnob.hpp b/dgl/ImageKnob.hpp index b9a62532..a7a7e69e 100644 --- a/dgl/ImageKnob.hpp +++ b/dgl/ImageKnob.hpp @@ -76,6 +76,7 @@ private: float fValue; float fValueDef; float fValueTmp; + bool fUsingDefault; bool fUsingLog; Orientation fOrientation; diff --git a/dgl/src/ImageKnob.cpp b/dgl/src/ImageKnob.cpp index 3953646c..33a1b8ab 100644 --- a/dgl/src/ImageKnob.cpp +++ b/dgl/src/ImageKnob.cpp @@ -32,6 +32,7 @@ ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation fValue(0.5f), fValueDef(fValue), fValueTmp(fValue), + fUsingDefault(false), fUsingLog(false), fOrientation(orientation), fRotationAngle(0), @@ -58,6 +59,7 @@ ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation fValue(0.5f), fValueDef(fValue), fValueTmp(fValue), + fUsingDefault(false), fUsingLog(false), fOrientation(orientation), fRotationAngle(0), @@ -84,6 +86,7 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob) fValue(imageKnob.fValue), fValueDef(imageKnob.fValueDef), fValueTmp(fValue), + fUsingDefault(imageKnob.fUsingDefault), fUsingLog(imageKnob.fUsingLog), fOrientation(imageKnob.fOrientation), fRotationAngle(imageKnob.fRotationAngle), @@ -131,6 +134,7 @@ float ImageKnob::getValue() const noexcept void ImageKnob::setDefault(float value) noexcept { fValueDef = value; + fUsingDefault = true; } void ImageKnob::setRange(float min, float max) noexcept @@ -162,11 +166,6 @@ void ImageKnob::setRange(float min, float max) noexcept } } - if (fValueDef < min) - fValueDef = min; - else if (fValueDef > max) - fValueDef = max; - fMinimum = min; fMaximum = max; } @@ -313,7 +312,7 @@ bool ImageKnob::onMouse(const MouseEvent& ev) if (! contains(ev.pos)) return false; - if (ev.mod & MODIFIER_SHIFT) + if ((ev.mod & MODIFIER_SHIFT) != 0 && fUsingDefault) { setValue(fValueDef); fValueTmp = fValue; diff --git a/distrho/src/DistrhoPlugin.cpp b/distrho/src/DistrhoPlugin.cpp index 7e9f382c..f1b079b9 100644 --- a/distrho/src/DistrhoPlugin.cpp +++ b/distrho/src/DistrhoPlugin.cpp @@ -80,6 +80,9 @@ double Plugin::d_getSampleRate() const noexcept #if DISTRHO_PLUGIN_WANT_TIMEPOS const TimePos& Plugin::d_getTimePos() const noexcept { + // timePos outside run() may not be valid + DISTRHO_SAFE_ASSERT(pData->isProcessing); + return pData->timePos; } #endif diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp index 608a479c..a604c239 100644 --- a/distrho/src/DistrhoPluginInternal.hpp +++ b/distrho/src/DistrhoPluginInternal.hpp @@ -36,6 +36,8 @@ extern double d_lastSampleRate; // Plugin private data struct Plugin::PrivateData { + bool isProcessing; + uint32_t parameterCount; Parameter* parameters; @@ -61,7 +63,8 @@ struct Plugin::PrivateData { double sampleRate; PrivateData() noexcept - : parameterCount(0), + : isProcessing(false), + parameterCount(0), parameters(nullptr), #if DISTRHO_PLUGIN_WANT_PROGRAMS programCount(0), @@ -353,18 +356,25 @@ public: #if DISTRHO_PLUGIN_IS_SYNTH void run(const float** const inputs, float** const outputs, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + fData->isProcessing = true; fPlugin->d_run(inputs, outputs, frames, midiEvents, midiEventCount); + fData->isProcessing = false; } #else void run(const float** const inputs, float** const outputs, const uint32_t frames) { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + fData->isProcessing = true; fPlugin->d_run(inputs, outputs, frames); + fData->isProcessing = false; } #endif + // ------------------------------------------------------------------- void setBufferSize(const uint32_t bufferSize, bool doCallback = false)