The previous implementation could emit 'wildcard' channel layouts in too
many scenarios.
A wildcard channel count is -1 or -2, and indicates that any number of
channels is supported on the bus.
If the input and output layouts must match, then a layout of [-1, -1]
should be returned.
If any layout is valid in both directions, then a layout of [-1, -2]
should be returned.
In the case where we have a bus A and opposite bus B, we will now only
emit a wildcard count for bus A if every bus standard bus layout up to a
channel count of 16 can be applied successfully without changing the bus
count of B.
Previously, MIDI FX plugins would only load on mono tracks.
Now, we add a separate plugin description for each potential track
layout. This is the same approach used by the example MIDI FX from the
AAX SDK.
With this change in place:
- The compatible VST2 ID will be included in the list of compatible
classes in the moduleinfo.json.
- getCompatibleParameterIds() will be called with the ID of the
commpatible VST2 plugin.
It's important that the plugin always returns the full set of available
components.
The plugin may be scanned by a separate process from the 'main' DAW
process, and these processes may report different compatibility levels.
If the scanner has more restricted compatibility than the 'main' DAW
process, then some channel layouts may not be registered, and will be
hidden in the DAW.
Previously, it was possible for the Timer destructor to run after the
last ScopeJuceInitialiser_GUI destructor, which meant that timer
callbacks could continue to be fired (via the appDelegate pointer) after
the static appDelegate instance had been destroyed.
With this change in place, we now ensure the Timer is destroyed before
the ScopedJuceInitialiser_GUI.
This is useful on headless Linux systems. When no display is attached,
window creation is bypassed but a StandalonePluginHolder is still
created, allowing audio to be processed.
The input coordinates were unnecessarily converted and truncated to
integral values before follow up calculations, and then a final
conversion back to integral values.