tresult PLUGIN_API IPlugVST3Plugin::setBusArrangements(SpeakerArrangement* inputs, int32 numIns, SpeakerArrangement* outputs, int32 numOuts) { TRACE; // disconnect all io pins, they will be reconnected in process SetInputChannelConnections(0, NInChannels(), false); SetOutputChannelConnections(0, NOutChannels(), false); int32 reqNumInputChannels = SpeakerArr::getChannelCount(inputs[0]); //requested # input channels int32 reqNumOutputChannels = SpeakerArr::getChannelCount(outputs[0]);//requested # output channels // legal io doesn't consider sidechain inputs if (!LegalIO(reqNumInputChannels, reqNumOutputChannels)) { return kResultFalse; } // handle input AudioBus* bus = FCast<AudioBus>(audioInputs.at(0)); // if existing input bus has a different number of channels to the input bus being connected if (bus && SpeakerArr::getChannelCount(bus->getArrangement()) != reqNumInputChannels) { audioInputs.remove(bus); addAudioInput(USTRING("Input"), getSpeakerArrForChans(reqNumInputChannels)); } // handle output bus = FCast<AudioBus>(audioOutputs.at(0)); // if existing output bus has a different number of channels to the output bus being connected if (bus && SpeakerArr::getChannelCount(bus->getArrangement()) != reqNumOutputChannels) { audioOutputs.remove(bus); addAudioOutput(USTRING("Output"), getSpeakerArrForChans(reqNumOutputChannels)); } if (!mScChans && numIns == 1) // No sidechain, every thing OK { return kResultTrue; } if (mScChans && numIns == 2) // numIns = num Input BUSes { int32 reqNumSideChainChannels = SpeakerArr::getChannelCount(inputs[1]); //requested # sidechain input channels bus = FCast<AudioBus>(audioInputs.at(1)); if (bus && SpeakerArr::getChannelCount(bus->getArrangement()) != reqNumSideChainChannels) { audioInputs.remove(bus); addAudioInput(USTRING("Sidechain Input"), getSpeakerArrForChans(reqNumSideChainChannels), kAux, 0); // either mono or stereo } return kResultTrue; } return kResultFalse; }
IPlugVST::IPlugVST(IPlugInstanceInfo instanceInfo, int nParams, const char* channelIOStr, int nPresets, const char* effectName, const char* productName, const char* mfrName, int vendorVersion, int uniqueID, int mfrID, int latency, int plugDoesMidi, bool plugDoesChunks, bool plugIsInst) : IPlugBase(nParams, channelIOStr, nPresets, effectName, productName, mfrName, vendorVersion, uniqueID, mfrID, latency, plugDoesMidi, plugDoesChunks, plugIsInst), mHostCallback(instanceInfo.mVSTHostCallback), mHostSpecificInitDone(false) { Trace(TRACELOC, "%s", effectName); mHasVSTExtensions = VSTEXT_NONE; int nInputs = NInChannels(), nOutputs = NOutChannels(); memset(&mAEffect, 0, sizeof(AEffect)); mAEffect.object = this; mAEffect.magic = kEffectMagic; mAEffect.dispatcher = VSTDispatcher; mAEffect.getParameter = VSTGetParameter; mAEffect.setParameter = VSTSetParameter; mAEffect.numPrograms = nPresets; mAEffect.numParams = nParams; mAEffect.numInputs = nInputs; mAEffect.numOutputs = nOutputs; mAEffect.uniqueID = uniqueID; mAEffect.version = GetEffectVersion(true); mAEffect.__ioRatioDeprecated = 1.0f; mAEffect.__processDeprecated = VSTProcess; mAEffect.processReplacing = VSTProcessReplacing; mAEffect.processDoubleReplacing = VSTProcessDoubleReplacing; mAEffect.initialDelay = latency; mAEffect.flags = effFlagsCanReplacing | effFlagsCanDoubleReplacing; if (plugDoesChunks) { mAEffect.flags |= effFlagsProgramChunks; } if (LegalIO(1, -1)) { mAEffect.flags |= __effFlagsCanMonoDeprecated; } if (plugIsInst) { mAEffect.flags |= effFlagsIsSynth; } memset(&mEditRect, 0, sizeof(ERect)); memset(&mInputSpkrArr, 0, sizeof(VstSpeakerArrangement)); memset(&mOutputSpkrArr, 0, sizeof(VstSpeakerArrangement)); mInputSpkrArr.numChannels = nInputs; mOutputSpkrArr.numChannels = nOutputs; mInputSpkrArr.type = VSTSpkrArrType(nInputs); mOutputSpkrArr.type = VSTSpkrArrType(nOutputs); // Default everything to connected, then disconnect pins if the host says to. SetInputChannelConnections(0, nInputs, true); SetOutputChannelConnections(0, nOutputs, true); SetBlockSize(DEFAULT_BLOCK_SIZE); }