7

在播放音调时(例如,这里),我们必须告诉机器哪个函数将填充 IO 缓冲区:

// Set our tone rendering function on the unit
AURenderCallbackStruct input;
input.inputProc = RenderTone;
input.inputProcRefCon = self;
err = AudioUnitSetProperty(toneUnit, 
    kAudioUnitProperty_SetRenderCallback, 
    kAudioUnitScope_Input,
    0, 
    &input, 
    sizeof(input));

很明显,这inputProc是从中获取音频单元输入的过程。但究竟是inputProcRefCon什么?会不会出现无法设置的情况self

4

2 回答 2

8

refCon 是指向任意数据的 void(无类型)指针,在您的示例中指向支持调用对象的 C 结构。如果 inputProc 回调函数不需要来自调用对象传递的任何额外参数(实例变量),那么您不需要自己传递它,或者您可以将 refCon 指向其他一些数据(不同的 C 结构或对象) . 但大多数回调确实需要一些参数。

这是一个 C void 指针,因为该 API 是针对较新的 Objective C 习惯用法更早的实时代码。

于 2013-05-02T15:13:09.567 回答
1

它是“输入过程的参考上下文”的缩写。因此,为了详细说明@hotpaw2 的答案,它是对提供上下文的任意数据的引用inputProc

如果您的音频单元应该处理传入的音频,则inputProc必须指向包含您需要它处理的样本的缓冲区。

在下面的示例中,有问题的缓冲区是一个float数组:

OSStatus MyAudioUnitEffectCallback(void *                            inRefCon,
                                   AudioUnitRenderActionFlags *      ioActionFlags,
                                   const AudioTimeStamp *            inTimeStamp,
                                   UInt32                            inBusNumber,
                                   UInt32                            inNumberFrames,
                                   AudioBufferList * __nullable      ioData) {

    float ** inputBuffer = static_cast<float **>(inRefCon);
    // process the samples inside inputBuffer and then place them into ioData
于 2020-04-14T17:32:07.677 回答