2015-09-12 7 views
1

У меня есть 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 *)()

Итак, что является правильным способом обновления этого свойства?

ответ

1

Вызов

AudioUnitReset(_midiPlayer.instrumentUnit, kAudioUnitScope_Global, 0); 

только после того, как вызов функции AudioUnitSetProperty кажется решить мою проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^