关于Wwise插件开发流程

音频编程 / 游戏音频

前言

Wwise在提供了Premake构建工具后,插件的开发变得更加简单高效,所以我也有了想简单梳理一遍插件开发流程的想法。本文记录Juce中开发的一个简单效果器插件移植为Windows平台Wwise插件的流程。完整代码可以查看Github


Juce

首先在Juce中快速开发一个简单的Limiter效果器,算法参考了How to build a VST


1. DSP

  • Limiter需要延迟输出所以需要用到CircularBuffer结构,index值达到最大后会从头循环,还需要可以设置读写数据,根据delay长度得到下个buffer的index
1
2
  • 然后进行信号处理

3

2. UI

  • UI上添加三个分别控制threshold/attack/release的控件
4

3. 测试

  • Juce中可以用一个播放器插件搭配PluginHost进行快速测试
a1

  • 根据平台构建PluginHost

a2

 

Wwise

1.Premake

1.1 构建工程

  • Wwise提供的Premake工具及构建脚本在%WWISEROOT%/Scripts/Build/Plugins目录下,在新工程目录下控台运行脚本启动构建生成插件框架

5

  • 选择插件类型

  • 添加插件创建描述

a3

  • 生成文件

 

a4

  • 在之前的目录下运行下面Premake命令来生成目标平台(这个工程生成VC160)
6


  • 选择构建目标

a5

 

  • 构建目标平台

a6

 

  • 生成vc160项目

a7

1.2 快速测试插件模板

  • 构建premake生成的模板工程,如果出现下面报错需要安装MFC依赖



  • 模板工程同时生成AuthoringTools使用的dll与Engine使用的lib文件,可以在工程中重新设置输出目录

  • Wwise工程中插入该插件以便后面进行测试

a8

  • 用下面代码快速测试插件构建流程是否正常,插入的声音对象应该被静音7
  • AuthoringTools中改变默认控件dummy参数值,下面接口单步调试查看传入的in_pParams是否正确
8

1.3 调试

  • Wwise插件的调试我是使用附加到进程的方式,打开Wwise工程后VS端附加到进程上进行调试。这里要注意插件Debug版本构建配置的输出目录要设置到"Authoring\x64\Release\bin\Plugins"。AuthoringTools的插件加载目录是这个,或者手动复制过去也可以。

a9

  • 注意重新构建插件的时候需要关闭AuthoringTools, 不然无法更新插件。

2. Authoring Tools Plugin

2.1 结构

  • AuthoringTools插件部分基础结构是控件对象,界面数据对象导出函数三个部分。控件对象由一个xml文件来描述,里面可以设置详细的交互属性。界面数据对象负责控件数据的修改保存等操作。导出函数负责插件实例的创建与注册以及dll的接口导出。

2.2 注册与导出

  • dll在AuthoringTools中的注册可以通过RegisterWwisePlugin,这个可以写在插件实例化的时候.这个注册不包含插件在声音引擎中的注册
 
9
  • 对于效果器插件,需要有两个导出符号,一个用来创建插件实例,一个用来声明插件列表
10 
11
  • 最后还需要在库描述文件.def中指定导出对象
12

2.3 控件

13

a10

2.4 接口实现

  • 界面数据对象需要实现的接口
14 
  • 为所有自定义参数做写出操作
15

2.5 测试

  • 对于插件测试,Wwise给出了完整的测试单元列表,可以按具体需求进行测试。插件测试单元项

3. Sound Engine Plugin

3.1 结构

  • SoundEngine插件部分基础结构是插件对象参数对象。插件对象负责插件的创建/注册/卸载/销毁/DSP等功能。参数对象负责维护当前插件的参数与状态。插件对象从其关联参数对象中获取实时参数和状态来更新DSP。参数对象命名规则为插件名+ Params后缀。

3.2 内存管理

  • Wwise中定义了几个用于动态内存管理的宏,需要确保使用这几个宏来创建和销毁对象,这样才能在内存池中正确获取内存,在Profile里正确显示内存使用情况。
16 

3.3 注册

  • 首先要提供对象创建函数注册给PluginManager来管理
17 
  • 插件ID与创建函数的注册宏
18 
  • 宏定义里面可以看到,两个创建回调函数的签名不要修改,然后会实例化一个AK::PluginRegistration来进行注册
