如何正确更新 AUSampler 的 loadInstrument 属性?

Posted

技术标签:

【中文标题】如何正确更新 AUSampler 的 loadInstrument 属性?【英文标题】:How to correctly update AUSampler's loadInstrument property? 【发布时间】:2015-09-12 11:23:58 【问题描述】:

我有一个由两个节点组成的 AUGraph:AUSampler 单元和输出单元。 我正在从 sf2 文件将样本加载到 AUSampler。我有多个 sf2 文件,想在运行时在它们之间切换。

目前我有以下代码来设置一个 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");


只有在切换到另一个文件时没有播放任何声音时才有效。如果在播放图形时设置了该属性,则会在 DLSSample::GetMoreFrames(unsigned long long, unsigned long long, void*) () 处出现 EXC_BAD_ACCESS 崩溃

那么更新此属性的正确方法是什么?

【问题讨论】:

【参考方案1】:

打电话

AudioUnitReset(_midiPlayer.instrumentUnit, kAudioUnitScope_Global, 0);

刚刚调用 AudioUnitSetProperty 函数似乎解决了我的问题。

【讨论】:

以上是关于如何正确更新 AUSampler 的 loadInstrument 属性?的主要内容,如果未能解决你的问题,请参考以下文章

CoreAudio:Ausampler 单元复音

iOS AUSampler audiounit - EXS 音频文件的文件路径问题?

iOS AUSampler 连续播放 MIDI 音符

如何在Vuejs中将反应性道具传递给孩子

如何正确更新 AppWidget?

如何正确启动更新程序?