iPlug2 - C++ Audio Plug-in Framework
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 
11 #include "IPlugVST3_Controller.h"
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 
20 using namespace iplug;
21 using namespace Steinberg;
22 using namespace Vst;
23 
24 IPlugVST3Controller::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 
34 IPlugVST3Controller::~IPlugVST3Controller()
35 {
36 }
37 
38 #pragma mark IEditController overrides
39 
40 tresult PLUGIN_API IPlugVST3Controller::initialize(FUnknown* context)
41 {
42  if (EditControllerEx1::initialize(context) == kResultTrue)
43  {
44  Initialize(this, mPlugIsInstrument, mDoesMidiIn);
45  IPlugVST3GetHost(this, context);
46  OnHostIdentified();
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 
60 IPlugView* PLUGIN_API IPlugVST3Controller::createView(const char* name)
61 {
62  if (name && strcmp(name, "editor") == 0)
63  {
64  mView = new ViewType(*this);
65  return mView;
66  }
67 
68  return nullptr;
69 }
70 
71 tresult PLUGIN_API IPlugVST3Controller::setComponentState(IBStream* pState)
72 {
73  return IPlugVST3State::SetState(this, pState) ? kResultOk : kResultFalse;
74 }
75 
76 tresult PLUGIN_API IPlugVST3Controller::setState(IBStream* pState)
77 {
78  // Currently nothing to do here
79  return kResultOk;
80 }
81 
82 tresult PLUGIN_API IPlugVST3Controller::getState(IBStream* pState)
83 {
84 // Currently nothing to do here
85  return kResultOk;
86 }
87 
88 ParamValue PLUGIN_API IPlugVST3Controller::getParamNormalized(ParamID tag)
89 {
90  return IPlugVST3ControllerBase::GetParamNormalized(tag);
91 }
92 
93 tresult 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 
101 tresult 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 
128 Steinberg::tresult PLUGIN_API IPlugVST3Controller::setChannelContextInfos(Steinberg::Vst::IAttributeList* pList)
129 {
130  return IPlugVST3ControllerBase::SetChannelContextInfos(pList) ? kResultTrue : kResultFalse;
131 }
132 
133 #pragma mark -
134 
135 bool 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 
160 tresult 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 
233 void 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 
245 void 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 
258 void 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 
279 void IPlugVST3Controller::SendParameterValueFromUI(int paramIdx, double normalisedValue)
280 {
281  IPlugVST3ControllerBase::SetVST3ParamNormalized(paramIdx, normalisedValue);
282  IPlugAPIBase::SendParameterValueFromUI(paramIdx, normalisedValue);
283 }
void DirtyParametersFromUI() override
In a distributed VST3 or WAM plugin, if you modify the parameters on the UI side (e.g.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
Definition: IPlugAPIBase.h:42
Encapsulates a MIDI message and provides helper functions.
Definition: IPlugMidi.h:30
Shared VST3 controller code.
virtual void DirtyParametersFromUI() override
In a distributed VST3 or WAM plugin, if you modify the parameters on the UI side (e.g.
VST3 Controller API-base class for a distributed IPlug VST3 plug-in.
A struct for dealing with SysEx messages.
Definition: IPlugMidi.h:538
bool EditorResize(int viewWidth, int viewHeight) override
Implementations call into the APIs resize hooks returns a bool to indicate whether the DAW or plugin ...