iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
IPlugVST3_Controller.cpp
1/*
2 ==============================================================================
3
4 This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5
6 See LICENSE.txt for more info.
7
8 ==============================================================================
9*/
10
12
13#include "pluginterfaces/base/ustring.h"
14#include "pluginterfaces/base/ibstream.h"
15#include "pluginterfaces/vst/ivstmidicontrollers.h"
16//#include "public.sdk/source/vst/vstpresetfile.cpp"
17
18#include "IPlugVST3_Parameter.h"
19
20using namespace iplug;
21using namespace Steinberg;
22using namespace Vst;
23
24IPlugVST3Controller::IPlugVST3Controller(const InstanceInfo& info, const Config& config)
25: IPlugAPIBase(config, kAPIVST3)
26, mPlugIsInstrument(config.plugType == kInstrument)
27, mDoesMidiIn(config.plugDoesMidiIn)
28, mProcessorGUID(info.mOtherGUID)
29, IPlugVST3ControllerBase(parameters)
30{
31 CreateTimer();
32}
33
34IPlugVST3Controller::~IPlugVST3Controller()
35{
36}
37
38#pragma mark IEditController overrides
39
40tresult PLUGIN_API IPlugVST3Controller::initialize(FUnknown* context)
41{
42 if (EditControllerEx1::initialize(context) == kResultTrue)
43 {
44 Initialize(this, mPlugIsInstrument, mDoesMidiIn);
45 IPlugVST3GetHost(this, context);
47 OnParamReset(kReset);
48
49 // Load iplug parameters into the GUI thread visible values
50
51 for (int i = 0; i < NParams(); ++i)
52 parameters.getParameter(i)->setNormalized(GetParam(i)->GetNormalized());
53
54 return kResultTrue;
55 }
56
57 return kResultFalse;
58}
59
60IPlugView* PLUGIN_API IPlugVST3Controller::createView(const char* name)
61{
62 if (HasUI() && name && strcmp(name, "editor") == 0)
63 {
64 mView = new ViewType(*this);
65 return mView;
66 }
67
68 return nullptr;
69}
70
71tresult PLUGIN_API IPlugVST3Controller::setComponentState(IBStream* pState)
72{
73 return IPlugVST3State::SetState(this, pState) ? kResultOk : kResultFalse;
74}
75
76tresult PLUGIN_API IPlugVST3Controller::setState(IBStream* pState)
77{
78 // Currently nothing to do here
79 return kResultOk;
80}
81
82tresult PLUGIN_API IPlugVST3Controller::getState(IBStream* pState)
83{
84// Currently nothing to do here
85 return kResultOk;
86}
87
88ParamValue PLUGIN_API IPlugVST3Controller::getParamNormalized(ParamID tag)
89{
90 return IPlugVST3ControllerBase::GetParamNormalized(tag);
91}
92
93tresult PLUGIN_API IPlugVST3Controller::setParamNormalized(ParamID tag, ParamValue value)
94{
95 if (IPlugVST3ControllerBase::SetParamNormalized(this, tag, value))
96 return kResultTrue;
97 else
98 return kResultFalse;
99}
100
101tresult PLUGIN_API IPlugVST3Controller::getMidiControllerAssignment(int32 busIndex, int16 midiChannel, CtrlNumber midiCCNumber, ParamID& tag)
102{
103 if (busIndex == 0 && midiChannel < VST3_NUM_CC_CHANS)
104 {
105 tag = kMIDICCParamStartIdx + (midiChannel * kCountCtrlNumber) + midiCCNumber;
106 return kResultTrue;
107 }
108
109 return kResultFalse;
110}
111
112#pragma mark IUnitInfo overrides
113
114//void IPlugVST3Controller::InformHostOfPresetChange()
115//{
116// if (NPresets())
117// {
118// // beginEdit(kPresetParam);
119// // performEdit(kPresetParam, ToNormalizedParam(mCurrentPresetIdx, 0., NPresets(), 1.));
120// // endEdit(kPresetParam);
121//
122// notifyProgramListChange(kPresetParam, mCurrentPresetIdx);
123// }
124//}
125
126#pragma mark IInfoListener overrides
127
128Steinberg::tresult PLUGIN_API IPlugVST3Controller::setChannelContextInfos(Steinberg::Vst::IAttributeList* pList)
129{
130 return IPlugVST3ControllerBase::SetChannelContextInfos(pList) ? kResultTrue : kResultFalse;
131}
132
133#pragma mark -
134
135bool IPlugVST3Controller::EditorResize(int viewWidth, int viewHeight)
136{
137 if (HasUI())
138 {
139 if (viewWidth != GetEditorWidth() || viewHeight != GetEditorHeight())
140 mView->Resize(viewWidth, viewHeight);
141
142 SetEditorSize(viewWidth, viewHeight);
143 }
144
145 return true;
146}
147
149{
150 for (int i = 0; i < NParams(); i++)
151 IPlugVST3ControllerBase::SetVST3ParamNormalized(i, GetParam(i)->GetNormalized());
152
153 startGroupEdit();
155 finishGroupEdit();
156}
157
158#pragma mark Message with Processor
159
160tresult PLUGIN_API IPlugVST3Controller::notify(IMessage* message)
161{
162 if (!message)
163 return kInvalidArgument;
164
165 if (!strcmp(message->getMessageID(), "SCVFD"))
166 {
167 Steinberg::int64 ctrlTag = kNoTag;
168 double normalizedValue = 0.;
169
170 if(message->getAttributes()->getInt("CT", ctrlTag) == kResultFalse)
171 return kResultFalse;
172
173 if(message->getAttributes()->getFloat("NV", normalizedValue) == kResultFalse)
174 return kResultFalse;
175
176 SendControlValueFromDelegate((int) ctrlTag, normalizedValue);
177
178 }
179 else if (!strcmp(message->getMessageID(), "SCMFD"))
180 {
181 const void* data;
182 Steinberg::int64 ctrlTag = kNoTag;
183 Steinberg::int64 msgTag = kNoTag;
184
185 if(message->getAttributes()->getInt("CT", ctrlTag) == kResultFalse)
186 return kResultFalse;
187
188 if(message->getAttributes()->getInt("MT", msgTag) == kResultFalse)
189 return kResultFalse;
190
191 Steinberg::uint32 size;
192
193 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
194 {
195 SendControlMsgFromDelegate((int) ctrlTag, (int) msgTag, size, data);
196 return kResultOk;
197 }
198 }
199 else if (!strcmp(message->getMessageID(), "SMMFD"))
200 {
201 const void* data = nullptr;
202 uint32 size;
203
204 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
205 {
206 if (size == sizeof(IMidiMsg))
207 {
208 IMidiMsg msg;
209 memcpy(&msg, data, size);
210 SendMidiMsgFromDelegate(msg);
211 }
212 }
213 }
214 else if (!strcmp(message->getMessageID(), "SSMFD"))
215 {
216 const void* data = nullptr;
217 uint32 size;
218 int64 offset;
219
220 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
221 {
222 if (message->getAttributes()->getInt("O", offset) == kResultOk)
223 {
224 ISysEx msg {static_cast<int>(offset), static_cast<const uint8_t*>(data), static_cast<int>(size)};
225 SendSysexMsgFromDelegate(msg);
226 }
227 }
228 }
229
230 return ComponentBase::notify(message);
231}
232
233void IPlugVST3Controller::SendMidiMsgFromUI(const IMidiMsg& msg)
234{
235 OPtr<IMessage> message = allocateMessage();
236
237 if (!message)
238 return;
239
240 message->setMessageID("SMMFUI");
241 message->getAttributes()->setBinary("D", (void*) &msg, sizeof(IMidiMsg));
242 sendMessage(message);
243}
244
245void IPlugVST3Controller::SendSysexMsgFromUI(const ISysEx& msg)
246{
247 OPtr<IMessage> message = allocateMessage();
248
249 if (!message)
250 return;
251
252 message->setMessageID("SSMFUI");
253 message->getAttributes()->setInt("O", (int64) msg.mOffset);
254 message->getAttributes()->setBinary("D", msg.mData, msg.mSize);
255 sendMessage(message);
256}
257
258void IPlugVST3Controller::SendArbitraryMsgFromUI(int msgTag, int ctrlTag, int dataSize, const void* pData)
259{
260 OPtr<IMessage> message = allocateMessage();
261
262 if (!message)
263 return;
264
265 if (dataSize == 0) // allow sending messages with no data
266 {
267 dataSize = 1;
268 uint8_t dummy = 0;
269 pData = &dummy;
270 }
271
272 message->setMessageID("SAMFUI");
273 message->getAttributes()->setInt("MT", msgTag);
274 message->getAttributes()->setInt("CT", ctrlTag);
275 message->getAttributes()->setBinary("D", pData, dataSize);
276 sendMessage(message);
277}
278
279void IPlugVST3Controller::SendParameterValueFromUI(int paramIdx, double normalisedValue)
280{
281 IPlugVST3ControllerBase::SetVST3ParamNormalized(paramIdx, normalisedValue);
282 IPlugAPIBase::SendParameterValueFromUI(paramIdx, normalisedValue);
283}
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
Definition: IPlugAPIBase.h:43
virtual void DirtyParametersFromUI() override
In a distributed VST3 or WAM plugin, if you modify the parameters on the UI side (e....
virtual void OnHostIdentified()
Implement this to do something specific when IPlug becomes aware of the particular host that is hosti...
Definition: IPlugAPIBase.h:69
Shared VST3 controller code.
void DirtyParametersFromUI() override
In a distributed VST3 or WAM plugin, if you modify the parameters on the UI side (e....
bool EditorResize(int viewWidth, int viewHeight) override
Implementations call into the APIs resize hooks returns a bool to indicate whether the DAW or plugin ...
bool HasUI() const
Encapsulates a MIDI message and provides helper functions.
Definition: IPlugMidi.h:31
A struct for dealing with SysEx messages.
Definition: IPlugMidi.h:539