目录

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

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

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

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

Wwise Authoring 插件

管理插件媒体

重载函数 AK::Wwise::IAudioPlugin::SetPluginObjectMedia ,存储指针供今后使用。在 Wwise 插件(设计工具部分)初始化时将调用此功能。通过实现此功能,您将收到 IPluginObjectMedia* 的接口,以便您管理媒体文件。

class MyPlugin : public AK::Wwise::IAudioPlugin
{
...
virtual void SetPluginObjectMedia( IPluginObjectMedia * in_pObjectMedia )
{
m_pObjMedia = in_pObjectMedia;
}
}

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

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

后面您可以调用 AK::Wwise::IPluginObjectMedia::InvalidateMediaSource 来请求转码媒体文件。重载函数来接收当插件数据改变时的通知。

virtual void NotifyPluginMediaChanged()
{
// 对变化做出反应
// ...
// 通知 Wwise 需要重新转码数据
m_pPSet->NotifyInternalDataChanged( AK::IAkPluginParam::ALL_PLUGIN_DATA_ID );
}

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

为运行时组件转码媒体

您可能需要为运行时组件转码您的媒体。要实现转码功能,您需要从 AK::Wwise::IPluginMediaConverter 继承并实现必要的功能(包括 ConvertFileGetCurrentConversionSettingsHash),这些功能可让您将导入的原始 WAV 转码成实时组件的相应格式。

一旦实现 AK::Wwise::IPluginMediaConverter 中的所有函数,您就可以重载 GetPluginMediaConverterInterface() 函数来告诉 Wwise 您希望转码您的媒体。

virtual AK::Wwise::IPluginMediaConverter* GetPluginMediaConverterInterface()
{
return this;
}

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

AK::Wwise::ConversionResult YourPlugin::ConvertFile(
const GUID & in_guidPlatform,
const BasePlatformID & in_basePlatform,
LPCWSTR in_szSourceFile,
LPCWSTR in_szDestFile,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength,
AK::Wwise::IProgress* in_pProgress,
{
// 将原始源文件转码成经过转码的文件。
// 至少将源始文件复制到已转码的文件中
::CopyFile(in_szSourceFile,in_szDestFile, FALSE);
}
ULONG YourPlugin::GetCurrentConversionSettingsHash( const GUID & in_guidPlatform, AkUInt32 in_uSampleRate , AkUInt32 in_uBlockLength )
{
AK::FNVHash32 hashFunc;
// 使用影响转码的参数生成哈希值。
// 提取源文件名称。
CString szInputFileName;
m_pObjMedia->GetMediaSourceFileName( szInputFileName.GetBuffer( _MAX_PATH ), _MAX_PATH );
szInputFileName.ReleaseBuffer();
szInputFileName.MakeLower();
return hashFunc.Compute( (unsigned char *)(LPCTSTR)szInputFileName, szInputFileName.GetLength()*sizeof(TCHAR) );
}

插件定义

在插件定义文件中,确保您将 CanReferenceDataFile 元素设为 true

<PluginModule>
<EffectMixerSourceOrSinkPlugin 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; // 没有冲激响应的时候无需实例化插件。
...
}
Note: 本例展示了如何在运行时使用 effect 插件媒体。不过,只需对其中的参数稍作调整,就可用来阐释如何使用另一插件类型,如 source 插件。在这种情况下,要实现 AK::IAkSourcePlugin接口,并接收 AK::IAkSourcePluginContext 指针 。

在 Wwise 中的用法

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

在 Wwise 中所有总线效果器存储在 Init.bnk 中。为了避免 Init.bnk 过大,插件媒体不会自动添加到 Init.bnk 中。您需要手动添加效果器 ShareSet(共享集),或者将总线添加到单独的 SoundBank中去。