| @@ -1 +1 @@ | |||||
| Subproject commit eafa8349a9dd745a3739a78166606801c17240d2 | |||||
| Subproject commit d0a26d6d205ce51c450806d615c8edd3e48e7a90 | |||||
| @@ -21,9 +21,10 @@ | |||||
| #define DISTRHO_PLUGIN_NAME "Parameters" | #define DISTRHO_PLUGIN_NAME "Parameters" | ||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Parameters" | #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Parameters" | ||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| @@ -28,7 +28,7 @@ class ExamplePluginParameters : public Plugin | |||||
| { | { | ||||
| public: | public: | ||||
| ExamplePluginParameters() | ExamplePluginParameters() | ||||
| : Plugin(9, 0, 0) // 9 parameters, 0 programs, 0 states | |||||
| : Plugin(9, 2, 0) // 9 parameters, 2 programs, 0 states | |||||
| { | { | ||||
| /** | /** | ||||
| Initialize all our parameters to their defaults. | Initialize all our parameters to their defaults. | ||||
| @@ -117,7 +117,7 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| /** | /** | ||||
| Changing parameters does not cause any realtime-unsafe operations, so we can mark them as automable. | Changing parameters does not cause any realtime-unsafe operations, so we can mark them as automable. | ||||
| Also set as boolean because they work are on/off switches. | |||||
| Also set as boolean because they work as on/off switches. | |||||
| */ | */ | ||||
| parameter.hints = kParameterIsAutomable|kParameterIsBoolean; | parameter.hints = kParameterIsAutomable|kParameterIsBoolean; | ||||
| @@ -171,6 +171,23 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| parameter.symbol.replace('-', '_'); | parameter.symbol.replace('-', '_'); | ||||
| } | } | ||||
| /** | |||||
| Set the name of the program @a index. | |||||
| This function will be called once, shortly after the plugin is created. | |||||
| */ | |||||
| void initProgramName(uint32_t index, String& programName) override | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| programName = "Default"; | |||||
| break; | |||||
| case 1: | |||||
| programName = "Custom"; | |||||
| break; | |||||
| } | |||||
| } | |||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * Internal data */ | * Internal data */ | ||||
| @@ -190,6 +207,39 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| fParamGrid[index] = value; | fParamGrid[index] = value; | ||||
| } | } | ||||
| /** | |||||
| Load a program. | |||||
| The host may call this function from any context, including realtime processing. | |||||
| */ | |||||
| void loadProgram(uint32_t index) override | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| fParamGrid[0] = 0.0f; | |||||
| fParamGrid[1] = 0.0f; | |||||
| fParamGrid[2] = 0.0f; | |||||
| fParamGrid[3] = 0.0f; | |||||
| fParamGrid[4] = 0.0f; | |||||
| fParamGrid[5] = 0.0f; | |||||
| fParamGrid[6] = 0.0f; | |||||
| fParamGrid[7] = 0.0f; | |||||
| fParamGrid[8] = 0.0f; | |||||
| break; | |||||
| case 1: | |||||
| fParamGrid[0] = 1.0f; | |||||
| fParamGrid[1] = 1.0f; | |||||
| fParamGrid[2] = 0.0f; | |||||
| fParamGrid[3] = 0.0f; | |||||
| fParamGrid[4] = 1.0f; | |||||
| fParamGrid[5] = 1.0f; | |||||
| fParamGrid[6] = 1.0f; | |||||
| fParamGrid[7] = 0.0f; | |||||
| fParamGrid[8] = 1.0f; | |||||
| break; | |||||
| } | |||||
| } | |||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * Process */ | * Process */ | ||||
| @@ -18,12 +18,6 @@ | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| /** | |||||
| For simplicity this UI will be of constant size. | |||||
| */ | |||||
| static const int kUIWidth = 512; | |||||
| static const int kUIHeight = 512; | |||||
| /** | /** | ||||
| We need the rectangle class from DGL. | We need the rectangle class from DGL. | ||||
| */ | */ | ||||
| @@ -34,6 +28,13 @@ using DGL::Rectangle; | |||||
| class ExampleUIParameters : public UI | class ExampleUIParameters : public UI | ||||
| { | { | ||||
| public: | public: | ||||
| /** | |||||
| For simplicity this UI will be of constant size. | |||||
| */ | |||||
| static const int kUIWidth = 512; | |||||
| static const int kUIHeight = 512; | |||||
| /* constructor */ | |||||
| ExampleUIParameters() | ExampleUIParameters() | ||||
| : UI(kUIWidth, kUIHeight) | : UI(kUIWidth, kUIHeight) | ||||
| { | { | ||||
| @@ -61,6 +62,40 @@ protected: | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| /** | |||||
| A program has been loaded on the plugin side. | |||||
| This is called by the host to inform the UI about program changes. | |||||
| */ | |||||
| void programLoaded(uint32_t index) override | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| fParamGrid[0] = false; | |||||
| fParamGrid[1] = false; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = false; | |||||
| fParamGrid[5] = false; | |||||
| fParamGrid[6] = false; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = false; | |||||
| break; | |||||
| case 1: | |||||
| fParamGrid[0] = true; | |||||
| fParamGrid[1] = true; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = true; | |||||
| fParamGrid[5] = true; | |||||
| fParamGrid[6] = true; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = true; | |||||
| break; | |||||
| } | |||||
| repaint(); | |||||
| } | |||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * Widget Callbacks */ | * Widget Callbacks */ | ||||
| @@ -21,11 +21,11 @@ | |||||
| #define DISTRHO_PLUGIN_NAME "States" | #define DISTRHO_PLUGIN_NAME "States" | ||||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/States" | #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/States" | ||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | ||||
| @@ -28,9 +28,13 @@ class ExamplePluginStates : public Plugin | |||||
| { | { | ||||
| public: | public: | ||||
| ExamplePluginStates() | ExamplePluginStates() | ||||
| : Plugin(0, 0, 9) // 0 parameters, 0 programs, 9 states | |||||
| : Plugin(0, 2, 9) // 0 parameters, 2 programs, 9 states | |||||
| { | { | ||||
| // nothing here | |||||
| /** | |||||
| Initialize all our parameters to their defaults. | |||||
| In this example all default values are false, so we can simply zero them. | |||||
| */ | |||||
| std::memset(fParamGrid, 0, sizeof(bool)*9); | |||||
| } | } | ||||
| protected: | protected: | ||||
| @@ -98,17 +102,29 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| } | } | ||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * Parameters */ | |||||
| * Init */ | |||||
| /** | /** | ||||
| This plugin has no parameters, so we can safely ignore some functions. | |||||
| This plugin has no parameters.. | |||||
| */ | */ | ||||
| void initParameter(uint32_t, Parameter&) override {} | void initParameter(uint32_t, Parameter&) override {} | ||||
| void setParameterValue(uint32_t, float) override {} | |||||
| float getParameterValue(uint32_t) const override { return 0.0f; } | |||||
| /* -------------------------------------------------------------------------------------------------------- | |||||
| * State */ | |||||
| /** | |||||
| Set the name of the program @a index. | |||||
| This function will be called once, shortly after the plugin is created. | |||||
| */ | |||||
| void initProgramName(uint32_t index, String& programName) override | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| programName = "Default"; | |||||
| break; | |||||
| case 1: | |||||
| programName = "Custom"; | |||||
| break; | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| Set the state key and default value of @a index. | Set the state key and default value of @a index. | ||||
| @@ -150,13 +166,106 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| defaultStateValue = "false"; | defaultStateValue = "false"; | ||||
| } | } | ||||
| /* -------------------------------------------------------------------------------------------------------- | |||||
| * Internal data */ | |||||
| /** | |||||
| This plugin has no parameters.. | |||||
| */ | |||||
| void setParameterValue(uint32_t, float) override {} | |||||
| float getParameterValue(uint32_t) const override { return 0.0f; } | |||||
| /** | |||||
| Load a program. | |||||
| The host may call this function from any context, including realtime processing. | |||||
| */ | |||||
| void loadProgram(uint32_t index) override | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| fParamGrid[0] = false; | |||||
| fParamGrid[1] = false; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = false; | |||||
| fParamGrid[5] = false; | |||||
| fParamGrid[6] = false; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = false; | |||||
| break; | |||||
| case 1: | |||||
| fParamGrid[0] = true; | |||||
| fParamGrid[1] = true; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = true; | |||||
| fParamGrid[5] = true; | |||||
| fParamGrid[6] = true; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| /** | |||||
| Get the value of an internal state. | |||||
| The host may call this function from any non-realtime context. | |||||
| */ | |||||
| String getState(const char* key) const override | |||||
| { | |||||
| static const String sTrue ("true"); | |||||
| static const String sFalse("false"); | |||||
| // check which block changed | |||||
| /**/ if (std::strcmp(key, "top-left") == 0) | |||||
| return fParamGrid[0] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "top-center") == 0) | |||||
| return fParamGrid[1] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "top-right") == 0) | |||||
| return fParamGrid[2] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "middle-left") == 0) | |||||
| return fParamGrid[3] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "middle-center") == 0) | |||||
| return fParamGrid[4] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "middle-right") == 0) | |||||
| return fParamGrid[5] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "bottom-left") == 0) | |||||
| return fParamGrid[6] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "bottom-center") == 0) | |||||
| return fParamGrid[7] ? sTrue : sFalse; | |||||
| else if (std::strcmp(key, "bottom-right") == 0) | |||||
| return fParamGrid[8] ? sTrue : sFalse; | |||||
| return sFalse; | |||||
| } | |||||
| /** | /** | ||||
| Change an internal state. | Change an internal state. | ||||
| */ | */ | ||||
| void setState(const char*, const char*) override | |||||
| void setState(const char* key, const char* value) override | |||||
| { | { | ||||
| // there is no plugin side state here. | |||||
| // states on this plugin will only change the UI grid, so we do nothing here | |||||
| const bool valueOnOff = (std::strcmp(value, "true") == 0); | |||||
| // check which block changed | |||||
| /**/ if (std::strcmp(key, "top-left") == 0) | |||||
| fParamGrid[0] = valueOnOff; | |||||
| else if (std::strcmp(key, "top-center") == 0) | |||||
| fParamGrid[1] = valueOnOff; | |||||
| else if (std::strcmp(key, "top-right") == 0) | |||||
| fParamGrid[2] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-left") == 0) | |||||
| fParamGrid[3] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-center") == 0) | |||||
| fParamGrid[4] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-right") == 0) | |||||
| fParamGrid[5] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-left") == 0) | |||||
| fParamGrid[6] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-center") == 0) | |||||
| fParamGrid[7] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-right") == 0) | |||||
| fParamGrid[8] = valueOnOff; | |||||
| } | } | ||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| @@ -182,7 +291,11 @@ The plugin will be treated as an effect, but it will not change the host audio." | |||||
| // ------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------- | ||||
| private: | private: | ||||
| // nothing here | |||||
| /** | |||||
| Our parameters used to display the grid on/off states. | |||||
| */ | |||||
| bool fParamGrid[9]; | |||||
| /** | /** | ||||
| Set our plugin class as non-copyable and add a leak detector just in case. | Set our plugin class as non-copyable and add a leak detector just in case. | ||||
| @@ -18,43 +18,39 @@ | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| /** | |||||
| For simplicity this UI will be of constant size. | |||||
| */ | |||||
| static const int kUIWidth = 512; | |||||
| static const int kUIHeight = 512; | |||||
| /** | |||||
| We need the rectangle class from DGL. | |||||
| */ | |||||
| using DGL::Rectangle; | |||||
| /** | |||||
| Get key name from an index. | |||||
| */ | |||||
| static const char* getStateKeyFromIndex(const uint32_t index) | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: return "top-left"; | |||||
| case 1: return "top-center"; | |||||
| case 2: return "top-right"; | |||||
| case 3: return "middle-left"; | |||||
| case 4: return "middle-center"; | |||||
| case 5: return "middle-right"; | |||||
| case 6: return "bottom-left"; | |||||
| case 7: return "bottom-center"; | |||||
| case 8: return "bottom-right"; | |||||
| } | |||||
| return "unknown"; | |||||
| } | |||||
| // ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
| class ExampleUIParameters : public UI | class ExampleUIParameters : public UI | ||||
| { | { | ||||
| public: | public: | ||||
| /** | |||||
| For simplicity this UI will be of constant size. | |||||
| */ | |||||
| static const int kUIWidth = 512; | |||||
| static const int kUIHeight = 512; | |||||
| /** | |||||
| Get key name from an index. | |||||
| */ | |||||
| static const char* getStateKeyFromIndex(const uint32_t index) noexcept | |||||
| { | |||||
| switch (index) | |||||
| { | |||||
| case 0: return "top-left"; | |||||
| case 1: return "top-center"; | |||||
| case 2: return "top-right"; | |||||
| case 3: return "middle-left"; | |||||
| case 4: return "middle-center"; | |||||
| case 5: return "middle-right"; | |||||
| case 6: return "bottom-left"; | |||||
| case 7: return "bottom-center"; | |||||
| case 8: return "bottom-right"; | |||||
| } | |||||
| return "unknown"; | |||||
| } | |||||
| /* constructor */ | |||||
| ExampleUIParameters() | ExampleUIParameters() | ||||
| : UI() | : UI() | ||||
| { | { | ||||
| @@ -75,32 +71,69 @@ protected: | |||||
| */ | */ | ||||
| void parameterChanged(uint32_t, float) override {} | void parameterChanged(uint32_t, float) override {} | ||||
| /** | |||||
| A program has been loaded on the plugin side. | |||||
| This is called by the host to inform the UI about program changes. | |||||
| */ | |||||
| void programLoaded(uint32_t index) override | |||||
| { | |||||
| d_stdout("UI programLoaded %i", index); | |||||
| switch (index) | |||||
| { | |||||
| case 0: | |||||
| fParamGrid[0] = false; | |||||
| fParamGrid[1] = false; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = false; | |||||
| fParamGrid[5] = false; | |||||
| fParamGrid[6] = false; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = false; | |||||
| break; | |||||
| case 1: | |||||
| fParamGrid[0] = true; | |||||
| fParamGrid[1] = true; | |||||
| fParamGrid[2] = false; | |||||
| fParamGrid[3] = false; | |||||
| fParamGrid[4] = true; | |||||
| fParamGrid[5] = true; | |||||
| fParamGrid[6] = true; | |||||
| fParamGrid[7] = false; | |||||
| fParamGrid[8] = true; | |||||
| break; | |||||
| } | |||||
| repaint(); | |||||
| } | |||||
| /** | /** | ||||
| A state has changed on the plugin side. | A state has changed on the plugin side. | ||||
| This is called by the host to inform the UI about state changes. | This is called by the host to inform the UI about state changes. | ||||
| */ | */ | ||||
| void stateChanged(const char* key, const char* value) | |||||
| void stateChanged(const char* key, const char* value) override | |||||
| { | { | ||||
| // check which block changed, enable it if its value is "true" | |||||
| const bool valueOnOff = (std::strcmp(value, "true") == 0); | |||||
| // check which block changed | |||||
| /**/ if (std::strcmp(key, "top-left") == 0) | /**/ if (std::strcmp(key, "top-left") == 0) | ||||
| fParamGrid[0] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[0] = valueOnOff; | |||||
| else if (std::strcmp(key, "top-center") == 0) | else if (std::strcmp(key, "top-center") == 0) | ||||
| fParamGrid[1] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[1] = valueOnOff; | |||||
| else if (std::strcmp(key, "top-right") == 0) | else if (std::strcmp(key, "top-right") == 0) | ||||
| fParamGrid[2] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[2] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-left") == 0) | else if (std::strcmp(key, "middle-left") == 0) | ||||
| fParamGrid[3] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[3] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-center") == 0) | else if (std::strcmp(key, "middle-center") == 0) | ||||
| fParamGrid[4] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[4] = valueOnOff; | |||||
| else if (std::strcmp(key, "middle-right") == 0) | else if (std::strcmp(key, "middle-right") == 0) | ||||
| fParamGrid[5] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[5] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-left") == 0) | else if (std::strcmp(key, "bottom-left") == 0) | ||||
| fParamGrid[6] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[6] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-center") == 0) | else if (std::strcmp(key, "bottom-center") == 0) | ||||
| fParamGrid[7] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[7] = valueOnOff; | |||||
| else if (std::strcmp(key, "bottom-right") == 0) | else if (std::strcmp(key, "bottom-right") == 0) | ||||
| fParamGrid[8] = (std::strcmp(value, "true") == 0); | |||||
| fParamGrid[8] = valueOnOff; | |||||
| // trigger repaint | // trigger repaint | ||||
| repaint(); | repaint(); | ||||