Signed-off-by: falkTX <falktx@falktx.com>pull/341/head
| @@ -30,6 +30,10 @@ public: | |||
| } | |||
| } | |||
| inline void flush() { | |||
| z = 0.0f; | |||
| } | |||
| inline float process(float in) { | |||
| return z = (in * b) + (z * a); | |||
| } | |||
| @@ -22,7 +22,7 @@ | |||
| This is used to identify your plugin before a Plugin instance can be created. | |||
| @note This macro is required. | |||
| */ | |||
| #define DISTRHO_PLUGIN_NAME "ImguiSimpleGain" | |||
| #define DISTRHO_PLUGIN_NAME "ImGuiSimpleGain" | |||
| /** | |||
| Number of audio inputs the plugin has. | |||
| @@ -93,7 +93,7 @@ | |||
| @see Plugin::initProgramName(uint32_t, String&) | |||
| @see Plugin::loadProgram(uint32_t) | |||
| */ | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 0 | |||
| /** | |||
| Wherever the plugin uses internal non-parameter data. | |||
| @@ -7,7 +7,7 @@ | |||
| # -------------------------------------------------------------- | |||
| # Project name, used for binaries | |||
| NAME = d_ImguiSimpleGain | |||
| NAME = d_ImGuiSimpleGain | |||
| # -------------------------------------------------------------- | |||
| # Files to build | |||
| @@ -30,7 +30,7 @@ BUILD_CXX_FLAGS += -I../../../DPF-Widgets/opengl/ | |||
| # -------------------------------------------------------------- | |||
| # Enable all selected plugin types | |||
| TARGETS += jack lv2_sep vst3 | |||
| TARGETS += jack lv2_sep vst2 vst3 | |||
| ifeq ($(HAVE_LIBLO),true) | |||
| TARGETS += dssi | |||
| @@ -31,109 +31,65 @@ START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| PluginSimpleGain::PluginSimpleGain() | |||
| : Plugin(paramCount, presetCount, 0) // paramCount param(s), presetCount program(s), 0 states | |||
| : Plugin(paramCount, 0, 0), // parameters, programs, states | |||
| fSampleRate(getSampleRate()), | |||
| fGainDB(0.0f), | |||
| fGainLinear(1.0f) | |||
| { | |||
| smooth_gain = new CParamSmooth(20.0f, getSampleRate()); | |||
| for (unsigned p = 0; p < paramCount; ++p) { | |||
| Parameter param; | |||
| initParameter(p, param); | |||
| setParameterValue(p, param.ranges.def); | |||
| } | |||
| } | |||
| PluginSimpleGain::~PluginSimpleGain() { | |||
| delete smooth_gain; | |||
| fSmoothGain = new CParamSmooth(20.0f, fSampleRate); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void PluginSimpleGain::initParameter(uint32_t index, Parameter& parameter) { | |||
| if (index >= paramCount) | |||
| return; | |||
| void PluginSimpleGain::initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(index == 0,); | |||
| parameter.ranges.min = -90.0f; | |||
| parameter.ranges.max = 30.0f; | |||
| parameter.ranges.def = -0.0f; | |||
| parameter.unit = "db"; | |||
| parameter.hints = kParameterIsAutomable; | |||
| switch (index) { | |||
| case paramGain: | |||
| parameter.name = "Gain (dB)"; | |||
| parameter.shortName = "Gain"; | |||
| parameter.symbol = "gain"; | |||
| break; | |||
| } | |||
| } | |||
| /** | |||
| Set the name of the program @a index. | |||
| This function will be called once, shortly after the plugin is created. | |||
| */ | |||
| void PluginSimpleGain::initProgramName(uint32_t index, String& programName) { | |||
| if (index < presetCount) { | |||
| programName = factoryPresets[index].name; | |||
| } | |||
| parameter.name = "Gain"; | |||
| parameter.shortName = "Gain"; | |||
| parameter.symbol = "gain"; | |||
| parameter.unit = "dB"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| /** | |||
| Optional callback to inform the plugin about a sample rate change. | |||
| */ | |||
| void PluginSimpleGain::sampleRateChanged(double newSampleRate) { | |||
| fSampleRate = newSampleRate; | |||
| smooth_gain->setSampleRate(newSampleRate); | |||
| } | |||
| /** | |||
| Get the current value of a parameter. | |||
| */ | |||
| float PluginSimpleGain::getParameterValue(uint32_t index) const { | |||
| return fParams[index]; | |||
| float PluginSimpleGain::getParameterValue(uint32_t index) const | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(index == 0, 0.0f); | |||
| return fGainDB; | |||
| } | |||
| /** | |||
| Change a parameter value. | |||
| */ | |||
| void PluginSimpleGain::setParameterValue(uint32_t index, float value) { | |||
| fParams[index] = value; | |||
| switch (index) { | |||
| case paramGain: | |||
| gain = DB_CO(CLAMP(fParams[paramGain], -90.0, 30.0)); | |||
| break; | |||
| } | |||
| } | |||
| void PluginSimpleGain::setParameterValue(uint32_t index, float value) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(index == 0,); | |||
| /** | |||
| Load a program. | |||
| The host may call this function from any context, | |||
| including realtime processing. | |||
| */ | |||
| void PluginSimpleGain::loadProgram(uint32_t index) { | |||
| if (index < presetCount) { | |||
| for (int i=0; i < paramCount; i++) { | |||
| setParameterValue(i, factoryPresets[index].params[i]); | |||
| } | |||
| } | |||
| fGainDB = value; | |||
| fGainLinear = DB_CO(CLAMP(value, -90.0, 30.0)); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void PluginSimpleGain::activate() { | |||
| // plugin is activated | |||
| void PluginSimpleGain::activate() | |||
| { | |||
| fSmoothGain->flush(); | |||
| } | |||
| void PluginSimpleGain::run(const float** inputs, float** outputs, | |||
| uint32_t frames) { | |||
| void PluginSimpleGain::run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| // get the left and right audio inputs | |||
| const float* const inpL = inputs[0]; | |||
| const float* const inpR = inputs[1]; | |||
| @@ -143,16 +99,29 @@ void PluginSimpleGain::run(const float** inputs, float** outputs, | |||
| float* const outR = outputs[1]; | |||
| // apply gain against all samples | |||
| for (uint32_t i=0; i < frames; ++i) { | |||
| float gainval = smooth_gain->process(gain); | |||
| outL[i] = inpL[i] * gainval; | |||
| outR[i] = inpR[i] * gainval; | |||
| for (uint32_t i=0; i < frames; ++i) | |||
| { | |||
| const float gain = fSmoothGain->process(fGainLinear); | |||
| outL[i] = inpL[i] * gain; | |||
| outR[i] = inpR[i] * gain; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() { | |||
| /** | |||
| Optional callback to inform the plugin about a sample rate change. | |||
| */ | |||
| void PluginSimpleGain::sampleRateChanged(double newSampleRate) | |||
| { | |||
| fSampleRate = newSampleRate; | |||
| fSmoothGain->setSampleRate(newSampleRate); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new PluginSimpleGain(); | |||
| } | |||
| @@ -29,6 +29,7 @@ | |||
| #include "DistrhoPlugin.hpp" | |||
| #include "CParamSmooth.hpp" | |||
| #include "extra/ScopedPointer.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| @@ -59,57 +60,50 @@ public: | |||
| PluginSimpleGain(); | |||
| ~PluginSimpleGain(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* getLabel() const noexcept override { | |||
| const char* getLabel() const noexcept override | |||
| { | |||
| return "SimpleGain"; | |||
| } | |||
| const char* getDescription() const override { | |||
| return "A simple audio volume gain plugin"; | |||
| } | |||
| const char* getMaker() const noexcept override { | |||
| return "example.com"; | |||
| const char* getDescription() const override | |||
| { | |||
| return "A simple audio volume gain plugin with ImGui for its GUI"; | |||
| } | |||
| const char* getHomePage() const override { | |||
| return "https://example.com/plugins/simplegain"; | |||
| const char* getMaker() const noexcept override | |||
| { | |||
| return "Jean Pierre Cimalando, falkTX"; | |||
| } | |||
| const char* getLicense() const noexcept override { | |||
| return "https://spdx.org/licenses/MIT"; | |||
| const char* getLicense() const noexcept override | |||
| { | |||
| return "MIT"; | |||
| } | |||
| uint32_t getVersion() const noexcept override { | |||
| return d_version(0, 1, 0); | |||
| uint32_t getVersion() const noexcept override | |||
| { | |||
| return d_version(1, 0, 0); | |||
| } | |||
| // Go to: | |||
| // | |||
| // http://service.steinberg.de/databases/plugin.nsf/plugIn | |||
| // | |||
| // Get a proper plugin UID and fill it in here! | |||
| int64_t getUniqueId() const noexcept override { | |||
| return d_cconst('a', 'b', 'c', 'd'); | |||
| int64_t getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('d', 'I', 'm', 'G'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void initParameter(uint32_t index, Parameter& parameter) override; | |||
| void initProgramName(uint32_t index, String& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float getParameterValue(uint32_t index) const override; | |||
| void setParameterValue(uint32_t index, float value) override; | |||
| void loadProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Optional | |||
| @@ -121,39 +115,19 @@ protected: | |||
| // Process | |||
| void activate() override; | |||
| void run(const float**, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| float fParams[paramCount]; | |||
| double fSampleRate; | |||
| float gain; | |||
| CParamSmooth *smooth_gain; | |||
| double fSampleRate; | |||
| float fGainDB; | |||
| float fGainLinear; | |||
| ScopedPointer<CParamSmooth> fSmoothGain; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginSimpleGain) | |||
| }; | |||
| struct Preset { | |||
| const char* name; | |||
| float params[PluginSimpleGain::paramCount]; | |||
| }; | |||
| const Preset factoryPresets[] = { | |||
| { | |||
| "Unity Gain", | |||
| {0.0f} | |||
| } | |||
| //,{ | |||
| // "Another preset", // preset name | |||
| // {-14.0f, ...} // array of presetCount float param values | |||
| //} | |||
| }; | |||
| const uint presetCount = sizeof(factoryPresets) / sizeof(Preset); | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -32,13 +32,15 @@ START_NAMESPACE_DISTRHO | |||
| // Init / Deinit | |||
| UISimpleGain::UISimpleGain() | |||
| : UI(600, 400) | |||
| : UI(600, 400), | |||
| fGain(0.0f), | |||
| fResizeHandle(this) | |||
| { | |||
| setGeometryConstraints(600, 400, true); | |||
| } | |||
| UISimpleGain::~UISimpleGain() | |||
| { | |||
| // hide handle if UI is resizable | |||
| if (isResizable()) | |||
| fResizeHandle.hide(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -50,46 +52,15 @@ UISimpleGain::~UISimpleGain() | |||
| */ | |||
| void UISimpleGain::parameterChanged(uint32_t index, float value) | |||
| { | |||
| params[index] = value; | |||
| switch (index) | |||
| { | |||
| case PluginSimpleGain::paramGain: | |||
| // do something when Gain param is set, such as update a widget | |||
| break; | |||
| } | |||
| DISTRHO_SAFE_ASSERT_RETURN(index == 0,); | |||
| (void)value; | |||
| } | |||
| /** | |||
| A program has been loaded on the plugin side. | |||
| This is called by the host to inform the UI about program changes. | |||
| */ | |||
| void UISimpleGain::programLoaded(uint32_t index) | |||
| { | |||
| if (index < presetCount) | |||
| { | |||
| for (int i=0; i < PluginSimpleGain::paramCount; i++) | |||
| { | |||
| // set values for each parameter and update their widgets | |||
| parameterChanged(i, factoryPresets[index].params[i]); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| Optional callback to inform the UI about a sample rate change on the plugin side. | |||
| */ | |||
| void UISimpleGain::sampleRateChanged(double newSampleRate) | |||
| { | |||
| (void)newSampleRate; | |||
| fGain = value; | |||
| repaint(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget callbacks | |||
| /** | |||
| A function called to draw the view contents. | |||
| */ | |||
| @@ -97,28 +68,27 @@ void UISimpleGain::onImGuiDisplay() | |||
| { | |||
| const float width = getWidth(); | |||
| const float height = getHeight(); | |||
| const float margin = 20.0f; | |||
| const float margin = 20.0f * getScaleFactor(); | |||
| ImGui::SetNextWindowPos(ImVec2(margin, margin)); | |||
| ImGui::SetNextWindowSize(ImVec2(width - 2 * margin, height - 2 * margin)); | |||
| if (ImGui::Begin("Simple gain")) { | |||
| static char aboutText[256] = | |||
| "This is a demo plugin made with ImGui.\n"; | |||
| if (ImGui::Begin("Simple gain", nullptr, ImGuiWindowFlags_NoResize)) | |||
| { | |||
| static char aboutText[256] = "This is a demo plugin made with ImGui.\n"; | |||
| ImGui::InputTextMultiline("About", aboutText, sizeof(aboutText)); | |||
| float& gain = params[PluginSimpleGain::paramGain]; | |||
| if (ImGui::SliderFloat("Gain (dB)", &gain, -90.0f, 30.0f)) | |||
| if (ImGui::SliderFloat("Gain (dB)", &fGain, -90.0f, 30.0f)) | |||
| { | |||
| if (ImGui::IsItemActivated()) | |||
| { | |||
| editParameter(PluginSimpleGain::paramGain, true); | |||
| } | |||
| setParameterValue(PluginSimpleGain::paramGain, gain); | |||
| editParameter(0, true); | |||
| setParameterValue(0, fGain); | |||
| } | |||
| if (ImGui::IsItemDeactivated()) | |||
| { | |||
| editParameter(PluginSimpleGain::paramGain, false); | |||
| editParameter(0, false); | |||
| } | |||
| } | |||
| ImGui::End(); | |||
| @@ -28,24 +28,25 @@ | |||
| #define UI_SIMPLEGAIN_H | |||
| #include "DistrhoUI.hpp" | |||
| #include "PluginSimpleGain.hpp" | |||
| #include "../generic/ResizeHandle.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| class UISimpleGain : public UI { | |||
| class UISimpleGain : public UI | |||
| { | |||
| public: | |||
| UISimpleGain(); | |||
| ~UISimpleGain(); | |||
| protected: | |||
| // DSP/Plugin callbacks | |||
| void parameterChanged(uint32_t, float value) override; | |||
| void programLoaded(uint32_t index) override; | |||
| void sampleRateChanged(double newSampleRate) override; | |||
| // Widget callbacks | |||
| void onImGuiDisplay() override; | |||
| private: | |||
| float params[PluginSimpleGain::paramCount] {}; | |||
| float fGain; | |||
| ResizeHandle fResizeHandle; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UISimpleGain) | |||
| }; | |||