VST3: always pass buffers for all audio busses

This should fix an issue with yabridge and MCompressor.
The plugin has two kMain inputs and expects ProcessData:inputs
to always have two entries, even if the second bus is explicitly
disabled.

see https://hastebin.com/ekewojiqep.txt
```
IComponent::activateBus(type = 0, dir = 0, index = 1, state = false)
data.numInputs = 1;
```

TODO: optimize (pre-allocate) if it works as expected
This commit is contained in:
Robin Gareus 2020-12-30 18:10:01 +01:00
parent 62ac7c6a80
commit 15864be609
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04

View file

@ -2021,8 +2021,30 @@ used_bus_count (int auxes, int inputs)
void void
VST3PI::process (float** ins, float** outs, uint32_t n_samples) VST3PI::process (float** ins, float** outs, uint32_t n_samples)
{ {
Vst::AudioBusBuffers input[2]; // in-bus & aux-bus /* TODO cache and pre-alloc std::vector */
Vst::AudioBusBuffers output[2]; int32 n_bus_in = _component->getBusCount (Vst::kAudio, Vst::kInput);
int32 n_bus_out = _component->getBusCount (Vst::kAudio, Vst::kOutput);
Vst::AudioBusBuffers* inputs = NULL;
Vst::AudioBusBuffers* outputs = NULL;
if (n_bus_in > 0) {
/* TODO use default c'tor */
inputs = (Vst::AudioBusBuffers*)alloca (n_bus_in * sizeof (Vst::AudioBusBuffers));
for (int i = 0; i < n_bus_in; ++i) {
inputs[i].silenceFlags = 0;
inputs[i].numChannels = 0;
inputs[i].channelBuffers32 = 0;
}
}
if (n_bus_out > 0) {
outputs = (Vst::AudioBusBuffers*)alloca (n_bus_out * sizeof (Vst::AudioBusBuffers));
for (int i = 0; i < n_bus_out; ++i) {
outputs[i].silenceFlags = 0;
outputs[i].numChannels = 0;
outputs[i].channelBuffers32 = 0;
}
}
Vst::ProcessData data; Vst::ProcessData data;
data.numSamples = n_samples; data.numSamples = n_samples;
@ -2030,8 +2052,8 @@ VST3PI::process (float** ins, float** outs, uint32_t n_samples)
data.symbolicSampleSize = Vst::kSample32; data.symbolicSampleSize = Vst::kSample32;
data.numInputs = used_bus_count (_n_aux_inputs, _n_inputs); data.numInputs = used_bus_count (_n_aux_inputs, _n_inputs);
data.numOutputs = used_bus_count (_n_aux_outputs, _n_outputs); data.numOutputs = used_bus_count (_n_aux_outputs, _n_outputs);
data.inputs = input; data.inputs = inputs;
data.outputs = output; data.outputs = outputs;
data.processContext = &_context; data.processContext = &_context;
data.inputEvents = &_input_events; data.inputEvents = &_input_events;
@ -2040,24 +2062,28 @@ VST3PI::process (float** ins, float** outs, uint32_t n_samples)
data.inputParameterChanges = &_input_param_changes; data.inputParameterChanges = &_input_param_changes;
data.outputParameterChanges = &_output_param_changes; data.outputParameterChanges = &_output_param_changes;
input[0].silenceFlags = 0; if (n_bus_in > 0) {
input[0].numChannels = _n_inputs; inputs[0].silenceFlags = 0;
input[0].channelBuffers32 = ins; inputs[0].numChannels = _n_inputs;
inputs[0].channelBuffers32 = ins;
if (_n_aux_inputs > 0) {
input[1].silenceFlags = 0;
input[1].numChannels = _n_aux_inputs;
input[1].channelBuffers32 = &ins[_n_inputs];
} }
output[0].silenceFlags = 0; if (n_bus_in > 1 && _n_aux_inputs > 0) {
output[0].numChannels = _n_outputs; inputs[1].silenceFlags = 0;
output[0].channelBuffers32 = outs; inputs[1].numChannels = _n_aux_inputs;
inputs[1].channelBuffers32 = &ins[_n_inputs];
}
if (_n_aux_outputs > 0) { if (n_bus_out > 0) {
output[1].silenceFlags = 0; outputs[0].silenceFlags = 0;
output[1].numChannels = _n_outputs; outputs[0].numChannels = _n_outputs;
output[1].channelBuffers32 = &outs[_n_outputs]; outputs[0].channelBuffers32 = outs;
}
if (n_bus_out > 1 && _n_aux_outputs > 0) {
outputs[1].silenceFlags = 0;
outputs[1].numChannels = _n_outputs;
outputs[1].channelBuffers32 = &outs[_n_outputs];
} }
/* and go */ /* and go */