У меня есть AUGraph, состоящий из двух узлов: блок AUSampler и блок вывода. Я загружаю образцы в AUSampler из файлов sf2. У меня есть несколько файлов sf2 и вы хотите переключиться между ними во время выполнения.Как правильно обновить свойство loadInstrument AUSampler?
В настоящее время у меня есть следующий код, чтобы задать SF2 файл:
- (void) loadSoundFontWithName:(NSString *) name {
CheckError (AUGraphStop(_midiPlayer.graph), "couldn't stop graph");
OSStatus result = noErr;
// fill out a instrument data structure
AUSamplerInstrumentData instdata;
NSString *presetPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"Sampler Files/%@", name]
ofType:@"sf2"];
const char* presetPathC = [presetPath cStringUsingEncoding:NSUTF8StringEncoding];
NSLog (@"presetPathC: %s", presetPathC);
CFURLRef presetURL = CFURLCreateFromFileSystemRepresentation(
kCFAllocatorDefault,
presetPathC,
[presetPath length],
NO);
instdata.fileURL = presetURL;
instdata.instrumentType = kInstrumentType_DLSPreset;
instdata.bankMSB = kAUSampler_DefaultMelodicBankMSB;
instdata.bankLSB = kAUSampler_DefaultBankLSB;
instdata.presetID = (UInt8) 0;
// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty(_midiPlayer.instrumentUnit,
kAUSamplerProperty_LoadInstrument,
kAudioUnitScope_Global,
0,
&instdata,
sizeof(instdata));
// check for errors
NSCAssert (result == noErr,
@"Unable to set the preset property on the Sampler. Error code:%d '%.4s'",
(int) result,
(const char *)&result);
//===============
CheckError (AUGraphStart(_midiPlayer.graph), "couldn't start graph");
}
Он работает только если нет каких-либо звуки играли в момент переключения на другой файл. Если свойство задано во время воспроизведения графика, он сбрасывается с EXC_BAD_ACCESS в DLSSample :: GetMoreFrames (unsigned long long, unsigned long long, void *)()
Итак, что является правильным способом обновления этого свойства?