Browse Source

Some attention to ImguiSimpleGain, make it follow other examples

Signed-off-by: falkTX <falktx@falktx.com>
pull/341/head
falkTX 3 years ago
parent
commit
1c19c75b8f
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
7 changed files with 101 additions and 183 deletions
  1. +4
    -0
      examples/ImGuiSimpleGain/CParamSmooth.hpp
  2. +2
    -2
      examples/ImGuiSimpleGain/DistrhoPluginInfo.h
  3. +2
    -2
      examples/ImGuiSimpleGain/Makefile
  4. +45
    -76
      examples/ImGuiSimpleGain/PluginSimpleGain.cpp
  5. +22
    -48
      examples/ImGuiSimpleGain/PluginSimpleGain.hpp
  6. +19
    -49
      examples/ImGuiSimpleGain/UISimpleGain.cpp
  7. +7
    -6
      examples/ImGuiSimpleGain/UISimpleGain.hpp

examples/ImguiSimpleGain/CParamSmooth.hpp → examples/ImGuiSimpleGain/CParamSmooth.hpp View File

@@ -30,6 +30,10 @@ public:
}
}

inline void flush() {
z = 0.0f;
}

inline float process(float in) {
return z = (in * b) + (z * a);
}

examples/ImguiSimpleGain/DistrhoPluginInfo.h → examples/ImGuiSimpleGain/DistrhoPluginInfo.h View File

@@ -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.

examples/ImguiSimpleGain/Makefile → examples/ImGuiSimpleGain/Makefile View File

@@ -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

examples/ImguiSimpleGain/PluginSimpleGain.cpp → examples/ImGuiSimpleGain/PluginSimpleGain.cpp View File

@@ -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();
}


examples/ImguiSimpleGain/PluginSimpleGain.hpp → examples/ImGuiSimpleGain/PluginSimpleGain.hpp View File

@@ -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

examples/ImguiSimpleGain/UISimpleGain.cpp → examples/ImGuiSimpleGain/UISimpleGain.cpp View File

@@ -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();

examples/ImguiSimpleGain/UISimpleGain.hpp → examples/ImGuiSimpleGain/UISimpleGain.hpp View File

@@ -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)
};

Loading…
Cancel
Save