托管 AUv3 音频扩展并连接到参数树

Host AUv3 audio extension and connect to parameter tree

我开始编写 AUv3 音频扩展,并遵循 Xcode 11.3 中的模板完成所有繁重的工作。该扩展在加载到其他主机时运行良好!现在我想在我的应用程序中使用我自己的扩展并简单地播放一个音频文件,但是几天(和几夜)以来我在如何访问参数方面遇到了麻烦和撕裂了我的头发。

我使用 AVplayer 和 AVengine 并像这样实例化 AudioUnitExtension:

    // instantiate AudioUnit as AVAudioUnit
[AVAudioUnit instantiateWithComponentDescription:audioDescription options:1 completionHandler:^(AVAudioUnit * audioUnit, NSError *error) { ... do more stuff here}];

令我惊讶的是,我的扩展中的 createAudioUnitWithComponentDescription 方法没有被调用?!但是当我将它连接到 AVengine 时:

[self->_engine attachNode:self->_AV_AudioUnit];

音频正在通过并应用了效果,但在 AVAudioUnit 中没有参数树,因此我无法更改任何处理参数。它接缝 AVAudioUnit != AUAudioUnit 并且没有参数树。但是 AVengine 只允许 AVAudioUnits 使用!

我浏览了 Apple 的示例和网络,但找不到任何有用的信息...如果有人能指出我如何设置的方向,那就太好了!

我花了好几个晚上才找到原因:audioUnit 无法在同一个应用程序中动态加载,这就是调试器不会在 AU-Unit 扩展内的断点处停止的原因。

为了获取视图控制器,我首先实例化了一个 AV-AudioUnit,然后使用包装器获取 AU-AudioUnit

WWDC2015 That AV Audio Unit effect in turn exposed an underlying AU Audio Unit, which is the maiden class of the version 3 Audio Unit API.

这是在这里完成的:

        // wrapper - to get the AU-unit from AV-Unit
    self->_AU_AudioUnit = audioUnit.AUAudioUnit;

然后加载对应的ViewController

        // get the corresponding Viewcontroller
    [self->_AU_AudioUnit requestViewControllerWithCompletionHandler:^(AUViewControllerBase * _Nullable viewController) { ... do presenting in container view here }]

我希望这能帮助那些不像我那样花太多时间的人!