19
  • 除了两个对象创建函数回调外,还可以传入自定义回调函数,进行一些状态与数据有效性的检查或者更新。
20

3.4 接口实现

  • IAkPlugin类视图

a11

  • 插件对象需要实现的接口(本文创建类是IAkInPlaceEffectPlugin)
21
  • Juce的DSP代码只需要通过一个转接层就可以最小化修改的放到Wwise的DSP代码中。这个例子中只需要实现一个juce::AudioBuffer<float>类到AkAudioBuffer类的转接类AkJuceAudioBuffer就可以了
22 
  • DSP部分把Buffer类改为AkJuceAudioBuffer基本就无需其它修改了, init的时候获取更新的效果器参数
23 
  • IAkParam类视图
a12

 

  • 参数对象需要实现的接口
24
  • 修改自定义参数结构和参数ID(参数ID在xml文件中设置过)
25 
  • 修改初始化时默认效果器参数
26 
  • 需要修改从bank获取数据的两个接口
27 

游戏内注册

1. UE4

  • 创建出厂头文件JuceLimitFXFactory.h,并放置到%WWISEROOT%\Wwise 2019.2.9.7459\SDK\include\AK\Plugin目录下
28 
  • AkAudio.Build.cs中增加lib加载信息
29 
  • AkAudioDevice.h中增加之前创建的出厂头文件
30

2. Unity

  • 将动态库放置到\Assets\Wwise\Deployment\Plugins\%Platform%\%Arch%\DSP目录下即可
  • 对于特殊需要静态加载的平台, 手动创建静态加载文件
31 

参考

[1]Alex Rycroft.How to build a VST – Lesson 4: Limiter

[2]WwiseSDK2019.2.9.创建新插件

[3]Joel Robichard.简化 Wwise 音频插件构建管线

李昱宸

游戏音频开发

腾讯游戏光子工作室

李昱宸

游戏音频开发

腾讯游戏光子工作室

眼高手低,志大才疏。混迹音频行业多年,唯一没变的是对创造的热情。现在最享受将大家的脑洞变为现实,分享知识的快乐。

网站

知乎

豆瓣

评论

留下回复

您的电子邮件地址将不会被公布。

更多文章

十条你得知道的 Wwise Launcher 用法(2019 版)

注:本文基于 2018 年初在 Audiokinetic 公众号上发表的文章《十一条你可能不知道的 Wwise Launcher 用法》,由作者针对软件更新做了改动,不影响操作的截图沿用旧版本。...

15.7.2019 - 作者:李北南

常用智能手机的声音响度和频响

29.7.2019 - 作者:杨杰 (Digimonk)

多人游戏如何利用语音聊天大幅提升玩家体验

最近为了抗击新冠疫情,很多人不得不宅在家里,使得手机游戏和主机游戏异常火爆。据游戏网站 SteamDB 统计,在三月中旬光是 Steam 玩家就创下了 2030...

19.10.2020 - 作者:TechJVB

Wwise Unity 速查表

今天我们来说说 Wwise Unity Integration。这些年来,相关学习资源越来越丰富,随时都可以拿来参考。就拿 Audiokinetic 官方资源来说,YouTube...

19.1.2021 - 作者:麦斯·麦雷蒂·桑德鲁普 (Mads Maretty Sønderup)

Wwise语音管理探究

游戏的角色语音管理是一项细致且繁琐的工作。从项目的前期到后期,会遇到对角色语音的增删改查、添加动态效果处理及创建不同语种间的切换等需求。建立一套稳定可靠的语音管理流程会为工作带来效率。...

2.3.2021 - 作者:吉吉(徐喆)

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

游戏音频设计技能:对 100 条游戏音频职位招聘信息的分析

9.3.2021 - 作者:布莱恩·施密特 (Brian Schmidt)

更多文章

十条你得知道的 Wwise Launcher 用法(2019 版)

注:本文基于 2018 年初在 Audiokinetic 公众号上发表的文章《十一条你可能不知道的 Wwise Launcher 用法》,由作者针对软件更新做了改动,不影响操作的截图沿用旧版本。...

常用智能手机的声音响度和频响

多人游戏如何利用语音聊天大幅提升玩家体验

最近为了抗击新冠疫情,很多人不得不宅在家里,使得手机游戏和主机游戏异常火爆。据游戏网站 SteamDB 统计,在三月中旬光是 Steam 玩家就创下了 2030...