iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
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
15using namespace iplug;
16using namespace Steinberg;
17using namespace Vst;
18
19IPlugVST3Processor::IPlugVST3Processor(const InstanceInfo& info, const Config& config)
20: IPlugAPIBase(config, kAPIVST3)
21, IPlugVST3ProcessorBase(config, *this)
22{
23 setControllerClass(info.mOtherGUID);
24 CreateTimer();
25}
26
27IPlugVST3Processor::~IPlugVST3Processor() {}
28
29#pragma mark AudioEffect overrides
30
31tresult PLUGIN_API IPlugVST3Processor::initialize(FUnknown* context)
32{
33 TRACE
34
35 if (AudioEffect::initialize(context) == kResultOk)
36 {
37 Initialize(this);
38 IPlugVST3GetHost(this, context);
40 OnParamReset(kReset);
41
42 return kResultOk;
43 }
44
45 return kResultFalse;
46}
47
48tresult PLUGIN_API IPlugVST3Processor::terminate()
49{
50 return AudioEffect::terminate();
51}
52
53tresult 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
60tresult PLUGIN_API IPlugVST3Processor::setActive(TBool state)
61{
62 TRACE
63
64 OnActivate((bool) state);
65 return AudioEffect::setActive(state);
66}
67
68tresult PLUGIN_API IPlugVST3Processor::setupProcessing(ProcessSetup& newSetup)
69{
70 TRACE
71
72 return SetupProcessing(newSetup, processSetup) ? kResultOk : kResultFalse;
73}
74
75tresult PLUGIN_API IPlugVST3Processor::setProcessing(TBool state)
76{
77 Trace(TRACELOC, " state: %i", state);
78
79 return SetProcessing((bool) state) ? kResultOk : kResultFalse;
80}
81
82tresult 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
90tresult PLUGIN_API IPlugVST3Processor::canProcessSampleSize(int32 symbolicSampleSize)
91{
92 return CanProcessSampleSize(symbolicSampleSize) ? kResultTrue : kResultFalse;
93}
94
95tresult PLUGIN_API IPlugVST3Processor::setState(IBStream* pState)
96{
97 TRACE
98
99 return IPlugVST3State::SetState(this, pState) ? kResultOk : kResultFalse;
100}
101
102tresult 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
111void 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
125void 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
140void 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
162tresult 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 if (!strcmp(message->getMessageID(), "SSMFUI")) // sysex message from UI
186 {
187 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
188 {
189 int64 offset = 0;
190 message->getAttributes()->getInt("O", offset);
191 SysExData sysex {(int) offset, (int) size, data};
192 mSysExDataFromEditor.Push(sysex);
193 return kResultOk;
194 }
195 return kResultFalse;
196 }
197 else if (!strcmp(message->getMessageID(), "SAMFUI")) // message from UI
198 {
199 int64 msgTag;
200 int64 ctrlTag;
201
202 if (message->getAttributes()->getInt("MT", msgTag) == kResultOk && message->getAttributes()->getInt("CT", ctrlTag) == kResultOk)
203 {
204 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
205 {
206 if(OnMessage((int) msgTag, (int) ctrlTag, size, data))
207 {
208 return kResultOk;
209 }
210 }
211
212 return kResultFalse;
213 }
214 }
215
216 return AudioEffect::notify(message);
217}
218
219#pragma mark Messaging overrides
220
221void IPlugVST3Processor::TransmitMidiMsgFromProcessor(const IMidiMsg& msg)
222{
223 OPtr<IMessage> message = allocateMessage();
224
225 if (!message)
226 return;
227
228 message->setMessageID("SMMFD");
229 message->getAttributes()->setBinary("D", (void*) &msg, sizeof(IMidiMsg));
230 sendMessage(message);
231}
232
233void IPlugVST3Processor::TransmitSysExDataFromProcessor(const SysExData& data)
234{
235 OPtr<IMessage> message = allocateMessage();
236
237 if (!message)
238 return;
239
240 message->setMessageID("SSMFD");
241 message->getAttributes()->setBinary("D", (void*) data.mData, data.mSize);
242 message->getAttributes()->setInt("O", data.mOffset);
243 sendMessage(message);
244}
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
Definition: IPlugAPIBase.h:43
virtual void OnHostIdentified()
Implement this to do something specific when IPlug becomes aware of the particular host that is hosti...
Definition: IPlugAPIBase.h:69
virtual void OnActivate(bool active)
Override OnActivate() which should be called by the API class when a plug-in is "switched on" by the ...
Shared VST3 processor code.
Encapsulates a MIDI message and provides helper functions.
Definition: IPlugMidi.h:31
This structure is used when queueing Sysex messages.
Definition: IPlugStructs.h:45