Alright, the kPresets array in getPreset() has to be global/static. So this seems to work:
- add the following two variables to JuceAU:
static AUPreset *kPresets;
static bool kPresetsNotAlloc;
- initiate them by writing
AUPreset* JuceAU::kPresets=NULL;
bool JuceAU::kPresetsNotAlloc=true;
somewhere into juce_AudioUnitWrapper.cpp. Then, the two preset routines look like this:
[code]ComponentResult GetPresets (CFArrayRef *outData) const
{
if (outData == NULL)
{
return noErr;
}
int kNumberPresets = juceFilter->getNumPrograms();
if (kPresetsNotAlloc)
{
kPresets = new AUPreset[kNumberPresets];
kPresetsNotAlloc = false;
}
String programName;
CFMutableArrayRef presetsArray = CFArrayCreateMutable(NULL,kNumberPresets,NULL);
for (int i=0;i<kNumberPresets;i++)
{
kPresets[i].presetNumber = i;
programName = juceFilter->getProgramName(i);
kPresets[i].presetName = PlatformUtilities::juceStringToCFString (programName);
CFArrayAppendValue(presetsArray,&kPresets[i]);
}
*outData = (CFArrayRef) presetsArray;
return noErr;
}
OSStatus NewFactoryPresetSet( const AUPreset &inNewFactoryPreset)
{
int kNumberPresets = juceFilter->getNumPrograms();
SInt32 chosenPresetNumber = (int) inNewFactoryPreset.presetNumber;
AUPreset chosenPreset;
String programName;
if (chosenPresetNumber<kNumberPresets)
{
chosenPreset.presetNumber = chosenPresetNumber;
programName = juceFilter->getProgramName(chosenPresetNumber);
chosenPreset.presetName = PlatformUtilities::juceStringToCFString (programName);
juceFilter->setCurrentProgram(chosenPresetNumber);
SetAFactoryPresetAsCurrent(chosenPreset);
return noErr;
}
else return kAudioUnitErr_InvalidProperty;
}
[/code]
I haven’t tested it extensively, but so far things seem fine…
Edit: Don’t forget to delete the kPresets array in the JuceAU destructor…