macOS 中的音频单元 (AUv3) 仅适用于 DAW 中的选定轨道

Audio Unit (AUv3) in macOS only works in selected track in DAW

当我使用 XCode 中的模板构建音频单元扩展 (instrument/aumu) 时(新建项目 → App,然后新建目标 → 音频单元扩展)然后构建并 运行 它与 Logic Pro X 或 Garage Band 一起使用时,插件仅在选择插入的轨道时起作用。 如果选择了任何其他轨道,例如断点。 process 或 handleMIDIEvent 覆盖函数永远不会被触发。 (加上未选择的轨道开始输出恒定的短周期毛刺噪声,如果它们在所选轨道更改之前实际上正在输出声音)

知道为什么会这样吗?我怀疑 XCode 或 DAW 部分有问题,但我已经看到其他 macOS AUv3 插件(不幸的是,仍然是极其罕见的品种)工作得很好,所以我知道这绝对有可能。

折腾了好久,终于找到问题所在了。 (我真的希望 AUv3 上有更多在线广泛可用的知识...)

似乎每个渲染周期中的 Logic Pro X 和 Garage Band 都会根据插件是否在所选轨道中询问不同长度的块的插件进程。如果选择了轨道,请求的块将是 DAW 设置中设置的长度(I/O 缓冲区大小),大概是为了最高优先级的渲染?未选择的轨道要求 1024 帧(最长的逻辑缓冲区可以去,似乎),无论 I/O 缓冲区大小设置如何。

1024帧比

AUAudioFrameCount maxFramesToRender = 512;

Audio Unit Extension 模板存根在 DSPKernel.hpp 中,因此只有在未选择的轨道上渲染才会失败。 (我提到的短周期毛刺噪声似乎是自上次播放以来输出缓冲区中留下的任何值,每 1024 帧重新输出一次)

设置 maxFramesToRender = 1024;解决了这个问题。

现在来个自以为是的咆哮: 我忍不住觉得这个默认的 maxFramesToRender 值正在让新手(像我一样)为失败做好准备,因为 1) 官方教程或文档 (AFAIK) 中从未提及它 2) 它与 Apple 自己的 DAW 不兼容,大概是最明显的测试地方 3) 它最初可以工作,但只有在您尝试同时播放两条曲目之前,此时您可能已经有很多代码,并且更容易混淆。

但是哦,好吧,我想它就是这样。