Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
VST3 Client: Allow host to enable/disable buses at will
Previously, activateBus would fail if the new BusesLayout wasn't supported, as reported by isBusesLayoutSupported. However, according to the VST3 docs, a host is allowed to enable and disable buses in any combination, and the plugin should be able to handle this gracefully. The ability to enable/disable individual buses without failure is particularly important because there's no VST3 API to set a complete bus layout in one go. That is, the only way to set all buses active or all buses inactive is to set the appropriate state on each bus individually, which in turn means that at some point, some buses will be active and some will be inactive. Disallowing such 'intermediate' states may prevent the host from putting the plugin into other (valid) states. To ensure that the VST3 wrapper always accepts activateBus calls, it now keeps track of the activation state of each bus as requested by the host. When the host tries to change the activation state, the wrapper will try to set the host's "ideal" bus layout on the AudioProcessor. If this fails, the AudioProcessor will retain its previous bus layout. The buffer remapping inside the process callback has been made more robust, to handle cases where the host and the AudioProcessor disagree about the activation state of each bus: For input buses: - If the host has activated the bus, but the AudioProcessor decided to keep the bus inactive, the host's input will be ignored. - If the host deactivated the bus, but the AudioProcessor wanted to keep the bus active, the AudioProcessor will be provided with silence on that bus. For output buses: - If the host has activated the bus, but the AudioProcessor decided to keep the bus inactive, the wrapper will clear the host's output bus buffers. - If the host deactivated the bus, but the AudioProcessor wanted to keep the bus active, the AudioProcessor's output on that bus will be ignored. The AudioBuffer passed to the wrapped AudioProcessor will no longer contain any pointers from the host's ProcessData. Instead, the host's inputs will be copied (in JUCE channel order) to a temporary buffer, and this temporary buffer will be passed to AudioProcessor::processBlock. After processBlock, the buffer contents will be copied to the host's output buffers. This change is intended to avoid a potential issue when reordering channels into JUCE order, which may necessitate copying a host input channel to a different host output channel. In the case that the host is using the same buffers for both inputs and outputs, copying an input to an output channel may end up overwriting another input channel, breaking the plugin's inputs.
- Loading branch information