前言
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
目录下即可 - 对于特殊需要静态加载的平台, 手动创建静态加载文件
评论