Closed
Description
This is fine on most iOS hosts, but for AUM (https://apps.apple.com/us/app/aum-audio-mixer/id1055636344) which is a highly used host for iOS, the fact the initial program is set to -1 causes the plugin to crash.
The reason is that -1 is not a valid program index and JUCE AudioUnit code is not handling -1 as an input. See:
juce::JuceAudioUnitv3::FactoryPresets::getAtIndex
What AUM seems to do it:
- Create the plugin filter; here the RNBO::JuceAudioProcessor constructor sets the current program to -1
- Get the current preset by calling
juce::JuceAudioUnitv3::getCurrentPreset
AUAudioUnitPreset* getCurrentPreset() const
{
return factoryPresets.getAtIndex (getAudioProcessor().getCurrentProgram());
}
- At this point, we're calling
factoryPresets.getAtIndex (-1)
; see the implementation of this method does no lower bounds checking
AUAudioUnitPreset* getAtIndex (int index) const
{
std::lock_guard<std::mutex> lock (mutex);
if (index < (int) [presets.get() count])
return [presets.get() objectAtIndex: (unsigned int) index];
return nullptr;
}
- The plugin crashes due to objectAtIndex trying to access index - 1 of that array
The fix could be to for RNBO::JuceAudioProcessor's _currentPresetIdx
field to be initialised to 0 or a different value. I can verify setting the program to 0 (as well as patching JUCE bounds checking code above to consider lower bounds) fixes crashes in AUM for my iOS plugin.
All the best
Metadata
Metadata
Assignees
Labels
No labels