|
|
@@ -2009,7 +2009,7 @@ private: |
|
|
|
template <typename FloatType>
|
|
|
|
void processAudio (Vst::ProcessData& data, Array<FloatType*>& channelList)
|
|
|
|
{
|
|
|
|
int totalInputChans = 0;
|
|
|
|
int totalInputChans = 0, totalOutputChans = 0;
|
|
|
|
bool tmpBufferNeedsClearing = false;
|
|
|
|
|
|
|
|
const int plugInInputChannels = pluginInstance->getTotalNumInputChannels();
|
|
|
@@ -2029,31 +2029,40 @@ private: |
|
|
|
break;
|
|
|
|
|
|
|
|
{
|
|
|
|
const int n = jmax (vstInputs, getNumAudioBuses (true));
|
|
|
|
const int n = jmax (vstOutputs, getNumAudioBuses (false));
|
|
|
|
|
|
|
|
for (int bus = 0; bus < n && totalInputChans < plugInInputChannels; ++bus)
|
|
|
|
for (int bus = 0; bus < n && totalOutputChans < plugInOutputChannels; ++bus)
|
|
|
|
{
|
|
|
|
if (bus < vstInputs)
|
|
|
|
if (bus < vstOutputs)
|
|
|
|
{
|
|
|
|
if (FloatType** const busChannels = getPointerForAudioBus<FloatType> (data.inputs[bus]))
|
|
|
|
if (FloatType** const busChannels = getPointerForAudioBus<FloatType> (data.outputs[bus]))
|
|
|
|
{
|
|
|
|
const int numChans = jmin ((int) data.inputs[bus].numChannels, plugInInputChannels - totalInputChans);
|
|
|
|
const int numChans = jmin ((int) data.outputs[bus].numChannels, plugInOutputChannels - totalOutputChans);
|
|
|
|
|
|
|
|
for (int i = 0; i < numChans; ++i)
|
|
|
|
if (busChannels[i] != nullptr)
|
|
|
|
channelList.set (totalInputChans++, busChannels[i]);
|
|
|
|
{
|
|
|
|
auto dst = busChannels[i];
|
|
|
|
|
|
|
|
if (dst != nullptr)
|
|
|
|
{
|
|
|
|
if (totalOutputChans >= plugInInputChannels)
|
|
|
|
FloatVectorOperations::clear (dst, (int) data.numSamples);
|
|
|
|
|
|
|
|
channelList.set (totalOutputChans++, busChannels[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const int numChans = jmin (pluginInstance->getChannelCountOfBus (true, bus), plugInInputChannels - totalInputChans);
|
|
|
|
const int numChans = jmin (pluginInstance->getChannelCountOfBus (false, bus), plugInOutputChannels - totalOutputChans);
|
|
|
|
|
|
|
|
for (int i = 0; i < numChans; ++i)
|
|
|
|
{
|
|
|
|
if (FloatType* tmpBuffer = getTmpBufferForChannel<FloatType> (totalInputChans, data.numSamples))
|
|
|
|
if (FloatType* tmpBuffer = getTmpBufferForChannel<FloatType> (totalOutputChans, data.numSamples))\
|
|
|
|
{
|
|
|
|
tmpBufferNeedsClearing = true;
|
|
|
|
channelList.set (totalInputChans++, tmpBuffer);
|
|
|
|
channelList.set (totalOutputChans++, tmpBuffer);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return;
|
|
|
@@ -2062,49 +2071,47 @@ private: |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int totalOutputChans = 0;
|
|
|
|
|
|
|
|
{
|
|
|
|
const int n = jmax (vstOutputs, getNumAudioBuses (false));
|
|
|
|
const int n = jmax (vstInputs, getNumAudioBuses (true));
|
|
|
|
|
|
|
|
for (int bus = 0; bus < n && totalOutputChans < plugInOutputChannels; ++bus)
|
|
|
|
for (int bus = 0; bus < n && totalInputChans < plugInInputChannels; ++bus)
|
|
|
|
{
|
|
|
|
if (bus < vstOutputs)
|
|
|
|
if (bus < vstInputs)
|
|
|
|
{
|
|
|
|
if (FloatType** const busChannels = getPointerForAudioBus<FloatType> (data.outputs[bus]))
|
|
|
|
if (FloatType** const busChannels = getPointerForAudioBus<FloatType> (data.inputs[bus]))
|
|
|
|
{
|
|
|
|
const int numChans = jmin ((int) data.outputs[bus].numChannels, plugInOutputChannels - totalOutputChans);
|
|
|
|
const int numChans = jmin ((int) data.inputs[bus].numChannels, plugInInputChannels - totalInputChans);
|
|
|
|
|
|
|
|
for (int i = 0; i < numChans; ++i)
|
|
|
|
{
|
|
|
|
if (busChannels[i] != nullptr)
|
|
|
|
{
|
|
|
|
if (totalOutputChans >= totalInputChans)
|
|
|
|
if (totalInputChans >= totalOutputChans)
|
|
|
|
channelList.set (totalInputChans, busChannels[i]);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FloatVectorOperations::clear (busChannels[i], data.numSamples);
|
|
|
|
channelList.set (totalOutputChans, busChannels[i]);
|
|
|
|
}
|
|
|
|
auto* dst = channelList.getReference (totalInputChans);
|
|
|
|
auto* src = busChannels[i];
|
|
|
|
|
|
|
|
++totalOutputChans;
|
|
|
|
if (dst != src)
|
|
|
|
FloatVectorOperations::copy (dst, src, (int) data.numSamples);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
++totalInputChans;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const int numChans = jmin (pluginInstance->getChannelCountOfBus (false, bus), plugInOutputChannels - totalOutputChans);
|
|
|
|
const int numChans = jmin (pluginInstance->getChannelCountOfBus (true, bus), plugInInputChannels - totalInputChans);
|
|
|
|
|
|
|
|
for (int i = 0; i < numChans; ++i)
|
|
|
|
{
|
|
|
|
if (FloatType* tmpBuffer = getTmpBufferForChannel<FloatType> (totalOutputChans, data.numSamples))
|
|
|
|
if (FloatType* tmpBuffer = getTmpBufferForChannel<FloatType> (totalInputChans, data.numSamples))
|
|
|
|
{
|
|
|
|
if (totalOutputChans >= totalInputChans)
|
|
|
|
{
|
|
|
|
tmpBufferNeedsClearing = true;
|
|
|
|
channelList.set (totalOutputChans, tmpBuffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
++totalOutputChans;
|
|
|
|
tmpBufferNeedsClearing = true;
|
|
|
|
channelList.set (totalInputChans++, tmpBuffer);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return;
|
|
|
@@ -2167,29 +2174,6 @@ private: |
|
|
|
jassert (midiBuffer.getNumEvents() <= numMidiEventsComingIn);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.outputs != nullptr)
|
|
|
|
{
|
|
|
|
int outChanIndex = 0;
|
|
|
|
|
|
|
|
for (int bus = 0; bus < data.numOutputs; ++bus)
|
|
|
|
{
|
|
|
|
if (FloatType** const busChannels = getPointerForAudioBus<FloatType> (data.outputs[bus]))
|
|
|
|
{
|
|
|
|
const int numChans = (int) data.outputs[bus].numChannels;
|
|
|
|
|
|
|
|
for (int i = 0; i < numChans; ++i)
|
|
|
|
{
|
|
|
|
if (outChanIndex < totalInputChans && busChannels[i] != nullptr)
|
|
|
|
FloatVectorOperations::copy (busChannels[i], buffer.getReadPointer (outChanIndex), (int) data.numSamples);
|
|
|
|
else if (outChanIndex >= totalOutputChans && busChannels[i] != nullptr)
|
|
|
|
FloatVectorOperations::clear (busChannels[i], (int) data.numSamples);
|
|
|
|
|
|
|
|
++outChanIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|