任何人都知道在 macOS 上的 AUGraph 现有过滤器节点之间添加具有自定义渲染功能的节点的神奇秘诀。无论我使用
AUGraphSetNodeInputCallback
或 AudioUnitSetProperty
设置自定义渲染回调,我的渲染回调都不会被调用。 kAudioUnitType_Effect
和 kAudioUnitSubType_AUFilter
是设置此类节点的正确参数吗?
OSStatus AudioEngineGraph::BuildCustomGraphNode (AudioEngineGraphInput& inInput, AUGraph inGraph, std::shared_ptr<AudioEngineGraphNode> inNode) {
AudioComponentDescription outputcd = {0};
OSStatus err;
outputcd.componentType = kAudioUnitType_Effect;
outputcd.componentSubType = kAudioUnitSubType_AUFilter;
outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
err = AUGraphAddNode(inGraph, &outputcd, &(inNode->mNode));
checkErrAndReturn("AUGraphAddNode", err);
err = AUGraphNodeInfo(inGraph, (inNode->mNode), NULL, &(inNode->mUnit));
checkErrAndReturn("AUGraphNodeInfo", err);
}
// connect all the nodes in my graph, then set the render callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = myRenderProc;
callbackStruct.inputProcRefCon = &inInput;
//checkErr(AudioUnitSetProperty(inNode->mUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callbackStruct, sizeof(callbackStruct)));
checkErr (AUGraphSetNodeInputCallback(inGraph, inNode->mNode, 0, &callbackStruct));
您需要构建自己的 AUAudioUnit 的 Swift/Objective-C 子类,其中包含您的自定义过滤器代码。在 CoreAudio 中注册后,您可以使用自定义单元在 AudioGraph 中创建一个节点。为什么事情就不能简单一点呢?发现源代码很有帮助(但有点错误):https://github.com/GeorgeMcMullen/AudioUnitV3Example/blob/0ab6f2feb953d37e4e7b2359627b97858b317bc8/Filter/Shared/FilterDemo.mm