Skip to content

Commit 02de85a

Browse files
authored
Merge pull request iPlug2#604 from iPlug2/VST3/parameter-management
Fix iPlug2#488 Control binded to a param not redrawn when automated (Live/VST3)
2 parents b8c4663 + 0b7709d commit 02de85a

File tree

7 files changed

+62
-35
lines changed

7 files changed

+62
-35
lines changed

IPlug/IPlugAPIBase.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ void IPlugAPIBase::OnTimer(Timer& t)
152152
{
153153
if(HasUI())
154154
{
155-
// in distributed VST3, parameter changes are managed by the host
156-
#if !defined VST3C_API && !defined VST3P_API // && !defined VST3_API
155+
// in VST3, parameter changes are managed by the host
156+
#if !defined VST3C_API && !defined VST3P_API && !defined VST3_API
157157
while(mParamChangeFromProcessor.ElementsAvailable())
158158
{
159159
ParamTuple p;
@@ -176,8 +176,8 @@ void IPlugAPIBase::OnTimer(Timer& t)
176176
}
177177
#endif
178178

179-
// Midi messages from the processor to the controller, are sent as IMessages and SendMidiMsgFromDelegate gets triggered on the other side's notify
180-
#if defined VST3P_API // || defined VST3_API
179+
// In VST3 midi messages from the processor to the controller, are sent as IMessages and SendMidiMsgFromDelegate gets triggered on the other side's notify
180+
#if defined VST3P_API || defined VST3_API
181181
while (mMidiMsgsFromProcessor.ElementsAvailable())
182182
{
183183
IMidiMsg msg;

IPlug/VST3/IPlugVST3.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,17 +123,15 @@ tresult PLUGIN_API IPlugVST3::getState(IBStream* pState)
123123
#pragma mark IEditController overrides
124124
ParamValue PLUGIN_API IPlugVST3::getParamNormalized(ParamID tag)
125125
{
126-
if (tag >= kBypassParam)
127-
return EditControllerEx1::getParamNormalized(tag);
128-
129-
return IPlugVST3ControllerBase::GetParamNormalized(this, tag);
126+
return IPlugVST3ControllerBase::GetParamNormalized(parameters, tag);
130127
}
131128

132129
tresult PLUGIN_API IPlugVST3::setParamNormalized(ParamID tag, ParamValue value)
133130
{
134-
IPlugVST3ControllerBase::SetParamNormalized(this, tag, value);
135-
136-
return EditControllerEx1::setParamNormalized(tag, value);
131+
if (IPlugVST3ControllerBase::SetParamNormalized(this, parameters, tag, value))
132+
return kResultTrue;
133+
else
134+
return kResultFalse;
137135
}
138136

139137
IPlugView* PLUGIN_API IPlugVST3::createView(const char* name)
@@ -224,13 +222,21 @@ bool IPlugVST3::EditorResize(int viewWidth, int viewHeight)
224222
return true;
225223
}
226224

225+
#pragma mark IEditorDelegate overrides
226+
227227
void IPlugVST3::DirtyParametersFromUI()
228228
{
229229
startGroupEdit();
230230
IPlugAPIBase::DirtyParametersFromUI();
231231
finishGroupEdit();
232232
}
233233

234+
void IPlugVST3::SendParameterValueFromUI(int paramIdx, double normalisedValue)
235+
{
236+
IPlugVST3ControllerBase::SetVST3ParamNormalized(parameters, paramIdx, normalisedValue);
237+
IPlugAPIBase::SendParameterValueFromUI(paramIdx, normalisedValue);
238+
}
239+
234240
void IPlugVST3::SetLatency(int latency)
235241
{
236242
IPlugProcessor::SetLatency(latency);

IPlug/VST3/IPlugVST3.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class IPlugVST3 : public IPlugAPIBase
6565

6666
// IEditorDelegate
6767
void DirtyParametersFromUI() override;
68-
68+
void SendParameterValueFromUI(int paramIdx, double normalisedValue) override;
69+
6970
// IPlugProcessor
7071
void SetLatency(int samples) override;
7172

IPlug/VST3/IPlugVST3_Controller.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ tresult PLUGIN_API IPlugVST3Controller::initialize(FUnknown* context)
4343
Initialize(this, parameters, mPlugIsInstrument, mDoesMidiIn);
4444
IPlugVST3GetHost(this, context);
4545
OnHostIdentified();
46-
46+
OnParamReset(kReset);
47+
48+
// Load iplug parameters into the GUI thread visible values
49+
50+
for (int i = 0; i < NParams(); ++i)
51+
parameters.getParameter(i)->setNormalized(GetParam(i)->GetNormalized());
52+
4753
return kResultTrue;
4854
}
4955

@@ -80,17 +86,15 @@ tresult PLUGIN_API IPlugVST3Controller::getState(IBStream* pState)
8086

8187
ParamValue PLUGIN_API IPlugVST3Controller::getParamNormalized(ParamID tag)
8288
{
83-
if (tag >= kBypassParam)
84-
return EditControllerEx1::getParamNormalized(tag);
85-
86-
return IPlugVST3ControllerBase::GetParamNormalized(this, tag);
89+
return IPlugVST3ControllerBase::GetParamNormalized(parameters, tag);
8790
}
8891

8992
tresult PLUGIN_API IPlugVST3Controller::setParamNormalized(ParamID tag, ParamValue value)
9093
{
91-
IPlugVST3ControllerBase::SetParamNormalized(this, tag, value);
92-
93-
return EditControllerEx1::setParamNormalized(tag, value);
94+
if (IPlugVST3ControllerBase::SetParamNormalized(this, parameters, tag, value))
95+
return kResultTrue;
96+
else
97+
return kResultFalse;
9498
}
9599

96100
tresult PLUGIN_API IPlugVST3Controller::getMidiControllerAssignment(int32 busIndex, int16 midiChannel, CtrlNumber midiCCNumber, ParamID& tag)
@@ -278,3 +282,9 @@ void IPlugVST3Controller::SendArbitraryMsgFromUI(int msgTag, int ctrlTag, int da
278282
message->getAttributes()->setBinary("D", pData, dataSize);
279283
sendMessage(message);
280284
}
285+
286+
void IPlugVST3Controller::SendParameterValueFromUI(int paramIdx, double normalisedValue)
287+
{
288+
IPlugVST3ControllerBase::SetVST3ParamNormalized(parameters, paramIdx, normalisedValue);
289+
IPlugAPIBase::SendParameterValueFromUI(paramIdx, normalisedValue);
290+
}

IPlug/VST3/IPlugVST3_Controller.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class IPlugVST3Controller : public Steinberg::Vst::EditControllerEx1
104104
void SendMidiMsgFromUI(const IMidiMsg& msg) override;
105105
void SendSysexMsgFromUI(const ISysEx& msg) override;
106106
void SendArbitraryMsgFromUI(int msgTag, int ctrlTag = kNoTag, int dataSize = 0, const void* pData = nullptr) override;
107+
void SendParameterValueFromUI(int paramIdx, double normalisedValue) override;
107108

108109
Steinberg::Vst::IComponentHandler* GetComponentHandler() const { return componentHandler; }
109110
ViewType* GetView() const { return mView; }

IPlug/VST3/IPlugVST3_ControllerBase.h

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,17 @@ class IPlugVST3ControllerBase
154154
#endif
155155
}
156156

157-
Steinberg::Vst::ParamValue PLUGIN_API GetParamNormalized(IPlugAPIBase* pPlug, Steinberg::Vst::ParamID tag)
157+
Steinberg::Vst::ParamValue GetParamNormalized(Steinberg::Vst::ParameterContainer& parameters, Steinberg::Vst::ParamID tag)
158158
{
159-
IParam* param = pPlug->GetParam(tag);
160-
161-
if (param)
162-
{
163-
return param->GetNormalized();
164-
}
165-
166-
return 0.0;
159+
Steinberg::Vst::Parameter* parameter = parameters.getParameter(tag);
160+
return parameter ? parameter->getNormalized() : 0.0;
167161
}
168162

169-
void PLUGIN_API SetParamNormalized(IPlugAPIBase* pPlug, Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value)
163+
bool SetParamNormalized(IPlugAPIBase* pPlug, Steinberg::Vst::ParameterContainer& parameters, Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value)
170164
{
165+
if (!SetVST3ParamNormalized(parameters, tag, value))
166+
return false;
167+
171168
if (tag >= kBypassParam)
172169
{
173170
switch (tag)
@@ -190,14 +187,11 @@ class IPlugVST3ControllerBase
190187
pParam->SetNormalized(value);
191188
pPlug->OnParamChangeUI(tag, kHost);
192189

193-
// in VST3, parameter changes are managed by the host
194-
#if !defined VST3C_API // && !defined VST3_API //TODO
195-
pPlug->SendParameterValueFromAPI(tag, value, true);
196-
#else
197190
pPlug->SendParameterValueFromDelegate(tag, value, true);
198-
#endif
199191
}
200192
}
193+
194+
return true;
201195
}
202196

203197
bool SetChannelContextInfos(Steinberg::Vst::IAttributeList* pList)
@@ -303,6 +297,19 @@ class IPlugVST3ControllerBase
303297
return false;
304298
}
305299

300+
protected:
301+
302+
bool SetVST3ParamNormalized(Steinberg::Vst::ParameterContainer& parameters, Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value)
303+
{
304+
Steinberg::Vst::Parameter* parameter = parameters.getParameter(tag);
305+
306+
if (!parameter)
307+
return false;
308+
309+
parameter->setNormalized(value);
310+
return true;
311+
}
312+
306313
public:
307314
IPlugVST3BypassParameter* mBypassParameter = nullptr;
308315

IPlug/VST3/IPlugVST3_Processor.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ tresult PLUGIN_API IPlugVST3Processor::initialize(FUnknown* context)
3737
Initialize(this);
3838
IPlugVST3GetHost(this, context);
3939
OnHostIdentified();
40+
OnParamReset(kReset);
41+
4042
return kResultOk;
4143
}
4244

0 commit comments

Comments
 (0)