24 parameterIndex (parameterIndex_)
26 if (
auto vstXML = owner.getVSTXML())
28 param = vstXML->getParamForID (parameterIndex,
nullptr);
32 displayName = param->name;
34 for (
auto group = param->parent; group !=
nullptr; group = group->parent)
35 displayName = group->name +
" >> " + displayName;
37 valueType = vstXML->getValueType (param->type);
48 unregisterAsListener();
49 notifyListenersOfDeletion();
52 void registerAsListener()
54 if (
auto p = getParam())
55 p->addListener (
this);
60 void unregisterAsListener()
62 if (
auto p = getParam())
63 p->removeListener (
this);
68 if (
auto p = getParam())
69 return p->getDefaultValue();
74 void parameterChanged (
float newValue,
bool byAutomation)
override
76 if (
auto p = getParam())
78 if (p->getValue() != newValue)
83 p->setValue (newValue);
88 void beginParameterChangeGesture()
override
90 if (
auto p = getParam())
91 p->beginChangeGesture();
94 void endParameterChangeGesture()
override
96 if (
auto p = getParam())
97 p->endChangeGesture();
102 if (
auto p = getParam())
103 return p->getText (value, 16);
110 if (
auto p = getParam())
111 return p->getValueForText (str);
113 return dbStringToDb (str);
118 if (
auto p = getParam())
119 return p->getCurrentValueAsText();
126 if (
auto p = getParam())
127 return p->getLabel();
132 void valueChangedByPlugin()
134 if (
auto p = getParam())
143 if (
auto p = getParam())
145 auto name = p->getName (1024);
146 if (name.isNotEmpty())
153 int getParameterIndex()
const noexcept
155 return parameterIndex;
158 juce::String getParameterShortName (
int suggestedLength)
const override
160 if (
auto p = getParam())
161 return p->getName (suggestedLength);
171 bool isDiscrete()
const override
173 return param !=
nullptr
174 && (param->numberOfStates >= 2 || param->type ==
"switch");
177 int getNumberOfStates()
const override
180 return (param->numberOfStates >= 2) ? param->numberOfStates : 2;
185 float getValueForState (
int state)
const override
187 jassert (state >= 0 && state < getNumberOfStates());
189 if (valueType !=
nullptr && valueType->entries.size() > 0)
191 return (e->range.high + e->range.low) / 2.0f;
193 return juce::jlimit (0.0f, 1.0f, 1.0f /
float (getNumberOfStates() - 1) * state);
196 juce::String getLabelForValue (
float val)
const override
198 if (param !=
nullptr && param->type ==
"switch")
199 return (val >= 0.0f && val < 0.5f) ?
TRANS(
"Off")
202 if (valueType !=
nullptr)
204 for (
const auto& v : valueType->entries)
205 if (v->range.contains (val))
216 if (param->type ==
"switch")
221 else if (valueType && valueType->entries.size() > 0)
223 for (
int i = 0; i < valueType->entries.size(); ++i)
224 labels.
add (valueType->entries[i]->name);
232 float snapToState (
float val)
const override
236 if (valueType !=
nullptr)
238 for (
const auto& v : valueType->entries)
239 if (v->range.contains (val))
240 return (v->range.high + v->range.low) / 2;
244 (
int) (val * getNumberOfStates()));
245 return getValueForState (state);
251 bool hasLabels()
const override
253 return (param !=
nullptr && param->type ==
"switch")
254 || (valueType !=
nullptr && valueType->entries.size() > 0
255 && valueType->entries[0]->name.isNotEmpty());
258 int getStateForValue (
float val)
const override
262 if (valueType !=
nullptr)
264 for (
int i = 0; i < valueType->entries.size(); ++i)
265 if (valueType->entries.getUnchecked (i)->range.contains (val))
276 const int parameterIndex;
285 return static_cast<ExternalPlugin&
> (*plugin).getAudioPluginInstance();
290 if (
auto pi = getPlugin())
291 return pi->getParameters()[parameterIndex];
296 void markAsChanged()
const noexcept
301 void parameterValueChanged (
int index,
float )
override
303 if (parameterIndex == index)
309 void parameterGestureChanged (
int index,
bool gestureIsStarting)
override
311 if (! juce::MessageManager::existsAndIsCurrentThread())
314 if (parameterIndex == index)
316 if (gestureIsStarting)
332 void handleAsyncUpdate()
override
343 valueChangedByPlugin();