@@ -255,7 +255,7 @@ jobs: | |||||
- name: Build plugins | - name: Build plugins | ||||
env: | env: | ||||
CFLAGS: -g | CFLAGS: -g | ||||
CXXFLAGS: -g | |||||
CXXFLAGS: -g -DDPF_ABORT_ON_ERROR | |||||
LDFLAGS: -static-libgcc -static-libstdc++ | LDFLAGS: -static-libgcc -static-libstdc++ | ||||
run: | | run: | | ||||
make features | make features | ||||
@@ -33,6 +33,7 @@ endif | |||||
BUILD_C_FLAGS += -I. | BUILD_C_FLAGS += -I. | ||||
BUILD_CXX_FLAGS += -I. -I$(DPF_PATH)/distrho -I$(DPF_PATH)/dgl | BUILD_CXX_FLAGS += -I. -I$(DPF_PATH)/distrho -I$(DPF_PATH)/dgl | ||||
BUILD_CXX_FLAGS += -Wno-pmf-conversions | |||||
ifeq ($(HAVE_ALSA),true) | ifeq ($(HAVE_ALSA),true) | ||||
BASE_FLAGS += -DHAVE_ALSA | BASE_FLAGS += -DHAVE_ALSA | ||||
@@ -52,7 +52,7 @@ public: | |||||
}; | }; | ||||
explicit ButtonEventHandler(SubWidget* self); | explicit ButtonEventHandler(SubWidget* self); | ||||
~ButtonEventHandler(); | |||||
virtual ~ButtonEventHandler(); | |||||
bool isActive() noexcept; | bool isActive() noexcept; | ||||
void setActive(bool active, bool sendCallback) noexcept; | void setActive(bool active, bool sendCallback) noexcept; | ||||
@@ -117,7 +117,7 @@ public: | |||||
explicit KnobEventHandler(SubWidget* self); | explicit KnobEventHandler(SubWidget* self); | ||||
explicit KnobEventHandler(SubWidget* self, const KnobEventHandler& other); | explicit KnobEventHandler(SubWidget* self, const KnobEventHandler& other); | ||||
KnobEventHandler& operator=(const KnobEventHandler& other); | KnobEventHandler& operator=(const KnobEventHandler& other); | ||||
~KnobEventHandler(); | |||||
virtual ~KnobEventHandler(); | |||||
// returns raw value, is assumed to be scaled if using log | // returns raw value, is assumed to be scaled if using log | ||||
float getValue() const noexcept; | float getValue() const noexcept; | ||||
@@ -154,6 +154,15 @@ private: | |||||
struct PrivateData; | struct PrivateData; | ||||
PrivateData* const pData; | PrivateData* const pData; | ||||
/* not for use */ | |||||
#ifdef DISTRHO_PROPER_CPP11_SUPPORT | |||||
KnobEventHandler(KnobEventHandler& other) = delete; | |||||
KnobEventHandler(const KnobEventHandler& other) = delete; | |||||
#else | |||||
KnobEventHandler(KnobEventHandler& other); | |||||
KnobEventHandler(const KnobEventHandler& other); | |||||
#endif | |||||
DISTRHO_LEAK_DETECTOR(KnobEventHandler) | DISTRHO_LEAK_DETECTOR(KnobEventHandler) | ||||
}; | }; | ||||
@@ -23,6 +23,11 @@ | |||||
#include "TopLevelWidget.hpp" | #include "TopLevelWidget.hpp" | ||||
#include "StandaloneWindow.hpp" | #include "StandaloneWindow.hpp" | ||||
#ifdef _MSC_VER | |||||
# pragma warning(push) | |||||
# pragma warning(disable:4661) /* instantiated template classes whose methods are defined elsewhere */ | |||||
#endif | |||||
#ifndef DGL_NO_SHARED_RESOURCES | #ifndef DGL_NO_SHARED_RESOURCES | ||||
# define NANOVG_DEJAVU_SANS_TTF "__dpf_dejavusans_ttf__" | # define NANOVG_DEJAVU_SANS_TTF "__dpf_dejavusans_ttf__" | ||||
#endif | #endif | ||||
@@ -964,4 +969,8 @@ typedef NanoSubWidget NanoWidget; | |||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL | ||||
#ifdef _MSC_VER | |||||
# pragma warning(pop) | |||||
#endif | |||||
#endif // DGL_NANO_WIDGET_HPP_INCLUDED | #endif // DGL_NANO_WIDGET_HPP_INCLUDED |
@@ -114,10 +114,10 @@ Color::Color(const Color& color1, const Color& color2, const float u) noexcept | |||||
interpolate(color2, u); | interpolate(color2, u); | ||||
} | } | ||||
Color Color::withAlpha(const float alpha) noexcept | |||||
Color Color::withAlpha(const float alpha2) noexcept | |||||
{ | { | ||||
Color color(*this); | Color color(*this); | ||||
color.alpha = alpha; | |||||
color.alpha = alpha2; | |||||
return color; | return color; | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
* Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
@@ -15,8 +15,10 @@ | |||||
*/ | */ | ||||
#ifdef _MSC_VER | #ifdef _MSC_VER | ||||
// instantiated template classes whose methods are defined elsewhere | |||||
# pragma warning(disable:4661) | |||||
# pragma warning(disable:4661) /* instantiated template classes whose methods are defined elsewhere */ | |||||
#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |||||
# pragma GCC diagnostic push | |||||
# pragma GCC diagnostic ignored "-Wconversion" | |||||
#endif | #endif | ||||
#include "../Geometry.hpp" | #include "../Geometry.hpp" | ||||
@@ -678,7 +678,7 @@ void Window::PrivateData::renderToPicture(const char* const filename, | |||||
GLubyte* const pixels = new GLubyte[width * height * 3 * sizeof(GLubyte)]; | GLubyte* const pixels = new GLubyte[width * height * 3 * sizeof(GLubyte)]; | ||||
glFlush(); | glFlush(); | ||||
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); | |||||
glReadPixels(0, 0, static_cast<GLsizei>(width), static_cast<GLsizei>(height), GL_RGB, GL_UNSIGNED_BYTE, pixels); | |||||
fprintf(f, "P3\n%d %d\n255\n", width, height); | fprintf(f, "P3\n%d %d\n255\n", width, height); | ||||
for (uint y = 0; y < height; y++) | for (uint y = 0; y < height; y++) | ||||
@@ -34,7 +34,9 @@ SubWidget::~SubWidget() | |||||
template<typename T> | template<typename T> | ||||
bool SubWidget::contains(const T x, const T y) const noexcept | bool SubWidget::contains(const T x, const T y) const noexcept | ||||
{ | { | ||||
return Rectangle<double>(0, 0, getWidth()-pData->margin.getX(), getHeight()-pData->margin.getY()).contains(x, y); | |||||
return Rectangle<double>(0, 0, | |||||
static_cast<double>(getWidth()) - pData->margin.getX(), | |||||
static_cast<double>(getHeight()) - pData->margin.getY()).contains(x, y); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -220,10 +220,10 @@ void Window::setSize(uint width, uint height) | |||||
{ | { | ||||
// fix width | // fix width | ||||
if (reqRatio > ratio) | if (reqRatio > ratio) | ||||
width = height * ratio; | |||||
width = static_cast<uint>(height * ratio + 0.5); | |||||
// fix height | // fix height | ||||
else | else | ||||
height = width / ratio; | |||||
height = static_cast<uint>(static_cast<double>(width) / ratio + 0.5); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -542,13 +542,13 @@ bool Window::PrivateData::openFileBrowser(const Window::FileBrowserOptions& opti | |||||
// set start directory in UTF-16 encoding | // set start directory in UTF-16 encoding | ||||
std::vector<WCHAR> startDirW; | std::vector<WCHAR> startDirW; | ||||
startDirW.resize(startDir.length() + 1); | startDirW.resize(startDir.length() + 1); | ||||
if (MultiByteToWideChar(CP_UTF8, 0, startDir.buffer(), -1, startDirW.data(), startDirW.size())) | |||||
if (MultiByteToWideChar(CP_UTF8, 0, startDir.buffer(), -1, startDirW.data(), static_cast<int>(startDirW.size()))) | |||||
ofn.lpstrInitialDir = startDirW.data(); | ofn.lpstrInitialDir = startDirW.data(); | ||||
// set title in UTF-16 encoding | // set title in UTF-16 encoding | ||||
std::vector<WCHAR> titleW; | std::vector<WCHAR> titleW; | ||||
titleW.resize(title.length() + 1); | titleW.resize(title.length() + 1); | ||||
if (MultiByteToWideChar(CP_UTF8, 0, title.buffer(), -1, titleW.data(), titleW.size())) | |||||
if (MultiByteToWideChar(CP_UTF8, 0, title.buffer(), -1, titleW.data(), static_cast<int>(titleW.size()))) | |||||
ofn.lpstrTitle = titleW.data(); | ofn.lpstrTitle = titleW.data(); | ||||
// prepare a buffer to receive the result | // prepare a buffer to receive the result | ||||
@@ -943,7 +943,7 @@ protected: | |||||
Initialize the parameter @a index.@n | Initialize the parameter @a index.@n | ||||
This function will be called once, shortly after the plugin is created. | This function will be called once, shortly after the plugin is created. | ||||
*/ | */ | ||||
virtual void initParameter(uint32_t index, Parameter& parameter) = 0; | |||||
virtual void initParameter(uint32_t index, Parameter& parameter); | |||||
/** | /** | ||||
Initialize the port group @a groupId.@n | Initialize the port group @a groupId.@n | ||||
@@ -967,7 +967,7 @@ protected: | |||||
This function will be called once, shortly after the plugin is created.@n | This function will be called once, shortly after the plugin is created.@n | ||||
Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. | Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. | ||||
*/ | */ | ||||
virtual void initState(uint32_t index, String& stateKey, String& defaultStateValue) = 0; | |||||
virtual void initState(uint32_t index, String& stateKey, String& defaultStateValue); | |||||
#endif | #endif | ||||
#if DISTRHO_PLUGIN_WANT_STATEFILES | #if DISTRHO_PLUGIN_WANT_STATEFILES | ||||
@@ -984,7 +984,7 @@ protected: | |||||
Get the current value of a parameter.@n | Get the current value of a parameter.@n | ||||
The host may call this function from any context, including realtime processing. | The host may call this function from any context, including realtime processing. | ||||
*/ | */ | ||||
virtual float getParameterValue(uint32_t index) const = 0; | |||||
virtual float getParameterValue(uint32_t index) const; | |||||
/** | /** | ||||
Change a parameter value.@n | Change a parameter value.@n | ||||
@@ -992,7 +992,7 @@ protected: | |||||
When a parameter is marked as automable, you must ensure no non-realtime operations are performed. | When a parameter is marked as automable, you must ensure no non-realtime operations are performed. | ||||
@note This function will only be called for parameter inputs. | @note This function will only be called for parameter inputs. | ||||
*/ | */ | ||||
virtual void setParameterValue(uint32_t index, float value) = 0; | |||||
virtual void setParameterValue(uint32_t index, float value); | |||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS | #if DISTRHO_PLUGIN_WANT_PROGRAMS | ||||
/** | /** | ||||
@@ -1000,7 +1000,7 @@ protected: | |||||
The host may call this function from any context, including realtime processing.@n | The host may call this function from any context, including realtime processing.@n | ||||
Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. | Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. | ||||
*/ | */ | ||||
virtual void loadProgram(uint32_t index) = 0; | |||||
virtual void loadProgram(uint32_t index); | |||||
#endif | #endif | ||||
#if DISTRHO_PLUGIN_WANT_FULL_STATE | #if DISTRHO_PLUGIN_WANT_FULL_STATE | ||||
@@ -1010,7 +1010,7 @@ protected: | |||||
Must be implemented by your plugin class if DISTRHO_PLUGIN_WANT_FULL_STATE is enabled. | Must be implemented by your plugin class if DISTRHO_PLUGIN_WANT_FULL_STATE is enabled. | ||||
@note The use of this function breaks compatibility with the DSSI format. | @note The use of this function breaks compatibility with the DSSI format. | ||||
*/ | */ | ||||
virtual String getState(const char* key) const = 0; | |||||
virtual String getState(const char* key) const; | |||||
#endif | #endif | ||||
#if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
@@ -1018,7 +1018,7 @@ protected: | |||||
Change an internal state @a key to @a value.@n | Change an internal state @a key to @a value.@n | ||||
Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. | Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. | ||||
*/ | */ | ||||
virtual void setState(const char* key, const char* value) = 0; | |||||
virtual void setState(const char* key, const char* value); | |||||
#endif | #endif | ||||
/* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
@@ -193,6 +193,12 @@ private: \ | |||||
# define DISTRHO_OS_SPLIT_STR ":" | # define DISTRHO_OS_SPLIT_STR ":" | ||||
#endif | #endif | ||||
/* MSVC warnings */ | |||||
#ifdef _MSC_VER | |||||
# define strdup _strdup | |||||
# pragma warning(disable:4244) /* possible loss of data */ | |||||
#endif | |||||
/* Useful typedefs */ | /* Useful typedefs */ | ||||
typedef unsigned char uchar; | typedef unsigned char uchar; | ||||
typedef unsigned short int ushort; | typedef unsigned short int ushort; | ||||
@@ -44,32 +44,42 @@ Plugin::Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCou | |||||
pData->audioPorts = new AudioPort[DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS]; | pData->audioPorts = new AudioPort[DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS]; | ||||
#endif | #endif | ||||
#ifdef DPF_ABORT_ON_ERROR | |||||
# define DPF_ABORT abort(); | |||||
#else | |||||
# define DPF_ABORT | |||||
#endif | |||||
if (parameterCount > 0) | if (parameterCount > 0) | ||||
{ | { | ||||
pData->parameterCount = parameterCount; | pData->parameterCount = parameterCount; | ||||
pData->parameters = new Parameter[parameterCount]; | pData->parameters = new Parameter[parameterCount]; | ||||
} | } | ||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
if (programCount > 0) | if (programCount > 0) | ||||
{ | { | ||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
pData->programCount = programCount; | pData->programCount = programCount; | ||||
pData->programNames = new String[programCount]; | pData->programNames = new String[programCount]; | ||||
} | |||||
#else | #else | ||||
DISTRHO_SAFE_ASSERT(programCount == 0); | |||||
d_stderr2("DPF warning: Plugins with programs must define `DISTRHO_PLUGIN_WANT_PROGRAMS` to 1"); | |||||
DPF_ABORT | |||||
#endif | #endif | ||||
} | |||||
#if DISTRHO_PLUGIN_WANT_STATE | |||||
if (stateCount > 0) | if (stateCount > 0) | ||||
{ | { | ||||
#if DISTRHO_PLUGIN_WANT_STATE | |||||
pData->stateCount = stateCount; | pData->stateCount = stateCount; | ||||
pData->stateKeys = new String[stateCount]; | pData->stateKeys = new String[stateCount]; | ||||
pData->stateDefValues = new String[stateCount]; | pData->stateDefValues = new String[stateCount]; | ||||
} | |||||
#else | #else | ||||
DISTRHO_SAFE_ASSERT(stateCount == 0); | |||||
d_stderr2("DPF warning: Plugins with state must define `DISTRHO_PLUGIN_WANT_STATE` to 1"); | |||||
DPF_ABORT | |||||
#endif | #endif | ||||
} | |||||
#undef DPF_ABORT | |||||
} | } | ||||
Plugin::~Plugin() | Plugin::~Plugin() | ||||
@@ -144,16 +154,48 @@ void Plugin::initAudioPort(bool input, uint32_t index, AudioPort& port) | |||||
} | } | ||||
} | } | ||||
void Plugin::initParameter(uint32_t, Parameter&) {} | |||||
void Plugin::initPortGroup(const uint32_t groupId, PortGroup& portGroup) | void Plugin::initPortGroup(const uint32_t groupId, PortGroup& portGroup) | ||||
{ | { | ||||
fillInPredefinedPortGroupData(groupId, portGroup); | fillInPredefinedPortGroupData(groupId, portGroup); | ||||
} | } | ||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
void Plugin::initProgramName(uint32_t, String&) {} | |||||
#endif | |||||
#if DISTRHO_PLUGIN_WANT_STATE | |||||
void Plugin::initState(uint32_t, String&, String&) {} | |||||
#endif | |||||
#if DISTRHO_PLUGIN_WANT_STATEFILES | |||||
bool Plugin::isStateFile(uint32_t) { return false; } | |||||
#endif | |||||
/* ------------------------------------------------------------------------------------------------------------ | |||||
* Init */ | |||||
float Plugin::getParameterValue(uint32_t) const { return 0.0f; } | |||||
void Plugin::setParameterValue(uint32_t, float) {} | |||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
void Plugin::loadProgram(uint32_t) {} | |||||
#endif | |||||
#if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
String Plugin::getState(const char*) const { return String(); } | |||||
#endif | |||||
#if DISTRHO_PLUGIN_WANT_STATE | |||||
void Plugin::setState(const char*, const char*) {} | |||||
#endif | |||||
/* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
* Callbacks (optional) */ | * Callbacks (optional) */ | ||||
void Plugin::bufferSizeChanged(uint32_t) {} | void Plugin::bufferSizeChanged(uint32_t) {} | ||||
void Plugin::sampleRateChanged(double) {} | |||||
void Plugin::sampleRateChanged(double) {} | |||||
// ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
@@ -87,6 +87,7 @@ | |||||
#ifndef DISTRHO_PLUGIN_WANT_FULL_STATE | #ifndef DISTRHO_PLUGIN_WANT_FULL_STATE | ||||
# define DISTRHO_PLUGIN_WANT_FULL_STATE 0 | # define DISTRHO_PLUGIN_WANT_FULL_STATE 0 | ||||
# define DISTRHO_PLUGIN_WANT_FULL_STATE_WAS_NOT_SET | |||||
#endif | #endif | ||||
#ifndef DISTRHO_PLUGIN_WANT_TIMEPOS | #ifndef DISTRHO_PLUGIN_WANT_TIMEPOS | ||||
@@ -146,8 +147,8 @@ | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Enable full state if plugin exports presets | // Enable full state if plugin exports presets | ||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS && DISTRHO_PLUGIN_WANT_STATE && ! DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
# warning Plugins with programs and state need to implement full state API too | |||||
#if DISTRHO_PLUGIN_WANT_PROGRAMS && DISTRHO_PLUGIN_WANT_STATE && defined(DISTRHO_PLUGIN_WANT_FULL_STATE_WAS_NOT_SET) | |||||
# warning Plugins with programs and state should implement full state API too | |||||
# undef DISTRHO_PLUGIN_WANT_FULL_STATE | # undef DISTRHO_PLUGIN_WANT_FULL_STATE | ||||
# define DISTRHO_PLUGIN_WANT_FULL_STATE 1 | # define DISTRHO_PLUGIN_WANT_FULL_STATE 1 | ||||
#endif | #endif | ||||
@@ -247,6 +247,85 @@ public: | |||||
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | ||||
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | ||||
/* Verify that virtual functions are overriden if parameters, programs or states are in use. | |||||
* This does not work on all compilers, but we use it purely as informational check anyway. */ | |||||
#if defined(__GNUC__) && !defined(__clang__) | |||||
# ifdef DPF_ABORT_ON_ERROR | |||||
# define DPF_ABORT abort(); | |||||
# else | |||||
# define DPF_ABORT | |||||
# endif | |||||
if (fData->parameterCount != 0) | |||||
{ | |||||
if ((void*)(fPlugin->*(&Plugin::initParameter)) == (void*)&Plugin::initParameter) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with parameters must implement `initParameter`"); | |||||
DPF_ABORT | |||||
} | |||||
if ((void*)(fPlugin->*(&Plugin::getParameterValue)) == (void*)&Plugin::getParameterValue) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with parameters must implement `getParameterValue`"); | |||||
DPF_ABORT | |||||
} | |||||
if ((void*)(fPlugin->*(&Plugin::setParameterValue)) == (void*)&Plugin::setParameterValue) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with parameters must implement `setParameterValue`"); | |||||
DPF_ABORT | |||||
} | |||||
} | |||||
# if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
if (fData->programCount != 0) | |||||
{ | |||||
if ((void*)(fPlugin->*(&Plugin::initProgramName)) == (void*)&Plugin::initProgramName) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with programs must implement `initProgramName`"); | |||||
DPF_ABORT | |||||
} | |||||
if ((void*)(fPlugin->*(&Plugin::loadProgram)) == (void*)&Plugin::loadProgram) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with programs must implement `loadProgram`"); | |||||
DPF_ABORT | |||||
} | |||||
} | |||||
# endif | |||||
# if DISTRHO_PLUGIN_WANT_STATE | |||||
if (fData->stateCount != 0) | |||||
{ | |||||
if ((void*)(fPlugin->*(&Plugin::initState)) == (void*)&Plugin::initState) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with state must implement `initState`"); | |||||
DPF_ABORT | |||||
} | |||||
if ((void*)(fPlugin->*(&Plugin::setState)) == (void*)&Plugin::setState) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with state must implement `setState`"); | |||||
DPF_ABORT | |||||
} | |||||
} | |||||
# endif | |||||
# if DISTRHO_PLUGIN_WANT_FULL_STATE | |||||
if (fData->stateCount != 0) | |||||
{ | |||||
if ((void*)(fPlugin->*(&Plugin::getState)) == (void*)&Plugin::getState) | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with full state must implement `getState`"); | |||||
DPF_ABORT | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
d_stderr2("DPF warning: Plugins with full state must have at least 1 state"); | |||||
DPF_ABORT | |||||
} | |||||
# endif | |||||
# undef DPF_ABORT | |||||
#endif | |||||
#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | #if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | ||||
{ | { | ||||
uint32_t j=0; | uint32_t j=0; | ||||
@@ -276,7 +355,7 @@ public: | |||||
portGroupIndices.erase(kPortGroupNone); | portGroupIndices.erase(kPortGroupNone); | ||||
if (const size_t portGroupSize = portGroupIndices.size()) | |||||
if (const uint32_t portGroupSize = static_cast<uint32_t>(portGroupIndices.size())) | |||||
{ | { | ||||
fData->portGroups = new PortGroupWithId[portGroupSize]; | fData->portGroups = new PortGroupWithId[portGroupSize]; | ||||
fData->portGroupCount = portGroupSize; | fData->portGroupCount = portGroupSize; | ||||
@@ -469,7 +469,7 @@ protected: | |||||
MidiEvent& midiEvent(midiEvents[midiEventCount++]); | MidiEvent& midiEvent(midiEvents[midiEventCount++]); | ||||
midiEvent.frame = jevent.time; | midiEvent.frame = jevent.time; | ||||
midiEvent.size = jevent.size; | |||||
midiEvent.size = static_cast<uint32_t>(jevent.size); | |||||
if (midiEvent.size > MidiEvent::kDataSize) | if (midiEvent.size > MidiEvent::kDataSize) | ||||
midiEvent.dataExt = jevent.buffer; | midiEvent.dataExt = jevent.buffer; | ||||
@@ -708,7 +708,7 @@ public: | |||||
const String& value(cit->second); | const String& value(cit->second); | ||||
// set msg size (key + value + separator + 2x null terminator) | // set msg size (key + value + separator + 2x null terminator) | ||||
const size_t msgSize = key.length()+value.length()+3; | |||||
const uint32_t msgSize = static_cast<uint32_t>(key.length()+value.length())+3U; | |||||
if (sizeof(LV2_Atom_Event) + msgSize > capacity - fEventsOutData.offset) | if (sizeof(LV2_Atom_Event) + msgSize > capacity - fEventsOutData.offset) | ||||
{ | { | ||||
@@ -285,11 +285,13 @@ protected: | |||||
tmpStr[std::strlen(key)] = '\0'; | tmpStr[std::strlen(key)] = '\0'; | ||||
// set msg size (key + separator + value + null terminator) | // set msg size (key + separator + value + null terminator) | ||||
const size_t msgSize = tmpStr.length() + 1U; | |||||
const uint32_t msgSize = static_cast<uint32_t>(tmpStr.length()) + 1U; | |||||
// reserve atom space | // reserve atom space | ||||
const size_t atomSize = sizeof(LV2_Atom) + msgSize; | |||||
const uint32_t atomSize = sizeof(LV2_Atom) + msgSize; | |||||
char* const atomBuf = (char*)malloc(atomSize); | char* const atomBuf = (char*)malloc(atomSize); | ||||
DISTRHO_SAFE_ASSERT_RETURN(atomBuf != nullptr,); | |||||
std::memset(atomBuf, 0, atomSize); | std::memset(atomBuf, 0, atomSize); | ||||
// set atom info | // set atom info | ||||
@@ -29,13 +29,10 @@ BUILD_CXX_FLAGS += -Wno-unused-parameter | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | TARGETS += jack | ||||
endif | |||||
TARGETS += ladspa | TARGETS += ladspa | ||||
TARGETS += lv2_dsp | TARGETS += lv2_dsp | ||||
TARGETS += vst | |||||
TARGETS += vst2 | |||||
all: $(TARGETS) | all: $(TARGETS) | ||||
@@ -221,6 +221,7 @@ void genlib_data_release(t_genlib_data *b) { | |||||
genlib_sysmem_freeptr(self->info.data); | genlib_sysmem_freeptr(self->info.data); | ||||
self->info.data = 0; | self->info.data = 0; | ||||
} | } | ||||
genlib_sysmem_freeptr(self); | |||||
} | } | ||||
long genlib_data_getcursor(t_genlib_data *b) { | long genlib_data_getcursor(t_genlib_data *b) { | ||||
@@ -29,13 +29,10 @@ BUILD_CXX_FLAGS += -Wno-unused-parameter | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | TARGETS += jack | ||||
endif | |||||
TARGETS += ladspa | TARGETS += ladspa | ||||
TARGETS += lv2_dsp | TARGETS += lv2_dsp | ||||
TARGETS += vst | |||||
TARGETS += vst2 | |||||
all: $(TARGETS) | all: $(TARGETS) | ||||
@@ -29,13 +29,10 @@ BUILD_CXX_FLAGS += -Wno-unused-parameter | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | TARGETS += jack | ||||
endif | |||||
TARGETS += ladspa | TARGETS += ladspa | ||||
TARGETS += lv2_dsp | TARGETS += lv2_dsp | ||||
TARGETS += vst | |||||
TARGETS += vst2 | |||||
all: $(TARGETS) | all: $(TARGETS) | ||||
@@ -29,13 +29,10 @@ BUILD_CXX_FLAGS += -Wno-unused-parameter | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | TARGETS += jack | ||||
endif | |||||
TARGETS += ladspa | TARGETS += ladspa | ||||
TARGETS += lv2_dsp | TARGETS += lv2_dsp | ||||
TARGETS += vst | |||||
TARGETS += vst2 | |||||
all: $(TARGETS) | all: $(TARGETS) | ||||