版本

menu_open
Wwise SDK 2021.1.14
向音频插件中添加媒体

插件媒体系统使插件(效果器、源插件、Sink 插件或混音器)可利用 Wwise 架构存储工程中的二进制数据文件。

以下是在插件中使用插件媒体相对于使用自定义数据的诸多优势:

  • 内置的数据持久化
  • 集成了版本控制(使用工作组功能)
  • 允许单独为每个平台实施数据转码
  • 允许终端用户选择用来存放数据的 SoundBank

Wwise Authoring 插件

管理插件媒体

您可以通过在后端获取 AK::Wwise::Plugin::RequestObjectMedia 来请求 Object Media 服务。 藉此,可提供成员 m_objectMedia 以访问相应的服务方法。若要接收有关对象媒体的通知(比如在用户执行更改后),请从 AK::Wwise::Plugin::Notifications::ObjectMedia 获取,并覆盖 AK::Wwise::Plugin::Notifications::ObjectMedia::NotifyPluginMediaChanged() 方法。

class MyPluginBackend
: public AK::Wwise::Plugin::AudioPlugin
, public AK::Wwise::Plugin::RequestObjectMedia
, public AK::Wwise::Plugin::Notifications::ObjectMedia
, public AK::Wwise::Plugin::RequestHost
{
void NotifyPluginMediaChanged() override
{
// React to change
// ...
// Notify Wwise the data needs to be reconverted
m_host.NotifyInternalDataChanged(
true /* in_bMakeProjectDirty */
);
}
};

您可以通过调用 AK::Wwise::Plugin::ObjectMedia::SetMediaSource() 来导入媒体文件。 在导入媒体时,其将被复制到插件的 Originals 目录下,并完全由 Wwise 进行管理。 在索引 0 处添加插件媒体文件:

m_pObjMedia->SetMediaSource( pszFilename, 0, bReplace );

在完成此操作后,可调用 AK::Wwise::Plugin::ObjectMedia::InvalidateMediaSource() ,来请求对媒体文件进行转码。

覆盖函数 NotifyPluginMediaChanged 以在插件数据发生更改时接收通知。

void NotifyPluginMediaChanged() override
{
// React to changes
// ...
// 通知 Wwise 需要重新转码数据
m_pPSet->NotifyInternalDataChanged( AK::IAkPluginParam::ALL_PLUGIN_DATA_ID );
}

请参阅 AK::Wwise::Plugin::ObjectMedia 的功能文档了解详情。

为运行时组件转码媒体

有时可能需要在运行时将导入的原始 WAV 媒体转码为适合实时组件的格式。 要想实现媒体转码,需从 AK::Wwise::Plugin::MediaConverter 继承并实现所需函数:

  • AK::Wwise::Plugin::MediaConverter::ConvertFile
  • AK::Wwise::Plugin::MediaConverter::GetCurrentConversionSettingsHash
class MyPlugin
: public AK::Wwise::Plugin::AudioPlugin,
, public AK::Wwise::Plugin::MediaConverter

以下是 AK::Wwise::Plugin::MediaConverter 函数的应用示例:

#include <filesystem>
#include <ctype.h>
AK::Wwise::Plugin::ConversionResult MyPlugin::ConvertFile(
const GUID& in_guidPlatform,
const BasePlatformID& in_basePlatform,
const char* in_szSourceFile,
const char* in_szDestFile,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength,
IProgress* in_pProgress,
IWriteString* io_pError)
{
// Convert the original source to a converted file.
// At minimum, copy the original file to converted
std::filesystem::copy(in_szSourceFile, in_szDestFile);
}
uint32_t MyPlugin::GetCurrentConversionSettingsHash(
const GUID& in_guidPlatform,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength)
{
AK::FNVHash32 hashFunc;
// 使用影响转码的参数生成哈希值。
// 提取源文件名称。
char szInputFileName[_MAX_PATH];
auto size = m_pObjMedia->GetMediaSourceFileName(szInputFileName, _MAX_PATH);
if (size == 0)
return 0;
for (int i = 0; i < size; ++i)
{
szInputFileName[i] = tolower(szInputFileName[i]);
}
return hashFunc.Compute(szInputFileName, size);
}

插件定义

在插件定义文件(即插件 XML 文件)中,确保将 CanReferenceDataFile 元素设为 true

<PluginModule>
<EffectPlugin Name="YOUR_PLUGIN" CompanyID="???" PluginID="???">
<PluginInfo MenuPath="???">
<PlatformSupport>
<Platform Name="Windows">
...
<CanReferenceDataFile>true</CanReferenceDataFile>
</Platform>
<Platform Name="XboxOne">
...
<CanReferenceDataFile>true</CanReferenceDataFile>
</Platform>

运行时插件

在运行时使用插件媒体

在插件的声音引擎部分中实现 AK::IAkEffectPlugin 时,会在 Init(...) 函数中接收 AK::IAkEffectPluginContext 指针。从 AK::IAkEffectPluginContext 中,您可以调用 AK::IAkPluginContextBase::GetPluginMedia 来获取经过转码的媒体,这些媒体打包存储于 Wwise 的 SoundBank 中。

AK::IAkPluginMemAlloc* in_pAllocator, // 内存分配器接口。
AK::IAkEffectPluginContext* in_pFXCtx, // FX 环境。
const AkAudioFormat& in_rFormat // 音频输入格式。)
{
AkUInt8 * pPluginData = NULL;
AkUInt32 uPluginDataSize;
in_pFXCtx->GetPluginMedia( 0, pPluginData, uPluginDataSize );
if ( pPluginData == NULL )
return AK_Fail; // 没有冲激响应的时候无需实例化插件。
...
}
备注: 本例展示了如何在运行时使用 effect 插件媒体。不过,其也可用来阐释如何使用另一插件类型,如 source 插件。在这种情况下,要实现 AK::IAkSourcePlugin 并接收 AK::IAkSourcePluginContext 指针。

在 Wwise 中的用法

在总线效果器中使用插件媒体

在 Wwise 中所有总线效果器存储在 Init.bnk 中。为了尽量减小 Init.bnk 的大小,系统不会将插件媒体自动添加到 Init.bnk。您必须手动将 Effect ShareSet 或总线添加到单独的 SoundBank。

@ AK_Fail
The operation failed.
Definition: AkTypes.h:135
AKRESULT
Standard function call result.
Definition: AkTypes.h:132
uint8_t AkUInt8
Unsigned 8-bit integer
Definition: AkTypes.h:57
virtual void GetPluginMedia(AkUInt32 in_dataIndex, AkUInt8 *&out_rpData, AkUInt32 &out_rDataSize)=0
AKSOUNDENGINE_API AKRESULT Init(const AkCommSettings &in_settings)
ConversionResult
Conversion error code.
Definition: Utilities.h:190
#define NULL
Definition: AkTypes.h:47
@ ConversionSuccess
Definition: Utilities.h:191
uint32_t AkUInt32
Unsigned 32-bit integer
Definition: AkTypes.h:59
HashParams::HashType Compute(const void *in_pData, typename HashParams::SizeType in_dataSize)
Definition: AkFNVHash.h:106
static const AkPluginParamID ALL_PLUGIN_DATA_ID
Definition: IAkPlugin.h:666
Defines the parameters of an audio buffer format.
Definition: AkCommonDefs.h:63

此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