Signed-off-by: falkTX <falktx@falktx.com>pull/443/head
@@ -2,13 +2,12 @@ | |||
# ------------------------------ # | |||
dpf_add_plugin(d_cairoui | |||
TARGETS jack dssi lv2 vst2 | |||
TARGETS clap dssi jack lv2_sep vst2 vst3 | |||
UI_TYPE cairo | |||
FILES_DSP | |||
CairoExamplePlugin.cpp | |||
FILES_UI | |||
Artwork.cpp | |||
DemoWidgetBanner.cpp | |||
CairoExampleUI.cpp) | |||
target_include_directories( | |||
@@ -23,33 +23,62 @@ START_NAMESPACE_DISTRHO | |||
class CairoExamplePlugin : public Plugin | |||
{ | |||
float fParameters[kParameterCount]; | |||
public: | |||
CairoExamplePlugin() | |||
: Plugin(0, 0, 0) | |||
: Plugin(kParameterCount, 0, 0) | |||
{ | |||
std::memset(fParameters, 0, sizeof(fParameters)); | |||
} | |||
const char* getLabel() const | |||
/** | |||
Get the plugin label.@n | |||
This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. | |||
*/ | |||
const char* getLabel() const override | |||
{ | |||
return "cairo_ui"; | |||
} | |||
/** | |||
Get an extensive comment/description about the plugin. | |||
*/ | |||
const char* getDescription() const override | |||
{ | |||
return "Cairo DPF Example"; | |||
} | |||
const char* getMaker() const | |||
/** | |||
Get the plugin author/maker. | |||
*/ | |||
const char* getMaker() const override | |||
{ | |||
return "Jean Pierre Cimalando"; | |||
return "DISTRHO"; | |||
} | |||
const char* getLicense() const | |||
/** | |||
Get the plugin license (a single line of text or a URL).@n | |||
For commercial plugins this should return some short copyright information. | |||
*/ | |||
const char* getLicense() const override | |||
{ | |||
return "ISC"; | |||
} | |||
uint32_t getVersion() const | |||
/** | |||
Get the plugin version, in hexadecimal. | |||
*/ | |||
uint32_t getVersion() const override | |||
{ | |||
return d_version(1, 0, 0); | |||
} | |||
int64_t getUniqueId() const | |||
/** | |||
Get the plugin unique Id.@n | |||
This value is used by LADSPA, DSSI, VST2 and VST3 plugin formats. | |||
*/ | |||
int64_t getUniqueId() const override | |||
{ | |||
return d_cconst('d', 'C', 'a', 'i'); | |||
} | |||
@@ -58,7 +87,7 @@ public: | |||
Initialize the audio port @a index.@n | |||
This function will be called once, shortly after the plugin is created. | |||
*/ | |||
void initAudioPort(bool input, uint32_t index, AudioPort& port) override | |||
void initAudioPort(const bool input, const uint32_t index, AudioPort& port) override | |||
{ | |||
// treat meter audio ports as stereo | |||
port.groupId = kPortGroupMono; | |||
@@ -67,29 +96,91 @@ public: | |||
Plugin::initAudioPort(input, index, port); | |||
} | |||
void initParameter(uint32_t index, Parameter& parameter) | |||
/** | |||
Initialize the parameter @a index.@n | |||
This function will be called once, shortly after the plugin is created. | |||
*/ | |||
void initParameter(const uint32_t index, Parameter& parameter) override | |||
{ | |||
// unused | |||
(void)index; | |||
(void)parameter; | |||
/** | |||
All parameters in this plugin have the same ranges. | |||
*/ | |||
switch (index) | |||
{ | |||
case kParameterKnob: | |||
parameter.hints = kParameterIsAutomatable; | |||
parameter.name = "Knob"; | |||
parameter.symbol = "knob"; | |||
parameter.ranges.min = 0.0f; | |||
parameter.ranges.max = 1.0f; | |||
parameter.ranges.def = 0.0f; | |||
break; | |||
case kParameterTriState: | |||
parameter.hints = kParameterIsAutomatable|kParameterIsInteger; | |||
parameter.name = "Color"; | |||
parameter.symbol = "color"; | |||
parameter.ranges.min = 0.0f; | |||
parameter.ranges.max = 2.0f; | |||
parameter.ranges.def = 0.0f; | |||
parameter.enumValues.count = 3; | |||
parameter.enumValues.restrictedMode = true; | |||
{ | |||
ParameterEnumerationValue* const values = new ParameterEnumerationValue[3]; | |||
parameter.enumValues.values = values; | |||
values[0].label = "Red"; | |||
values[0].value = 0; | |||
values[1].label = "Green"; | |||
values[1].value = 1; | |||
values[2].label = "Blue"; | |||
values[2].value = 2; | |||
} | |||
break; | |||
case kParameterButton: | |||
parameter.hints = kParameterIsAutomatable|kParameterIsBoolean; | |||
parameter.name = "Button"; | |||
parameter.symbol = "button"; | |||
parameter.ranges.min = 0.0f; | |||
parameter.ranges.max = 1.0f; | |||
parameter.ranges.def = 0.0f; | |||
parameter.enumValues.count = 2; | |||
parameter.enumValues.restrictedMode = true; | |||
{ | |||
ParameterEnumerationValue* const values = new ParameterEnumerationValue[2]; | |||
parameter.enumValues.values = values; | |||
values[0].label = "Off"; | |||
values[0].value = 0; | |||
values[1].label = "On"; | |||
values[1].value = 1; | |||
} | |||
break; | |||
} | |||
} | |||
float getParameterValue(uint32_t index) const | |||
/** | |||
Get the current value of a parameter.@n | |||
The host may call this function from any context, including realtime processing. | |||
*/ | |||
float getParameterValue(const uint32_t index) const override | |||
{ | |||
return 0; | |||
// unused | |||
(void)index; | |||
return fParameters[index]; | |||
} | |||
void setParameterValue(uint32_t index, float value) | |||
/** | |||
Change a parameter value.@n | |||
The host may call this function from any context, including realtime processing.@n | |||
When a parameter is marked as automatable, you must ensure no non-realtime operations are performed. | |||
@note This function will only be called for parameter inputs. | |||
*/ | |||
void setParameterValue(const uint32_t index, const float value) override | |||
{ | |||
// unused | |||
(void)index; | |||
(void)value; | |||
fParameters[index] = value; | |||
} | |||
void run(const float** inputs, float** outputs, uint32_t frames) | |||
/** | |||
Run/process function for plugins without MIDI input. | |||
@note Some parameters might be null if there are no audio inputs or outputs. | |||
*/ | |||
void run(const float** const inputs, float** const outputs, const uint32_t frames) override | |||
{ | |||
/** | |||
This plugin does nothing, it just demonstrates cairo UI usage. | |||
@@ -23,42 +23,56 @@ | |||
START_NAMESPACE_DISTRHO | |||
/** | |||
We need a few classes from DGL. | |||
*/ | |||
// We need a few classes from DGL. | |||
using DGL_NAMESPACE::CairoGraphicsContext; | |||
using DGL_NAMESPACE::CairoImage; | |||
using DGL_NAMESPACE::CairoImageButton; | |||
using DGL_NAMESPACE::CairoImageKnob; | |||
using DGL_NAMESPACE::CairoImageSwitch; | |||
// And from ourselves | |||
using DGL_NAMESPACE::DemoWidgetBanner; | |||
class CairoExampleUI : public UI | |||
class CairoExampleUI : public UI, | |||
public CairoImageKnob::Callback, | |||
public CairoImageSwitch::Callback, | |||
public DemoWidgetClickable::Callback | |||
{ | |||
ScopedPointer<CairoImageKnob> fKnob; | |||
ScopedPointer<CairoImageSwitch> fButton; | |||
ScopedPointer<DemoWidgetBanner> fWidgetBanner; | |||
ScopedPointer<DemoWidgetClickable> fWidgetClickable; | |||
public: | |||
CairoExampleUI() | |||
: UI(200, 200) | |||
{ | |||
fWidgetClickable = new DemoWidgetClickable(this); | |||
fWidgetClickable->setSize(50, 50); | |||
fWidgetClickable->setAbsolutePos(100, 100); | |||
CairoImage knobSkin; | |||
knobSkin.loadFromPNG(Artwork::knobData, Artwork::knobDataSize); | |||
fWidgetBanner = new DemoWidgetBanner(this); | |||
fWidgetBanner->setSize(180, 80); | |||
fWidgetBanner->setAbsolutePos(10, 10); | |||
fWidgetBanner->setSize(180, 80); | |||
CairoImage knobSkin; | |||
knobSkin.loadFromPNG(Artwork::knobData, Artwork::knobDataSize); | |||
fWidgetClickable = new DemoWidgetClickable(this); | |||
fWidgetClickable->setAbsolutePos(100, 100); | |||
fWidgetClickable->setSize(50, 50); | |||
fWidgetClickable->setCallback(this); | |||
fWidgetClickable->setId(kParameterTriState); | |||
fKnob = new CairoImageKnob(this, knobSkin); | |||
fKnob->setSize(80, 80); | |||
fKnob->setAbsolutePos(10, 100); | |||
fKnob->setSize(80, 80); | |||
fKnob->setCallback(this); | |||
fKnob->setId(kParameterKnob); | |||
CairoImage buttonOn, buttonOff; | |||
buttonOn.loadFromPNG(Artwork::buttonOnData, Artwork::buttonOnDataSize); | |||
buttonOff.loadFromPNG(Artwork::buttonOffData, Artwork::buttonOffDataSize); | |||
fButton = new CairoImageButton(this, buttonOff, buttonOn); | |||
fButton->setSize(60, 35); | |||
fButton = new CairoImageSwitch(this, buttonOff, buttonOn); | |||
fButton->setAbsolutePos(100, 160); | |||
fButton->setSize(60, 35); | |||
fButton->setCallback(this); | |||
fButton->setId(kParameterButton); | |||
#if 0 | |||
// we can use this if/when our resources are scalable, for now they are PNGs | |||
@@ -67,7 +81,7 @@ public: | |||
setSize(200 * scaleFactor, 200 * scaleFactor); | |||
#else | |||
// without scalable resources, let DPF handle the scaling internally | |||
setGeometryConstraints(200, 200, true, true); | |||
setGeometryConstraints(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT, true, true); | |||
#endif | |||
} | |||
@@ -101,18 +115,46 @@ protected: | |||
} | |||
#endif | |||
void parameterChanged(uint32_t index, float value) override | |||
void parameterChanged(const uint32_t index, const float value) override | |||
{ | |||
// unused | |||
(void)index; | |||
(void)value; | |||
switch (index) | |||
{ | |||
case kParameterKnob: | |||
fKnob->setValue(value); | |||
break; | |||
case kParameterTriState: | |||
fWidgetClickable->setColorId(static_cast<int>(value + 0.5f)); | |||
break; | |||
case kParameterButton: | |||
fButton->setDown(value > 0.5f); | |||
break; | |||
} | |||
} | |||
private: | |||
ScopedPointer<DemoWidgetClickable> fWidgetClickable; | |||
ScopedPointer<DemoWidgetBanner> fWidgetBanner; | |||
ScopedPointer<CairoImageKnob> fKnob; | |||
ScopedPointer<CairoImageButton> fButton; | |||
void demoWidgetClicked(DemoWidgetClickable*, const uint8_t colorId) override | |||
{ | |||
setParameterValue(kParameterTriState, colorId); | |||
} | |||
void imageKnobDragStarted(CairoImageKnob*) override | |||
{ | |||
editParameter(kParameterKnob, true); | |||
} | |||
void imageKnobDragFinished(CairoImageKnob*) override | |||
{ | |||
editParameter(kParameterKnob, false); | |||
} | |||
void imageKnobValueChanged(CairoImageKnob*, const float value) override | |||
{ | |||
setParameterValue(kParameterKnob, value); | |||
} | |||
void imageSwitchClicked(CairoImageSwitch*, bool down) override | |||
{ | |||
setParameterValue(kParameterButton, down ? 1.f : 0.f); | |||
} | |||
}; | |||
UI* createUI() | |||
@@ -1,99 +0,0 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2019-2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
* | |||
* 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. | |||
*/ | |||
#include "DemoWidgetBanner.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
static const char* banner = | |||
" " | |||
" * * * * * " | |||
" ** ** * * * * " | |||
" * * * * * * * " | |||
" * * * **** *** * **** * * ** **** * *** " | |||
" * * * * ** * * * * * * ** * " | |||
" * * ***** * * ****** * * * * * * * " | |||
" * * * * * * * * * * * * * * " | |||
" * * * ** * ** * * * * * * * * * * " | |||
" * * *** * *** * **** ** ** ***** ** * * " | |||
" " | |||
" " | |||
" " | |||
" ***** **** ***** " | |||
" * * * * * " | |||
" * * * * * " | |||
" * * * * * " | |||
" * * **** **** " | |||
" * * * * " | |||
" * * * * " | |||
" * * * * " | |||
" ***** * * " | |||
" "; | |||
enum | |||
{ | |||
rows = 23, | |||
columns = 72, | |||
}; | |||
DemoWidgetBanner::DemoWidgetBanner(SubWidget* parent) | |||
: CairoSubWidget(parent) {} | |||
DemoWidgetBanner::DemoWidgetBanner(TopLevelWidget* parent) | |||
: CairoSubWidget(parent) {} | |||
void DemoWidgetBanner::onCairoDisplay(const CairoGraphicsContext& context) | |||
{ | |||
cairo_t* cr = context.handle; | |||
Size<uint> sz = getSize(); | |||
int w = sz.getWidth(); | |||
int h = sz.getHeight(); | |||
double diameter = (double)w / columns; | |||
double radius = 0.5 * diameter; | |||
double xoff = 0; | |||
double yoff = 0.5 * (h - rows * diameter); | |||
for (int r = 0; r < rows; ++r) | |||
{ | |||
for (int c = 0; c < columns; ++c) | |||
{ | |||
double cx = xoff + radius + c * diameter; | |||
double cy = yoff + radius + r * diameter; | |||
char ch = banner[c + r * columns]; | |||
if (ch != ' ') | |||
cairo_set_source_rgb(cr, 0.5, 0.9, 0.2); | |||
else | |||
cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); | |||
cairo_save(cr); | |||
cairo_translate(cr, cx, cy); | |||
cairo_scale(cr, radius, radius); | |||
cairo_arc(cr, 0.0, 0.0, 1.0, 0.0, 2 * M_PI); | |||
cairo_restore(cr); | |||
cairo_fill(cr); | |||
} | |||
} | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -1,7 +1,7 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2019-2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
* Copyright (C) 2012-2023 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 | |||
@@ -23,17 +23,84 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
static constexpr const char banner[] = | |||
" " | |||
" * * * * * " | |||
" ** ** * * * * " | |||
" * * * * * * * " | |||
" * * * **** *** * **** * * ** **** * *** " | |||
" * * * * ** * * * * * * ** * " | |||
" * * ***** * * ****** * * * * * * * " | |||
" * * * * * * * * * * * * * * " | |||
" * * * ** * ** * * * * * * * * * * " | |||
" * * *** * *** * **** ** ** ***** ** * * " | |||
" " | |||
" " | |||
" " | |||
" ***** **** ***** " | |||
" * * * * * " | |||
" * * * * * " | |||
" * * * * * " | |||
" * * **** **** " | |||
" * * * * " | |||
" * * * * " | |||
" * * * * " | |||
" ***** * * " | |||
" "; | |||
enum { | |||
rows = 23, | |||
columns = 72, | |||
}; | |||
class DemoWidgetBanner : public CairoSubWidget | |||
{ | |||
public: | |||
explicit DemoWidgetBanner(SubWidget* parent); | |||
explicit DemoWidgetBanner(TopLevelWidget* parent); | |||
explicit DemoWidgetBanner(SubWidget* const parent) | |||
: CairoSubWidget(parent) {} | |||
explicit DemoWidgetBanner(TopLevelWidget* const parent) | |||
: CairoSubWidget(parent) {} | |||
protected: | |||
void onCairoDisplay(const CairoGraphicsContext& context) override; | |||
void onCairoDisplay(const CairoGraphicsContext& context) override | |||
{ | |||
cairo_t* const cr = context.handle; | |||
Size<uint> sz = getSize(); | |||
int w = sz.getWidth(); | |||
int h = sz.getHeight(); | |||
const double diameter = (double)w / columns; | |||
const double radius = 0.5 * diameter; | |||
const double xoff = 0; | |||
const double yoff = 0.5 * (h - rows * diameter); | |||
for (int r = 0; r < rows; ++r) | |||
{ | |||
for (int c = 0; c < columns; ++c) | |||
{ | |||
double cx = xoff + radius + c * diameter; | |||
double cy = yoff + radius + r * diameter; | |||
char ch = banner[c + r * columns]; | |||
if (ch != ' ') | |||
cairo_set_source_rgb(cr, 0.5, 0.9, 0.2); | |||
else | |||
cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); | |||
cairo_save(cr); | |||
cairo_translate(cr, cx, cy); | |||
cairo_scale(cr, radius, radius); | |||
cairo_arc(cr, 0.0, 0.0, 1.0, 0.0, 2 * M_PI); | |||
cairo_restore(cr); | |||
cairo_fill(cr); | |||
} | |||
} | |||
} | |||
}; | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
using DGL_NAMESPACE::DemoWidgetBanner; |
@@ -1,7 +1,7 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2019-2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
* Copyright (C) 2012-2023 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 | |||
@@ -23,16 +23,51 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
class DemoWidgetClickable : public CairoSubWidget | |||
class DemoWidgetClickable : public CairoSubWidget, | |||
public ButtonEventHandler, | |||
public ButtonEventHandler::Callback | |||
{ | |||
public: | |||
class Callback | |||
{ | |||
public: | |||
virtual ~Callback() {} | |||
virtual void demoWidgetClicked(DemoWidgetClickable* widget, uint8_t colorId) = 0; | |||
}; | |||
explicit DemoWidgetClickable(SubWidget* const parent) | |||
: CairoSubWidget(parent), | |||
colorId(0) {} | |||
ButtonEventHandler(this), | |||
fCallback(nullptr), | |||
fColorId(0) | |||
{ | |||
ButtonEventHandler::setCallback(this); | |||
} | |||
explicit DemoWidgetClickable(TopLevelWidget* const parent) | |||
: CairoSubWidget(parent), | |||
colorId(0) {} | |||
ButtonEventHandler(this), | |||
fCallback(nullptr), | |||
fColorId(0) | |||
{ | |||
ButtonEventHandler::setCallback(this); | |||
} | |||
void setCallback(Callback* const callback) noexcept | |||
{ | |||
fCallback = callback; | |||
} | |||
uint8_t getColorId() const noexcept | |||
{ | |||
return fColorId; | |||
} | |||
void setColorId(uint8_t colorId) noexcept | |||
{ | |||
fColorId = colorId; | |||
repaint(); | |||
} | |||
protected: | |||
void onCairoDisplay(const CairoGraphicsContext& context) override | |||
@@ -43,7 +78,7 @@ protected: | |||
const int w = sz.getWidth(); | |||
const int h = sz.getHeight(); | |||
switch (colorId) | |||
switch (fColorId) | |||
{ | |||
case 0: | |||
cairo_set_source_rgb(cr, 0.75, 0.0, 0.0); | |||
@@ -72,26 +107,21 @@ protected: | |||
bool onMouse(const MouseEvent& event) override | |||
{ | |||
if (event.press) | |||
{ | |||
const int w = getWidth(); | |||
const int h = getHeight(); | |||
const int mx = event.pos.getX(); | |||
const int my = event.pos.getY(); | |||
// inside | |||
if (mx >= 0 && my >= 0 && mx < w && my < h) | |||
{ | |||
colorId = (colorId + 1) % 3; | |||
repaint(); | |||
} | |||
} | |||
return ButtonEventHandler::mouseEvent(event); | |||
} | |||
void buttonClicked(SubWidget*, int) override | |||
{ | |||
fColorId = (fColorId + 1) % 3; | |||
repaint(); | |||
return CairoSubWidget::onMouse(event); | |||
if (fCallback != nullptr) | |||
fCallback->demoWidgetClicked(this, fColorId); | |||
} | |||
private: | |||
uint colorId; | |||
Callback* fCallback; | |||
uint8_t fColorId; | |||
}; | |||
// ----------------------------------------------------------------------- | |||
@@ -118,10 +118,36 @@ | |||
#define DISTRHO_UI_USE_NANOVG 0 | |||
/** | |||
The %UI URI when exporting in LV2 format.@n | |||
By default this is set to @ref DISTRHO_PLUGIN_URI with "#UI" as suffix. | |||
Default UI width to use when creating initial and temporary windows.@n | |||
Setting this macro allows to skip a temporary UI from being created in certain VST2 and VST3 hosts. | |||
(which would normally be done for knowing the UI size before host creates a window for it) | |||
Value must match 1x scale factor. | |||
When this macro is defined, the companion DISTRHO_UI_DEFAULT_HEIGHT macro must be defined as well. | |||
*/ | |||
#define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" | |||
#define DISTRHO_UI_DEFAULT_WIDTH 200 | |||
#define DISTRHO_UI_FILE_BROWSER 0 | |||
/** | |||
Default UI height to use when creating initial and temporary windows.@n | |||
Setting this macro allows to skip a temporary UI from being created in certain VST2 and VST3 hosts. | |||
(which would normally be done for knowing the UI size before host creates a window for it) | |||
Value must match 1x scale factor. | |||
When this macro is defined, the companion DISTRHO_UI_DEFAULT_WIDTH macro must be defined as well. | |||
*/ | |||
#define DISTRHO_UI_DEFAULT_HEIGHT 200 | |||
// TODO document this | |||
#define DISTRHO_UI_USE_CAIRO 1 | |||
// TODO document this | |||
#define DISTRHO_UI_FILE_BROWSER 0 | |||
enum Parameters { | |||
kParameterKnob, | |||
kParameterTriState, | |||
kParameterButton, | |||
kParameterCount | |||
}; |
@@ -17,7 +17,6 @@ FILES_DSP = \ | |||
FILES_UI = \ | |||
Artwork.cpp \ | |||
DemoWidgetBanner.cpp \ | |||
CairoExampleUI.cpp | |||
# -------------------------------------------------------------- | |||
@@ -29,11 +28,7 @@ include ../../Makefile.plugins.mk | |||
# -------------------------------------------------------------- | |||
# Enable all possible plugin types | |||
TARGETS += clap | |||
TARGETS += dssi | |||
TARGETS += jack | |||
TARGETS += lv2_sep | |||
TARGETS += vst2 | |||
TARGETS = clap dssi jack lv2_sep vst2 vst3 | |||
all: $(TARGETS) | |||