iPlug2 - C++ Audio Plug-in Framework
IPlugProcessor.h
Go to the documentation of this file.
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 #pragma once
12 
13 #include <cstring>
14 #include <cstdint>
15 #include <ctime>
16 #include <cmath>
17 #include <cstdio>
18 #include <cassert>
19 #include <memory>
20 #include <vector>
21 
22 #include "ptrlist.h"
23 
24 #include "IPlugPlatform.h"
25 #include "IPlugConstants.h"
26 #include "IPlugStructs.h"
27 #include "IPlugUtilities.h"
28 #include "NChanDelay.h"
29 
35 BEGIN_IPLUG_NAMESPACE
36 
37 struct Config;
38 
41 {
42 public:
46  IPlugProcessor(const Config& config, EAPI plugAPI);
47  virtual ~IPlugProcessor();
48 
49  IPlugProcessor(const IPlugProcessor&) = delete;
50  IPlugProcessor& operator=(const IPlugProcessor&) = delete;
51 
52 #pragma mark - Methods you implement in your plug-in class - you do not call these methods
53 
62  virtual void ProcessBlock(sample** inputs, sample** outputs, int nFrames);
63 
68  virtual void ProcessMidiMsg(const IMidiMsg& msg);
69 
72  virtual void ProcessSysEx(ISysEx& msg) {}
73 
75  virtual void OnReset() { TRACE }
76 
81  virtual void OnActivate(bool active) { TRACE }
82 
83 #pragma mark - Methods you can call - some of which have custom implementations in the API classes, some implemented in IPlugProcessor.cpp
84 
88  virtual bool SendMidiMsg(const IMidiMsg& msg) = 0;
89 
93  virtual bool SendMidiMsgs(WDL_TypedBuf<IMidiMsg>& msgs);
94 
98  virtual bool SendSysEx(const ISysEx& msg) { return false; }
99 
101  double GetSampleRate() const { return mSampleRate; }
102 
104  int GetBlockSize() const { return mBlockSize; }
105 
107  int GetLatency() const { return mLatency; }
108 
110  int GetTailSize() { return mTailSize; }
111 
113  bool GetBypassed() const { return mBypassed; }
114 
116  bool GetRenderingOffline() const { return mRenderingOffline; };
117 
118 #pragma mark -
119 
120  double GetSamplePos() const { return mTimeInfo.mSamplePos; }
121 
123  double GetTempo() const { return mTimeInfo.mTempo; }
124 
126  double GetSamplesPerBeat() const;
127 
130  void GetTimeSig(int& numerator, int& denominator) const { numerator = mTimeInfo.mNumerator; denominator = mTimeInfo.mDenominator; }
131 
132 #pragma mark -
133 
139  virtual void GetBusName(ERoute direction, int busIdx, int nBuses, WDL_String& str) const;
140 
142  int NIOConfigs() const { return mIOConfigs.GetSize(); }
143 
145  const IOConfig* GetIOConfig(int idx) const { return mIOConfigs.Get(idx); }
146 
148  int GetIOConfigWithChanCounts(std::vector<int>& inputBuses, std::vector<int>& outputBuses);
149 
154  int MaxNBuses(ERoute direction, int* pConfigIdxWithTheMostBuses = nullptr) const;
155 
160  int MaxNChannelsForBus(ERoute direction, int busIdx) const;
161 
165  bool HasWildcardBus(ERoute direction) const { return mIOConfigs.Get(0)->ContainsWildcard(direction); } // \todo only supports a single I/O config
166 
169  int MaxNChannels(ERoute direction) const { return mChannelData[direction].GetSize(); }
170 
174  bool IsChannelConnected(ERoute direction, int chIdx) const { return (chIdx < mChannelData[direction].GetSize() && mChannelData[direction].Get(chIdx)->mConnected); }
175 
178  int NChannelsConnected(ERoute direction) const;
179 
182  inline int NInChansConnected() const { return NChannelsConnected(ERoute::kInput); }
183 
186  inline int NOutChansConnected() const { return NChannelsConnected(ERoute::kOutput); }
187 
192  bool LegalIO(int NInputChans, int NOutputChans) const; //TODO: this should be updated
193 
195  bool HasSidechainInput() const { return MaxNBuses(ERoute::kInput) > 1; }
196 
198  void LimitToStereoIO();//TODO: this should be updated
199 
201  bool IsInstrument() const { return mPlugType == EIPlugPluginType::kInstrument; }
202 
204  bool IsMidiEffect() const { return mPlugType == EIPlugPluginType::kMIDIEffect; }
205 
207  int GetAUPluginType() const;
208 
210  bool DoesMIDIIn() const { return mDoesMIDIIn; }
211 
213  bool DoesMIDIOut() const { return mDoesMIDIOut; }
214 
216  bool DoesMPE() const { return mDoesMPE; }
217 
224  void SetChannelLabel(ERoute direction, int idx, const char* formatStr, bool zeroBased = false);
225 
229  virtual void SetLatency(int latency);
230 
235  void SetTailSize(int tailSize) { mTailSize = tailSize; }
236 
248  static int ParseChannelIOStr(const char* IOStr, WDL_PtrList<IOConfig>& channelIOList, int& totalNInChans, int& totalNOutChans, int& totalNInBuses, int& totalNOutBuses);
249 
250 protected:
251 #pragma mark - Methods called by the API class - you do not call these methods in your plug-in class
252  void SetChannelConnections(ERoute direction, int idx, int n, bool connected);
253 
254  //The following methods are duplicated, in order to deal with either single or double precision processing,
255  //depending on the value of arguments passed in
256  void AttachBuffers(ERoute direction, int idx, int n, PLUG_SAMPLE_DST** ppData, int nFrames);
257  void AttachBuffers(ERoute direction, int idx, int n, PLUG_SAMPLE_SRC** ppData, int nFrames);
258  void PassThroughBuffers(PLUG_SAMPLE_SRC type, int nFrames);
259  void PassThroughBuffers(PLUG_SAMPLE_DST type, int nFrames);
260  void ProcessBuffers(PLUG_SAMPLE_SRC type, int nFrames);
261  void ProcessBuffers(PLUG_SAMPLE_DST type, int nFrames);
262  void ProcessBuffersAccumulating(int nFrames); // only for VST2 deprecated method single precision
263  void ZeroScratchBuffers();
264  void SetSampleRate(double sampleRate) { mSampleRate = sampleRate; }
265  void SetBlockSize(int blockSize);
266  void SetBypassed(bool bypassed) { mBypassed = bypassed; }
267  void SetTimeInfo(const ITimeInfo& timeInfo) { mTimeInfo = timeInfo; }
268  void SetRenderingOffline(bool renderingOffline) { mRenderingOffline = renderingOffline; }
269  const WDL_String& GetChannelLabel(ERoute direction, int idx) { return mChannelData[direction].Get(idx)->mLabel; }
270 
271 private:
273  EIPlugPluginType mPlugType;
275  bool mDoesMIDIIn;
277  bool mDoesMIDIOut;
279  bool mDoesMPE;
281  int mLatency;
283  double mSampleRate = DEFAULT_SAMPLE_RATE;
285  int mBlockSize = 0;
287  int mTailSize = 0;
289  bool mBypassed = false;
291  bool mRenderingOffline = false;
293  WDL_PtrList<IOConfig> mIOConfigs;
294  /* Manages pointers to the actual data for each channel */
295  WDL_TypedBuf<sample*> mScratchData[2];
296  /* A list of IChannelData structures corresponding to every input/output channel */
297  WDL_PtrList<IChannelData<>> mChannelData[2];
298 protected: // these members are protected because they need to be access by the API classes, and don't want a setter/getter
300  std::unique_ptr<NChanDelayLine<sample>> mLatencyDelay = nullptr;
303 };
304 
305 END_IPLUG_NAMESPACE
int MaxNChannels(ERoute direction) const
int NIOConfigs() const
IPlugProcessor(const Config &config, EAPI plugAPI)
IPlugProcessor constructor.
Utility functions and macros.
void GetTimeSig(int &numerator, int &denominator) const
int GetBlockSize() const
bool DoesMPE() const
static int ParseChannelIOStr(const char *IOStr, WDL_PtrList< IOConfig > &channelIOList, int &totalNInChans, int &totalNOutChans, int &totalNInBuses, int &totalNOutBuses)
A static method to parse the config.h channel I/O string.
double GetSampleRate() const
Encapsulates a MIDI message and provides helper functions.
Definition: IPlugMidi.h:30
Include to get consistently named preprocessor macros for different platforms and logging functionali...
virtual void SetLatency(int latency)
Call this if the latency of your plug-in changes after initialization (perhaps from OnReset() ) This ...
bool DoesMIDIOut() const
An IOConfig is used to store bus info for each input/output configuration defined in the channel io s...
Definition: IPlugStructs.h:500
bool IsInstrument() const
double GetSamplesPerBeat() const
int GetLatency() const
virtual void GetBusName(ERoute direction, int busIdx, int nBuses, WDL_String &str) const
Get the name for a particular bus.
void SetChannelLabel(ERoute direction, int idx, const char *formatStr, bool zeroBased=false)
This allows you to label input/output channels in supporting VST2 hosts.
virtual bool SendMidiMsg(const IMidiMsg &msg)=0
Send a single MIDI message // TODO: info about what thread should this be called on or not called on!...
bool GetBypassed() const
IPlug Constant definitions, Types, magic numbers.
void SetTailSize(int tailSize)
Call this method if you need to update the tail size at runtime, for example if the decay time of you...
ERoute
Used to identify whether a bus/channel connection is an input or an output.
virtual void ProcessBlock(sample **inputs, sample **outputs, int nFrames)
Override in your plug-in class to process audio In ProcessBlock you are always guaranteed to get vali...
bool HasWildcardBus(ERoute direction) const
Check if we have any wildcard characters in the channel I/O configs.
const IOConfig * GetIOConfig(int idx) const
int MaxNBuses(ERoute direction, int *pConfigIdxWithTheMostBuses=nullptr) const
Used to determine the maximum number of input or output buses based on what was specified in the chan...
bool IsChannelConnected(ERoute direction, int chIdx) const
virtual void ProcessSysEx(ISysEx &msg)
Override this method to handle incoming MIDI System Exclusive (SysEx) messages.
bool HasSidechainInput() const
bool DoesMIDIIn() const
virtual void ProcessMidiMsg(const IMidiMsg &msg)
Override this method to handle incoming MIDI messages.
The base class for IPlug Audio Processing.
virtual bool SendSysEx(const ISysEx &msg)
Send a single MIDI System Exclusive (SysEx) message // TODO: info about what thread should this be ca...
bool LegalIO(int NInputChans, int NOutputChans) const
Check if a certain configuration of input channels and output channels is allowed based on the channe...
ITimeInfo mTimeInfo
Contains detailed information about the transport state.
virtual void OnReset()
Override this method in your plug-in class to do something prior to playback etc. ...
bool IsMidiEffect() const
int GetIOConfigWithChanCounts(std::vector< int > &inputBuses, std::vector< int > &outputBuses)
int NInChansConnected() const
Convenience method to find out how many input channels are connected.
std::unique_ptr< NChanDelayLine< sample > > mLatencyDelay
A multi-channel delay line used to delay the bypassed signal when a plug-in with latency is bypassed...
A struct for dealing with SysEx messages.
Definition: IPlugMidi.h:538
double GetSamplePos() const
void LimitToStereoIO()
This is called by IPlugVST in order to limit a plug-in to stereo I/O for certain picky hosts...
int GetAUPluginType() const
virtual bool SendMidiMsgs(WDL_TypedBuf< IMidiMsg > &msgs)
Send a collection of MIDI messages // TODO: info about what thread should this be called on or not ca...
int NOutChansConnected() const
Convenience method to find out how many output channels are connected.
Encapsulates information about the host transport state.
Definition: IPlugStructs.h:581
int MaxNChannelsForBus(ERoute direction, int busIdx) const
For a given input or output bus what is the maximum possible number of channels.
bool GetRenderingOffline() 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 ...
double GetTempo() const
int NChannelsConnected(ERoute direction) const