DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 4344309ed034689f9b74e78741a90286701c07f7
parent 80e10283657e0eb03883fefb41eb4c9c0585e7ad
Author: falkTX <falktx@gmail.com>
Date:   Fri, 25 Apr 2014 20:18:30 +0100

Rework base DSP class

Diffstat:
Mdgl/Base.hpp | 49+++----------------------------------------------
Mdistrho/DistrhoPlugin.hpp | 1+
Mdistrho/DistrhoUI.hpp | 1+
Mdistrho/src/DistrhoDefines.h | 74+++++++++++++++-----------------------------------------------------------
Adistrho/src/DistrhoPluginChecks.h | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdistrho/src/DistrhoPluginInternal.hpp | 194++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
6 files changed, 198 insertions(+), 185 deletions(-)

diff --git a/dgl/Base.hpp b/dgl/Base.hpp @@ -17,42 +17,9 @@ #ifndef DGL_BASE_HPP_INCLUDED #define DGL_BASE_HPP_INCLUDED -/* Compatibility with non-clang compilers */ -#ifndef __has_feature -# define __has_feature(x) 0 -#endif -#ifndef __has_extension -# define __has_extension __has_feature -#endif - -/* Check OS */ -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -# define DGL_OS_WINDOWS 1 -#elif defined(__APPLE__) -# define DGL_OS_MAC 1 -#elif defined(__HAIKU__) -# define DGL_OS_HAIKU 1 -#elif defined(__linux__) || defined(__linux) -# define DGL_OS_LINUX 1 -#endif +#include "../distrho/src/DistrhoDefines.h" -/* Check for C++11 support */ -#if defined(HAVE_CPP11_SUPPORT) -# define PROPER_CPP11_SUPPORT -#elif __cplusplus >= 201103L || (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405) || __has_extension(cxx_noexcept) -# define PROPER_CPP11_SUPPORT -# if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || ! __has_extension(cxx_override_control) -# define override // gcc4.7+ only -# define final // gcc4.7+ only -# endif -#endif - -#ifndef PROPER_CPP11_SUPPORT -# define noexcept throw() -# define override -# define final -# define nullptr (0) -#endif +// ----------------------------------------------------------------------- /* Define namespace */ #ifndef DGL_NAMESPACE @@ -64,7 +31,7 @@ #define USE_NAMESPACE_DGL using namespace DGL_NAMESPACE; /* GL includes */ -#ifdef DGL_OS_MAC +#ifdef DISTRHO_OS_MAC # include <OpenGL/gl.h> #else # include <GL/gl.h> @@ -137,16 +104,6 @@ enum Modifier { MODIFIER_SUPER = 1 << 3 /**< Mod4/Command/Windows key */ }; -/* - * Cross-platform sleep function. - */ -void sleep(unsigned int secs); - -/* - * Cross-platform msleep function. - */ -void msleep(unsigned int msecs); - // ----------------------------------------------------------------------- END_NAMESPACE_DGL diff --git a/distrho/DistrhoPlugin.hpp b/distrho/DistrhoPlugin.hpp @@ -18,6 +18,7 @@ #define DISTRHO_PLUGIN_HPP_INCLUDED #include "DistrhoUtils.hpp" +#include "src/DistrhoPluginChecks.h" #include <cmath> diff --git a/distrho/DistrhoUI.hpp b/distrho/DistrhoUI.hpp @@ -18,6 +18,7 @@ #define DISTRHO_UI_HPP_INCLUDED #include "DistrhoUtils.hpp" +#include "src/DistrhoPluginChecks.h" #include "../dgl/Widget.hpp" diff --git a/distrho/src/DistrhoDefines.h b/distrho/src/DistrhoDefines.h @@ -17,48 +17,6 @@ #ifndef DISTRHO_DEFINES_H_INCLUDED #define DISTRHO_DEFINES_H_INCLUDED -#include "DistrhoPluginInfo.h" - -#ifndef DISTRHO_PLUGIN_NAME -# error DISTRHO_PLUGIN_NAME undefined! -#endif - -#ifndef DISTRHO_PLUGIN_HAS_UI -# error DISTRHO_PLUGIN_HAS_UI undefined! -#endif - -#ifndef DISTRHO_PLUGIN_IS_SYNTH -# error DISTRHO_PLUGIN_IS_SYNTH undefined! -#endif - -#ifndef DISTRHO_PLUGIN_NUM_INPUTS -# error DISTRHO_PLUGIN_NUM_INPUTS undefined! -#endif - -#ifndef DISTRHO_PLUGIN_NUM_OUTPUTS -# error DISTRHO_PLUGIN_NUM_OUTPUTS undefined! -#endif - -#ifndef DISTRHO_PLUGIN_WANT_LATENCY -# error DISTRHO_PLUGIN_WANT_LATENCY undefined! -#endif - -#ifndef DISTRHO_PLUGIN_WANT_PROGRAMS -# error DISTRHO_PLUGIN_WANT_PROGRAMS undefined! -#endif - -#ifndef DISTRHO_PLUGIN_WANT_STATE -# error DISTRHO_PLUGIN_WANT_STATE undefined! -#endif - -#ifndef DISTRHO_PLUGIN_WANT_TIMEPOS -# error DISTRHO_PLUGIN_WANT_TIMEPOS undefined! -#endif - -#ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS -# define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 -#endif - /* Compatibility with non-clang compilers */ #ifndef __has_feature # define __has_feature(x) 0 @@ -123,26 +81,26 @@ /* Define DISTRHO_DECLARE_NON_COPY_CLASS */ #ifdef DISTRHO_PROPER_CPP11_SUPPORT # define DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) \ -private: \ - ClassName(ClassName&) = delete; \ - ClassName(const ClassName&) = delete; \ - ClassName& operator=(ClassName&) = delete; \ +private: \ + ClassName(ClassName&) = delete; \ + ClassName(const ClassName&) = delete; \ + ClassName& operator=(ClassName&) = delete ; \ ClassName& operator=(const ClassName&) = delete; #else # define DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) \ -private: \ - ClassName(ClassName&); \ - ClassName(const ClassName&); \ - ClassName& operator=(ClassName&); \ +private: \ + ClassName(ClassName&); \ + ClassName(const ClassName&); \ + ClassName& operator=(ClassName&); \ ClassName& operator=(const ClassName&); #endif /* Define DISTRHO_DECLARE_NON_COPY_STRUCT */ #ifdef DISTRHO_PROPER_CPP11_SUPPORT # define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) \ - StructName(StructName&) = delete; \ - StructName(const StructName&) = delete; \ - StructName& operator=(StructName&) = delete; \ + StructName(StructName&) = delete; \ + StructName(const StructName&) = delete; \ + StructName& operator=(StructName&) = delete; \ StructName& operator=(const StructName&) = delete; #else # define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) @@ -150,14 +108,14 @@ private: \ /* Define DISTRHO_PREVENT_HEAP_ALLOCATION */ #ifdef DISTRHO_PROPER_CPP11_SUPPORT -# define DISTRHO_PREVENT_HEAP_ALLOCATION \ -private: \ +# define DISTRHO_PREVENT_HEAP_ALLOCATION \ +private: \ static void* operator new(size_t) = delete; \ static void operator delete(void*) = delete; #else # define DISTRHO_PREVENT_HEAP_ALLOCATION \ -private: \ - static void* operator new(size_t); \ +private: \ + static void* operator new(size_t); \ static void operator delete(void*); #endif @@ -175,8 +133,6 @@ private: \ # define USE_NAMESPACE_DISTRHO #endif -#define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" - /* Useful typedefs */ typedef unsigned char uchar; typedef unsigned long int ulong; diff --git a/distrho/src/DistrhoPluginChecks.h b/distrho/src/DistrhoPluginChecks.h @@ -0,0 +1,64 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_PLUGIN_CHECKS_H_INCLUDED +#define DISTRHO_PLUGIN_CHECKS_H_INCLUDED + +#include "DistrhoPluginInfo.h" + +#ifndef DISTRHO_PLUGIN_NAME +# error DISTRHO_PLUGIN_NAME undefined! +#endif + +#ifndef DISTRHO_PLUGIN_HAS_UI +# error DISTRHO_PLUGIN_HAS_UI undefined! +#endif + +#ifndef DISTRHO_PLUGIN_IS_SYNTH +# error DISTRHO_PLUGIN_IS_SYNTH undefined! +#endif + +#ifndef DISTRHO_PLUGIN_NUM_INPUTS +# error DISTRHO_PLUGIN_NUM_INPUTS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_NUM_OUTPUTS +# error DISTRHO_PLUGIN_NUM_OUTPUTS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_WANT_LATENCY +# error DISTRHO_PLUGIN_WANT_LATENCY undefined! +#endif + +#ifndef DISTRHO_PLUGIN_WANT_PROGRAMS +# error DISTRHO_PLUGIN_WANT_PROGRAMS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_WANT_STATE +# error DISTRHO_PLUGIN_WANT_STATE undefined! +#endif + +#ifndef DISTRHO_PLUGIN_WANT_TIMEPOS +# error DISTRHO_PLUGIN_WANT_TIMEPOS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +# define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 +#endif + +#define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" + +#endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp @@ -77,11 +77,11 @@ struct Plugin::PrivateData { bufferSize(d_lastBufferSize), sampleRate(d_lastSampleRate) { - assert(bufferSize != 0); - assert(sampleRate != 0.0); + DISTRHO_SAFE_ASSERT(bufferSize != 0); + DISTRHO_SAFE_ASSERT(sampleRate != 0.0); } - ~PrivateData() + ~PrivateData() noexcept { if (parameters != nullptr) { @@ -117,10 +117,8 @@ public: : fPlugin(createPlugin()), fData((fPlugin != nullptr) ? fPlugin->pData : nullptr) { - assert(fPlugin != nullptr); - - if (fPlugin == nullptr) - return; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) fPlugin->d_initParameter(i, fData->parameters[i]); @@ -145,32 +143,44 @@ public: const char* getName() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getName() : ""; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->d_getName(); } const char* getLabel() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getLabel() : ""; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->d_getLabel(); } const char* getMaker() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getMaker() : ""; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->d_getMaker(); } const char* getLicense() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getLicense() : ""; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->d_getLicense(); } uint32_t getVersion() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getVersion() : 1000; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0); + + return fPlugin->d_getVersion(); } long getUniqueId() const noexcept { - return (fPlugin != nullptr) ? fPlugin->d_getUniqueId() : 0; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0); + + return fPlugin->d_getUniqueId(); } void* getInstancePointer() const noexcept @@ -183,19 +193,24 @@ public: #if DISTRHO_PLUGIN_WANT_LATENCY uint32_t getLatency() const noexcept { - return (fData != nullptr) ? fData->latency : 0; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->latency; } #endif uint32_t getParameterCount() const noexcept { - return (fData != nullptr) ? fData->parameterCount : 0; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->parameterCount; } uint32_t getParameterHints(const uint32_t index) const noexcept { - assert(index < fData->parameterCount); - return (fData != nullptr && index < fData->parameterCount) ? fData->parameters[index].hints : 0x0; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, 0x0); + + return fData->parameters[index].hints; } bool isParameterOutput(const uint32_t index) const noexcept @@ -205,100 +220,117 @@ public: const d_string& getParameterName(const uint32_t index) const noexcept { - assert(index < fData->parameterCount); - return (fData != nullptr && index < fData->parameterCount) ? fData->parameters[index].name : sFallbackString; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].name; } const d_string& getParameterSymbol(const uint32_t index) const noexcept { - assert(index < fData->parameterCount); - return (fData != nullptr && index < fData->parameterCount) ? fData->parameters[index].symbol : sFallbackString; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].symbol; } const d_string& getParameterUnit(const uint32_t index) const noexcept { - assert(index < fData->parameterCount); - return (fData != nullptr && index < fData->parameterCount) ? fData->parameters[index].unit : sFallbackString; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].unit; } const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept { - assert(index < fData->parameterCount); - return (fData != nullptr && index < fData->parameterCount) ? fData->parameters[index].ranges : sFallbackRanges; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackRanges); + + return fData->parameters[index].ranges; } - float getParameterValue(const uint32_t index) const noexcept + float getParameterValue(const uint32_t index) const { - assert(index < fData->parameterCount); - return (fPlugin != nullptr && index < fData->parameterCount) ? fPlugin->d_getParameterValue(index) : 0.0f; + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0.0f); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, 0.0f); + + return fPlugin->d_getParameterValue(index); } void setParameterValue(const uint32_t index, const float value) { - assert(index < fData->parameterCount); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount,); - if (fPlugin != nullptr && index < fData->parameterCount) - fPlugin->d_setParameterValue(index, value); + fPlugin->d_setParameterValue(index, value); } #if DISTRHO_PLUGIN_WANT_PROGRAMS uint32_t getProgramCount() const noexcept { - return (fData != nullptr) ? fData->programCount : 0; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->programCount; } const d_string& getProgramName(const uint32_t index) const noexcept { - assert(index < fData->programCount); - return (fData != nullptr && index < fData->programCount) ? fData->programNames[index] : sFallbackString; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->programCount, sFallbackString); + + return fData->programNames[index]; } void setProgram(const uint32_t index) { - assert(index < fData->programCount); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->programCount,); - if (fPlugin != nullptr && index < fData->programCount) - fPlugin->d_setProgram(index); + fPlugin->d_setProgram(index); } #endif #if DISTRHO_PLUGIN_WANT_STATE - bool wantsStateKey(const char* const key) const noexcept + uint32_t getStateCount() const noexcept { - for (uint32_t i=0; i < fData->stateCount; ++i) - { - if (fData->stateKeys[i] == key) - return true; - } + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); - return false; + return fData->stateCount; } - uint32_t getStateCount() const noexcept + const d_string& getStateKey(const uint32_t index) const noexcept { - return fData != nullptr ? fData->stateCount : 0; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount, sFallbackString); + + return fData->stateKeys[index]; } - const d_string& getStateKey(const uint32_t index) const noexcept + void setState(const char* const key, const char* const value) { - assert(index < fData->stateCount); - return (fData != nullptr && index < fData->stateCount) ? fData->stateKeys[index] : sFallbackString; + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount,); + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr,); + + fPlugin->d_setState(key, value); } - void setState(const char* const key, const char* const value) + bool wantStateKey(const char* const key) const noexcept { - assert(key != nullptr && value != nullptr); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, false); + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', false); - if (fPlugin != nullptr && key != nullptr && value != nullptr) - fPlugin->d_setState(key, value); + for (uint32_t i=0; i < fData->stateCount; ++i) + { + if (fData->stateKeys[i] == key) + return true; + } + + return false; } #endif #if DISTRHO_PLUGIN_WANT_TIMEPOS - void setTimePos(const TimePos& timePos) + void setTimePos(const TimePos& timePos) noexcept { - if (fData != nullptr) - std::memcpy(&fData->timePos, &timePos, sizeof(TimePos)); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + + std::memcpy(&fData->timePos, &timePos, sizeof(TimePos)); } #endif @@ -306,44 +338,47 @@ public: void activate() { - if (fPlugin != nullptr) - fPlugin->d_activate(); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + fPlugin->d_activate(); } void deactivate() { - if (fPlugin != nullptr) - fPlugin->d_deactivate(); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + fPlugin->d_deactivate(); } #if DISTRHO_PLUGIN_IS_SYNTH void run(float** const inputs, float** const outputs, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) { - if (fPlugin != nullptr) - fPlugin->d_run(inputs, outputs, frames, midiEvents, midiEventCount); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + fPlugin->d_run(inputs, outputs, frames, midiEvents, midiEventCount); } #else void run(float** const inputs, float** const outputs, const uint32_t frames) { - if (fPlugin != nullptr) - fPlugin->d_run(inputs, outputs, frames); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + fPlugin->d_run(inputs, outputs, frames); } #endif // ------------------------------------------------------------------- void setBufferSize(const uint32_t bufferSize, bool doCallback = false) { - assert(bufferSize >= 2); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT(bufferSize >= 2); - if (fData != nullptr) - { - if (doCallback && fData->bufferSize == bufferSize) - doCallback = false; + if (fData->bufferSize == bufferSize) + return; - fData->bufferSize = bufferSize; - } + fData->bufferSize = bufferSize; - if (fPlugin != nullptr && doCallback) + if (doCallback) { fPlugin->d_deactivate(); fPlugin->d_bufferSizeChanged(bufferSize); @@ -353,17 +388,16 @@ public: void setSampleRate(const double sampleRate, bool doCallback = false) { - assert(sampleRate > 0.0); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT(sampleRate > 0.0); - if (fData != nullptr) - { - if (doCallback && fData->sampleRate == sampleRate) - doCallback = false; + if (fData->sampleRate == sampleRate) + return; - fData->sampleRate = sampleRate; - } + fData->sampleRate = sampleRate; - if (fPlugin != nullptr && doCallback) + if (doCallback) { fPlugin->d_deactivate(); fPlugin->d_sampleRateChanged(sampleRate);