14 #include "public.sdk/source/vst/vstbus.h" 15 #include "pluginterfaces/base/ustring.h" 16 #include "pluginterfaces/vst/ivstevents.h" 20 #include "IPlugVST3_Defs.h" 23 #ifdef CUSTOM_BUSTYPE_FUNC 24 extern uint64_t GetAPIBusTypeForChannelIOConfig(
int configIdx,
iplug::ERoute dir,
int busIdx,
const iplug::IOConfig* pConfig, WDL_TypedBuf<uint64_t>* APIBusTypes =
nullptr);
30 #ifndef CUSTOM_BUSTYPE_FUNC 31 uint64_t GetAPIBusTypeForChannelIOConfig(
int configIdx,
ERoute dir,
int busIdx,
const IOConfig* pConfig, WDL_TypedBuf<uint64_t>* APIBusTypes =
nullptr);
41 void Initialize(T* pPlug)
43 using namespace Steinberg::Vst;
45 Steinberg::Vst::String128 tmpStringBuf;
48 int configWithMostInputBuses = 0;
49 int configWithMostOutputBuses = 0;
50 MaxNBuses(ERoute::kInput, &configWithMostInputBuses);
51 int maxNOutBuses =
MaxNBuses(ERoute::kOutput, &configWithMostOutputBuses);
57 int nIn = pConfig->
NBuses(ERoute::kInput);
58 for (
auto busIdx = 0; busIdx < nIn; busIdx++)
60 uint64_t busType = GetAPIBusTypeForChannelIOConfig(configWithMostInputBuses, ERoute::kInput, busIdx, pConfig);
62 int flags = busIdx == 0 ? flags = BusInfo::BusFlags::kDefaultActive : flags = 0;
64 GetBusName(ERoute::kInput, busIdx, nIn, busName);
65 Steinberg::UString(tmpStringBuf, 128).fromAscii(busName.Get(), 128);
66 pPlug->addAudioInput(tmpStringBuf, busType, busIdx > 0 ? kAux : kMain, flags);
73 int nOut = pConfig->
NBuses(ERoute::kOutput);
75 for (
auto busIdx = 0; busIdx < nOut; busIdx++)
77 uint64_t busType = GetAPIBusTypeForChannelIOConfig(configWithMostOutputBuses, ERoute::kOutput, busIdx, pConfig);
78 int flags = busIdx == 0 ? flags = BusInfo::BusFlags::kDefaultActive : flags = 0;
80 GetBusName(ERoute::kOutput, busIdx, nOut, busName);
81 Steinberg::UString(tmpStringBuf, 128).fromAscii(busName.Get(), 128);
82 pPlug->addAudioOutput(tmpStringBuf, busType, busIdx > 0 ? kAux : kMain, flags);
89 Steinberg::UString(tmpStringBuf, 128).fromAscii(
"Dummy Output", 128);
90 pPlug->addAudioOutput(tmpStringBuf, Steinberg::Vst::SpeakerArr::kEmpty, Steinberg::Vst::BusTypes::kMain, flags);
94 pPlug->addEventInput(STR16(
"MIDI Input"), VST3_NUM_MIDI_IN_CHANS);
97 pPlug->addEventOutput(STR16(
"MIDI Output"), VST3_NUM_MIDI_OUT_CHANS);
102 void ProcessMidiOut(
IPlugQueue<SysExData>& sysExQueue,
SysExData& sysExBuf, Steinberg::Vst::IEventList* pOutputEvents, Steinberg::int32 numSamples);
106 bool SetBusArrangements(T* pPlug, Steinberg::Vst::SpeakerArrangement* pInputBusArrangements, Steinberg::int32 numInBuses, Steinberg::Vst::SpeakerArrangement* pOutputBusArrangements, Steinberg::int32 numOutBuses)
108 using namespace Steinberg::Vst;
111 SetChannelConnections(ERoute::kInput, 0,
MaxNChannels(ERoute::kInput),
false);
112 SetChannelConnections(ERoute::kOutput, 0,
MaxNChannels(ERoute::kOutput),
false);
114 const int maxNInBuses =
MaxNBuses(ERoute::kInput);
115 const int maxNOutBuses =
MaxNBuses(ERoute::kOutput);
118 if(numInBuses > maxNInBuses || numOutBuses > maxNOutBuses)
121 std::vector<int> inputBuses;
122 std::vector<int> outputBuses;
124 for(
int i = 0; i< numInBuses; i++)
126 inputBuses.push_back(SpeakerArr::getChannelCount(pInputBusArrangements[i]));
129 for(
int i = 0; i< numOutBuses; i++)
131 outputBuses.push_back(SpeakerArr::getChannelCount(pOutputBusArrangements[i]));
135 Steinberg::Vst::String128 tmpStringBuf;
139 pPlug->removeAudioBusses();
142 const int nIn = pConfig->
NBuses(ERoute::kInput);
144 for (
auto inBusIdx = 0; inBusIdx < nIn; inBusIdx++)
146 const int flags = inBusIdx == 0 ? BusInfo::BusFlags::kDefaultActive : 0;
147 SpeakerArrangement arr = GetAPIBusTypeForChannelIOConfig(matchingIdx, ERoute::kInput, inBusIdx, pConfig);
150 GetBusName(ERoute::kInput, inBusIdx, nIn, busName);
151 Steinberg::UString(tmpStringBuf, 128).fromAscii(busName.Get(), 128);
152 pPlug->addAudioInput(tmpStringBuf, arr, (BusTypes) inBusIdx > 0, flags);
155 const int nOut = pConfig->
NBuses(ERoute::kOutput);
157 for(
auto outBusIdx = 0; outBusIdx < nOut; outBusIdx++)
159 int flags = outBusIdx == 0 ? BusInfo::BusFlags::kDefaultActive : 0;
160 SpeakerArrangement arr = GetAPIBusTypeForChannelIOConfig(matchingIdx, ERoute::kOutput, outBusIdx, pConfig);
163 GetBusName(ERoute::kOutput, outBusIdx, nOut, busName);
164 Steinberg::UString(tmpStringBuf, 128).fromAscii(busName.Get(), 128);
165 pPlug->addAudioOutput(tmpStringBuf, arr, (BusTypes) outBusIdx > 0, flags);
174 void AttachBuffers(
ERoute direction,
int idx,
int n, Steinberg::Vst::AudioBusBuffers& pBus,
int nFrames, Steinberg::int32 sampleSize);
175 bool SetupProcessing(
const Steinberg::Vst::ProcessSetup& setup, Steinberg::Vst::ProcessSetup& storedSetup);
176 bool CanProcessSampleSize(Steinberg::int32 symbolicSampleSize);
177 bool SetProcessing(
bool state);
180 void PrepareProcessContext(Steinberg::Vst::ProcessData& data, Steinberg::Vst::ProcessSetup& setup);
181 void ProcessParameterChanges(Steinberg::Vst::ProcessData& data,
IPlugQueue<IMidiMsg>& fromProcessor);
182 void ProcessAudio(Steinberg::Vst::ProcessData& data, Steinberg::Vst::ProcessSetup& setup,
const Steinberg::Vst::BusList& ins,
const Steinberg::Vst::BusList& outs);
189 int mMaxNChansForMainInputBus = 0;
191 Steinberg::Vst::ProcessContext mProcessContext;
193 bool mSidechainActive =
false;
int MaxNChannels(ERoute direction) const
The base class for IPlug Audio Processing.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
A class to help with queuing timestamped MIDI messages.
Encapsulates a MIDI message and provides helper functions.
An IOConfig is used to store bus info for each input/output configuration defined in the channel io s...
virtual void GetBusName(ERoute direction, int busIdx, int nBuses, WDL_String &str) const
Get the name for a particular bus.
int NBuses(ERoute direction) const
ERoute
Used to identify whether a bus/channel connection is an input or an output.
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...
The base class for IPlug Audio Processing.
bool SendMidiMsg(const IMidiMsg &msg) override
Send a single MIDI message // TODO: info about what thread should this be called on or not called on!...
Shared VST3 processor code.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
bool IsMidiEffect() const
int GetIOConfigWithChanCounts(std::vector< int > &inputBuses, std::vector< int > &outputBuses)
This structure is used when queueing Sysex messages.