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
31uint32 PLUGIN_API IPlugVST3Processor::getTailSamples()
32{
33 return GetTailIsInfinite() ? kInfiniteTail : GetTailSize();
34}
35
36tresult PLUGIN_API IPlugVST3Processor::initialize(FUnknown* context)
37{
38 TRACE
39
40 if (AudioEffect::initialize(context) == kResultOk)
41 {
42 Initialize(this);
43 IPlugVST3GetHost(this, context);
45 OnParamReset(kReset);
46
47 return kResultOk;
48 }
49
50 return kResultFalse;
51}
52
53tresult PLUGIN_API IPlugVST3Processor::terminate()
54{
55 return AudioEffect::terminate();
56}
57
58tresult PLUGIN_API IPlugVST3Processor::setBusArrangements(SpeakerArrangement* pInputBusArrangements, int32 numInBuses, SpeakerArrangement* pOutputBusArrangements, int32 numOutBuses)
59{
60 TRACE
61
62 return SetBusArrangements(this, pInputBusArrangements, numInBuses, pOutputBusArrangements, numOutBuses) ? kResultTrue : kResultFalse;
63}
64
65tresult PLUGIN_API IPlugVST3Processor::setActive(TBool state)
66{
67 TRACE
68
69 OnActivate((bool) state);
70 return AudioEffect::setActive(state);
71}
72
73tresult PLUGIN_API IPlugVST3Processor::setupProcessing(ProcessSetup& newSetup)
74{
75 TRACE
76
77 return SetupProcessing(newSetup, processSetup) ? kResultOk : kResultFalse;
78}
79
80tresult PLUGIN_API IPlugVST3Processor::setProcessing(TBool state)
81{
82 Trace(TRACELOC, " state: %i", state);
83
84 return SetProcessing((bool) state) ? kResultOk : kResultFalse;
85}
86
87tresult PLUGIN_API IPlugVST3Processor::process(ProcessData& data)
88{
89 TRACE
90
91 Process(data, processSetup, audioInputs, audioOutputs, mMidiMsgsFromEditor, mMidiMsgsFromProcessor, mSysExDataFromEditor, mSysexBuf);
92 return kResultOk;
93}
94
95tresult PLUGIN_API IPlugVST3Processor::canProcessSampleSize(int32 symbolicSampleSize)
96{
97 return CanProcessSampleSize(symbolicSampleSize) ? kResultTrue : kResultFalse;
98}
99
100tresult PLUGIN_API IPlugVST3Processor::setState(IBStream* pState)
101{
102 TRACE
103
104 return IPlugVST3State::SetState(this, pState) ? kResultOk : kResultFalse;
105}
106
107tresult PLUGIN_API IPlugVST3Processor::getState(IBStream* pState)
108{
109 TRACE
110
111 return IPlugVST3State::GetState(this, pState) ? kResultOk :kResultFalse;
112}
113
114#pragma mark IEditorDelegate overrides
115
116void IPlugVST3Processor::SendControlValueFromDelegate(int ctrlTag, double normalizedValue)
117{
118 OPtr<IMessage> message = allocateMessage();
119
120 if (!message)
121 return;
122
123 message->setMessageID("SCVFD");
124 message->getAttributes()->setInt("CT", ctrlTag);
125 message->getAttributes()->setFloat("NV", normalizedValue);
126
127 sendMessage(message);
128}
129
130void IPlugVST3Processor::SendControlMsgFromDelegate(int ctrlTag, int msgTag, int dataSize, const void* pData)
131{
132 OPtr<IMessage> message = allocateMessage();
133
134 if (!message)
135 return;
136
137 message->setMessageID("SCMFD");
138 message->getAttributes()->setInt("CT", ctrlTag);
139 message->getAttributes()->setInt("MT", msgTag);
140 message->getAttributes()->setBinary("D", pData, dataSize);
141
142 sendMessage(message);
143}
144
145void IPlugVST3Processor::SendArbitraryMsgFromDelegate(int msgTag, int dataSize, const void* pData)
146{
147 OPtr<IMessage> message = allocateMessage();
148
149 if (!message)
150 return;
151
152 if (dataSize == 0) // allow sending messages with no data
153 {
154 dataSize = 1;
155 uint8_t dummy = 0;
156 pData = &dummy;
157 }
158
159 message->setMessageID("SAMFD");
160 message->getAttributes()->setInt("MT", msgTag);
161 message->getAttributes()->setBinary("D", pData, dataSize);
162 sendMessage(message);
163}
164
165#pragma mark IConnectionPoint override
166
167tresult PLUGIN_API IPlugVST3Processor::notify(IMessage* message)
168{
169 if (!message)
170 return kInvalidArgument;
171
172 const void* data = nullptr;
173 uint32 size;
174
175 if (!strcmp(message->getMessageID(), "SMMFUI")) // midi message from UI
176 {
177 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
178 {
179 if (size == sizeof(IMidiMsg))
180 {
181 IMidiMsg msg;
182 memcpy(&msg, data, size);
183 mMidiMsgsFromEditor.Push(msg);
184 return kResultOk;
185 }
186
187 return kResultFalse;
188 }
189 }
190 if (!strcmp(message->getMessageID(), "SSMFUI")) // sysex message from UI
191 {
192 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
193 {
194 int64 offset = 0;
195 message->getAttributes()->getInt("O", offset);
196 SysExData sysex {(int) offset, (int) size, data};
197 mSysExDataFromEditor.Push(sysex);
198 return kResultOk;
199 }
200 return kResultFalse;
201 }
202 else if (!strcmp(message->getMessageID(), "SAMFUI")) // message from UI
203 {
204 int64 msgTag;
205 int64 ctrlTag;
206
207 if (message->getAttributes()->getInt("MT", msgTag) == kResultOk && message->getAttributes()->getInt("CT", ctrlTag) == kResultOk)
208 {
209 if (message->getAttributes()->getBinary("D", data, size) == kResultOk)
210 {
211 if(OnMessage((int) msgTag, (int) ctrlTag, size, data))
212 {
213 return kResultOk;
214 }
215 }
216
217 return kResultFalse;
218 }
219 }
220
221 return AudioEffect::notify(message);
222}
223
224#pragma mark Messaging overrides
225
226void IPlugVST3Processor::TransmitMidiMsgFromProcessor(const IMidiMsg& msg)
227{
228 OPtr<IMessage> message = allocateMessage();
229
230 if (!message)
231 return;
232
233 message->setMessageID("SMMFD");
234 message->getAttributes()->setBinary("D", (void*) &msg, sizeof(IMidiMsg));
235 sendMessage(message);
236}
237
238void IPlugVST3Processor::TransmitSysExDataFromProcessor(const SysExData& data)
239{
240 OPtr<IMessage> message = allocateMessage();
241
242 if (!message)
243 return;
244
245 message->setMessageID("SSMFD");
246 message->getAttributes()->setBinary("D", (void*) data.mData, data.mSize);
247 message->getAttributes()->setInt("O", data.mOffset);
248 sendMessage(message);
249}
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
bool GetTailIsInfinite() const
int GetTailSize() const
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