mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 19:56:31 +01:00
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:
parent
62ac7c6a80
commit
15864be609
1 changed files with 45 additions and 19 deletions
|
|
@ -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 */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue