iPlug2 - C++ Audio Plug-in Framework
IPlugVST3_Processor.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_Processor.h"
12 
13 #pragma mark - IPlugVST3Processor Constructor/Destructor
14 
15 using namespace iplug;
16 using namespace Steinberg;
17 using namespace Vst;
18 
19 IPlugVST3Processor::IPlugVST3Processor(const InstanceInfo& info, const Config& config)
20 : IPlugAPIBase(config, kAPIVST3)
21 , IPlugVST3ProcessorBase(config, *this)
22 {
23  setControllerClass(info.mOtherGUID);
24  CreateTimer();
25 }
26 
27 IPlugVST3Processor::~IPlugVST3Processor() {}
28 
29 #pragma mark AudioEffect overrides
30 
31 tresult PLUGIN_API IPlugVST3Processor::initialize(FUnknown* context)
32 {
33  TRACE
34 
35  if (AudioEffect::initialize(context) == kResultOk)
36  {
37  Initialize(this);
38  IPlugVST3GetHost(this, context);
39  OnHostIdentified();
40  OnParamReset(kReset);
41 
42  return kResultOk;
43  }
44 
45  return kResultFalse;
46 }
47 
48 tresult PLUGIN_API IPlugVST3Processor::terminate()
49 {
50  return AudioEffect::terminate();
51 }
52 
53 tresult PLUGIN_API IPlugVST3Processor::setBusArrangements(SpeakerArrangement* pInputBusArrangements, int32 numInBuses, SpeakerArrangement* pOutputBusArrangements, int32 numOutBuses)
54 {
55  TRACE
56 
57  return SetBusArrangements(this, pInputBusArrangements, numInBuses, pOutputBusArrangements, numOutBuses) ? kResultTrue : kResultFalse;
58 }
59 
60 tresult PLUGIN_API IPlugVST3Processor::setActive(TBool state)
61 {
62  TRACE
63 
64  OnActivate((bool) state);
65  return AudioEffect::setActive(state);
66 }
67 
68 tresult PLUGIN_API IPlugVST3Processor::setupProcessing(ProcessSetup& newSetup)
69 {
70  TRACE
71 
72  return SetupProcessing(newSetup, processSetup) ? kResultOk : kResultFalse;
73 }
74 
75 tresult PLUGIN_API IPlugVST3Processor::setProcessing(TBool state)
76 {
77  Trace(TRACELOC, " state: %i", state);
78 
79  return SetProcessing((bool) state) ? kResultOk : kResultFalse;
80 }
81 
82 tresult PLUGIN_API IPlugVST3Processor::process(ProcessData& data)
83 {
84  TRACE
85 
86  Process(data, processSetup, audioInputs, audioOutputs, mMidiMsgsFromEditor, mMidiMsgsFromProcessor, mSysExDataFromEditor, mSysexBuf);
87  return kResultOk;
88 }
89 
90 tresult PLUGIN_API IPlugVST3Processor::canProcessSampleSize(int32 symbolicSampleSize)
91 {
92  return CanProcessSampleSize(symbolicSampleSize) ? kResultTrue : kResultFalse;
93 }
94 
95 tresult PLUGIN_API IPlugVST3Processor::setState(IBStream* pState)
96 {
97  TRACE
98 
99  return IPlugVST3State::SetState(this, pState) ? kResultOk : kResultFalse;
100 }
101 
102 tresult PLUGIN_API IPlugVST3Processor::getState(IBStream* pState)
103 {
104  TRACE
105 
106  return IPlugVST3State::GetState(this, pState) ? kResultOk :kResultFalse;
107 }
108 
109 #pragma mark IEditorDelegate overrides
110 
111 void IPlugVST3Processor::SendControlValueFromDelegate(int ctrlTag, double normalizedValue)
112 {
113  OPtr<IMessage> message = allocateMessage();
114 
115  if (!message)
116  return;
117 
118  message->setMessageID("SCVFD");
119  message->getAttributes()->setInt("CT", ctrlTag);
120  message->getAttributes()->setFloat("NV", normalizedValue);
121 
122  sendMessage(message);
123 }
124 
125 void IPlugVST3Processor::SendControlMsgFromDelegate(int ctrlTag, int msgTag, int dataSize, const void* pData)
126 {
127  OPtr<IMessage> message = allocateMessage();
128 
129  if (!message)
130  return;
131 
132  message->setMessageID("SCMFD");
133  message->getAttributes()->setInt("CT", ctrlTag);
134  message->getAttributes()->setInt("MT", msgTag);
135  message->getAttributes()->setBinary("D", pData, dataSize);
136 
137  sendMessage(message);
138 }
139 
140 void IPlugVST3Processor::SendArbitraryMsgFromDelegate(int msgTag, int dataSize, const void* pData)
141 {
142  OPtr<IMessage> message = allocateMessage();
143 
144  if (!message)
145  return;
146 
147  if (dataSize == 0) // allow sending messages with no data
148  {
149  dataSize = 1;
150  uint8_t dummy = 0;
151  pData = &dummy;
152  }
153 
154  message->setMessageID("SAMFD");
155  message->getAttributes()->setInt("MT", msgTag);
156  message->getAttributes()->setBinary("D", pData, dataSize);
157  sendMessage(message);
158 }
159 
160 #pragma mark IConnectionPoint override
161 
162 tresult PLUGIN_API IPlugVST3Processor::notify(IMessage* message)
163 {
164  if (!message)
165  return kInvalidArgument;
166 
167  const void* data = nullptr;
168  uint32 size;
169 
170  if (!strcmp(message->getMessageID(), "SMMFUI")) // midi message from UI
171  {
172  if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
173  {
174  if (size == sizeof(IMidiMsg))
175  {
176  IMidiMsg msg;
177  memcpy(&msg, data, size);
178  mMidiMsgsFromEditor.Push(msg);
179  return kResultOk;
180  }
181 
182  return kResultFalse;
183  }
184  }
185  else if (!strcmp(message->getMessageID(), "SAMFUI")) // message from UI
186  {
187  int64 msgTag;
188  int64 ctrlTag;
189 
190  if (message->getAttributes()->getInt("MT", msgTag) == kResultOk && message->getAttributes()->getInt("CT", ctrlTag) == kResultOk)
191  {
192  if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
193  {
194  if(OnMessage((int) msgTag, (int) ctrlTag, size, data))
195  {
196  return kResultOk;
197  }
198  }
199 
200  return kResultFalse;
201  }
202  }
203 
204  return AudioEffect::notify(message);
205 }
206 
207 #pragma mark Messaging overrides
208 
209 void IPlugVST3Processor::TransmitMidiMsgFromProcessor(const IMidiMsg& msg)
210 {
211  OPtr<IMessage> message = allocateMessage();
212 
213  if (!message)
214  return;
215 
216  message->setMessageID("SMMFD");
217  message->getAttributes()->setBinary("D", (void*) &msg, sizeof(IMidiMsg));
218  sendMessage(message);
219 }
220 
221 void IPlugVST3Processor::TransmitSysExDataFromProcessor(const SysExData& data)
222 {
223  OPtr<IMessage> message = allocateMessage();
224 
225  if (!message)
226  return;
227 
228  message->setMessageID("SSMFD");
229  message->getAttributes()->setBinary("D", (void*) data.mData, data.mSize);
230  message->getAttributes()->setInt("O", data.mOffset);
231  sendMessage(message);
232 }
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
VST3 Processor API-base class for a distributed IPlug VST3 plug-in.
Shared VST3 processor code.
This structure is used when queueing Sysex messages.
Definition: IPlugStructs.h:44