查看原文
其他

关于Wwise插件开发流程

李昱宸 Audiokinetic官方 2022-03-23

前言


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 音频插件构建管线



本文作者




李昱宸

游戏音频开发,腾讯游戏光子工作室。眼高手低,志大才疏。混迹音频行业多年,唯一没变的是对创造的热情。现在最享受将大家的脑洞变为现实,分享知识的快乐。网站:jazzlost.me;知乎:https://www.zhihu.com/people/li-yu-chen/posts;豆瓣:https://www.douban.com/people/leeaa4444/





往期推荐



Wwise 2021.1 新增功能


游戏音频岗位技能 – 如何谋得游戏音频设计师职位


Wwise语音管理探究



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存