当我使用XCode (新建项目→应用程序,然后新建目标→音频单元扩展)中的模板构建音频单元扩展(instrument/aumu),然后使用Logic Pro X或Garage Band构建并运行它时,插件只有在其插入的曲目被选中时才能运行。如果选择了任何其他曲目,则在例如。进程或handleMIDIEvent覆盖函数永远不会被触发。(另外,如果未选择的音轨在所选音轨更改之前实际正在输出声音,则它们将开始输出持续的短周期毛刺噪声)
知道为什么会这样吗?我会怀疑XCode或DAW有问题,但我已经看到其他macOS AUv3插件(不幸的是,它仍然是一个极其稀有的品种)工作得很好,所以我知道这绝对是可能的。
发布于 2021-02-16 18:11:16
几经折腾,我终于找到了问题所在。(我真的希望在AUv3上有更多的在线知识可以广泛使用……)
似乎在每个渲染周期中,Logic Pro X和Garage Band都会根据插件是否位于选定的轨迹中,向插件进程请求不同长度的块。如果选择了音轨,请求的块将是DAW设置中设置的长度(I/O缓冲区大小),假设是为了最高优先级的渲染?未选择的磁道被要求1024帧(似乎最长的逻辑缓冲区可以被占用),而不管I/O缓冲区大小设置。
1024帧的长度大于
AUAudioFrameCount maxFramesToRender = 512;音频单元扩展模板存根在DSPKernel.hpp中,因此只有在未选中的曲目上渲染才会失败。(我提到的短周期毛刺噪声似乎是自上次播放每1024帧重新输出一次以来,输出缓冲区中剩余的任何值)
设置maxFramesToRender = 1024;修复该问题。
现在是一个非常固执己见的抱怨:我不禁觉得这个默认的maxFramesToRender值正在让新手(像我)失败,因为1)它从来没有在官方教程或文档中提到过2)它在苹果自己的DAWs上不能很好地发挥作用,想必是最明显的测试3)它一开始可以工作,但只有在你尝试同时播放两首曲目之前,在这一点上你可能已经有很多代码下来了,而且更容易产生混淆。
但是,哦,好吧,我想它就是这样。
https://stackoverflow.com/questions/66210154
复制相似问题