Wwise在提供了Premake构建工具后,插件的开发变得更加简单高效,所以我也有了想简单梳理一遍插件开发流程的想法。本文记录Juce中开发的一个简单效果器插件移植为Windows平台Wwise插件的流程。完整代码可以查看Github。
Juce
首先在Juce中快速开发一个简单的Limiter
效果器,算法参考了How to build a VST。
1. DSP
Limiter需要延迟输出所以需要用到
CircularBuffer
结构,index值达到最大后会从头循环,还需要可以设置读写数据,根据delay长度得到下个buffer的index
然后进行信号处理
2. UI
UI上添加三个分别控制
threshold/attack/release
的控件
3. 测试
Juce中可以用一个
播放器插件
搭配PluginHost
进行快速测试
根据平台构建
PluginHost
播放器插件推荐这个 AudioFilePlayerPlugin
Wwise
1.Premake
1.1 构建工程
Wwise提供的Premake工具及构建脚本在
%WWISEROOT%/Scripts/Build/Plugins
目录下,在新工程目录下控台运行脚本启动构建生成插件框架
选择插件类型
添加插件创建描述
生成文件
在之前的目录下运行下面
Premake
命令来生成目标平台(这个工程生成VC160)
选择
构建目标
构建
目标平台
生成vc160项目
1.2 快速测试插件模板
构建premake生成的模板工程,如果出现下面报错需要安装
MFC依赖
模板工程同时生成AuthoringTools使用的dll与Engine使用的lib文件,可以在工程中重新设置输出目录
Wwise工程中插入该插件以便后面进行测试
用下面代码快速测试插件构建流程是否正常,插入的声音对象应该被
静音
AuthoringTools中改变默认控件
dummy
参数值,下面接口单步调试查看传入的in_pParams
是否正确
1.3 调试
Wwise插件的调试我是使用
附加到进程
的方式,打开Wwise工程后VS端附加到进程上进行调试。这里要注意插件Debug版本构建配置的输出目录要设置到
"Authoring\x64\Release\bin\Plugins"
。AuthoringTools的插件加载目录是这个,或者手动复制过去也可以。
注意重新构建插件的时候
需要关闭AuthoringTools
, 不然无法更新插件。
2. Authoring Tools Plugin
2.1 结构
AuthoringTools插件部分基础结构是
控件对象
,界面数据对象
和导出函数
三个部分。控件对象由一个xml文件来描述,里面可以设置详细的交互属性。
界面数据对象负责控件数据的修改保存等操作。
导出函数负责插件实例的创建与注册以及dll的接口导出。
2.2 注册与导出
dll
在AuthoringTools中的注册可以通过RegisterWwisePlugin
,这个可以写在插件实例化的时候.这个注册不包含插件在声音引擎中的注册
对于效果器插件,需要有两个导出符号,一个用来
创建插件实例
,一个用来声明插件列表
最后还需要在库描述文件
.def
中指定导出对象
2.3 控件
控件及属性在
xml
文件中进行描述,具体可以参考Wwise插件XML描述文件
2.4 接口实现
界面数据对象需要实现的接口
为所有自定义参数做写出操作
2.5 测试
对于插件测试,Wwise给出了完整的
测试单元列表
,可以按具体需求进行测试。插件测试单元项
3. Sound Engine Plugin
3.1 结构
SoundEngine插件部分基础结构是
插件对象
和参数对象
。插件对象负责插件的创建/注册/卸载/销毁/DSP等功能。
参数对象负责维护当前插件的参数与状态。
插件对象从其关联参数对象中获取实时参数和状态来更新DSP。
参数对象命名规则为
插件名+ Params
后缀。
3.2 内存管理
Wwise中定义了几个用于
动态内存管理
的宏,需要确保使用这几个宏来创建和销毁对象,这样才能在内存池中正确获取内存,在Profile里正确显示内存使用情况。
3.3 注册
首先要提供对象创建函数注册给
PluginManager
来管理
插件ID与创建函数的注册宏
宏定义里面可以看到,
两个创建回调函数的签名不要修改
,然后会实例化一个AK::PluginRegistration来进行注册
除了两个对象创建函数回调外,还可以传入
自定义回调函数
,进行一些状态与数据有效性的检查或者更新。
3.4 接口实现
IAkPlugin类视图
插件对象需要实现的接口(本文创建类是IAkInPlaceEffectPlugin)
Juce的DSP代码只需要通过一个
转接层
就可以最小化修改的放到Wwise的DSP代码中。这个例子中只需要实现一个
juce::AudioBuffer<float>
类到AkAudioBuffer
类的转接类AkJuceAudioBuffer就可以了
DSP部分把Buffer类改为
AkJuceAudioBuffer
基本就无需其它修改了, init的时候获取更新的效果器参数
IAkParam类视图
参数对象需要实现的接口
修改自定义参数结构和参数ID(参数ID在xml文件中设置过)
修改初始化时默认效果器参数
需要修改从bank获取数据的两个接口
游戏内注册
1. UE4
创建出厂头文件
JuceLimitFXFactory.h
,并放置到%WWISEROOT%\Wwise 2019.2.9.7459\SDK\include\AK\Plugin
目录下
AkAudio.Build.cs
中增加lib加载信息
AkAudioDevice.h
中增加之前创建的出厂头文件
2. Unity
将动态库放置到
\Assets\Wwise\Deployment\Plugins\%Platform%\%Arch%\DSP
目录下即可对于特殊需要静态加载的平台, 手动创建静态加载文件
参考
[1]Alex Rycroft.How to build a VST – Lesson 4: Limiter
[2]WwiseSDK2019.2.9.创建新插件
[3]Joel Robichard.简化 Wwise 音频插件构建管线
本文作者