Possible issue with AudioProcessor::setChannelLayoutOfBus?


#1

Hi All,

I ran into an assertion in a VST3 host I’ve written when loading a JUCE plugin (as a VST3 plugin.) It’s entirely possible that the issue is on my end, i.e how I’m configuring my buses for plugin rendering.

Here is my rendering shutdown function

void StopRendering(IComponent* vst3Effect)
{
	tresult result = vst3Effect->setActive(false);
	ASSERT(result == kResultOk);

	result = vst3Effect->activateBus(kAudio, kInput, 0, false);
	ASSERT(result == kResultOk);
	result = vst3Effect->activateBus(kAudio, kOutput, 0, false);
	ASSERT(result == kResultOk);
}

When I call activateBus with false as the last parameter, the JUCE VST3 wrapper will eventually call AudioProcessor::Bus::enable (false), which then calls AudioProcessor::Bus::setCurrentLayout (AudioChannelSet::disabled()).

Ultimately that AudioChannelSet::disabled() instance gets to AudioProcessor::setChannelLayoutOfBus, where it is compared using the == operator with the an existing channel set. However that == operator will never return true unless the existing channel set was already disabled (I think.)

Because I’m deactivating an existing channel set the function returns false, which triggered an assert on my end.

Is there something I’m doing wrong on my end? I don’t see how the AudioProcessor::setChannelLayoutOfBus could work when disabling a channel layout unless the function is rewritten to look like this:

bool AudioProcessor::setChannelLayoutOfBus (bool isInputBus, int busIndex, const AudioChannelSet& layout)
{
    if (auto* bus = getBus (isInputBus, busIndex))
    {
        auto layouts = bus->getBusesLayoutForLayoutChangeOfBus (layout);

        if (layouts.getChannelSet (isInputBus, busIndex) == layout || layout.isDisabled())
            return applyBusLayouts (layouts);

        return false;
    }

    jassertfalse;  // busIndex parameter is invalid
    return false;
}

With the additional isDisabled check appended to the end of the conditional.

Thoughts?