版本

menu_open
Wwise SDK 2019.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 函数的应用示例:

#include "AK\Tools\Common\AkFNVHash.h"
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 中。

AKRESULT RunTimeEffect::Init(
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 中。您需要手动添加效果器 ShareSet(共享集),或者将总线添加到单独的 SoundBank中去。

HashParams::HashType Compute(const void *in_pData, unsigned int in_dataSize)
Definition: AkFNVHash.h:102
virtual void GetPluginMedia(AkUInt32 in_dataIndex, AkUInt8 *&out_rpData, AkUInt32 &out_rDataSize)=0
ConversionResult
Conversion error code.
Definition: Utilities.h:219
@ ConversionSuccess
Definition: Utilities.h:220
static const AkPluginParamID ALL_PLUGIN_DATA_ID
Definition: IAkPlugin.h:604
Defines the parameters of an audio buffer format.
Definition: AkCommonDefs.h:60
virtual void SetPluginObjectMedia(IPluginObjectMedia *in_pObjectMedia)=0

此页面对您是否有帮助?

需要技术支持?

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

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

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

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

开始 Wwise 之旅