menu
版本
2017.1.9.6501
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
2024.1.5.8803
2023.1.13.8732
2022.1.19.8584
2021.1.14.8108
2019.2.15.7667
2019.1.11.7296
2018.1.11.6987
2017.2.10.6745
2017.1.9.6501
2016.2.6.6153
2015.1.9.5624
插件媒体系统使插件可利用 Wwise 架构存储工程中的二进制数据文件。
以下是在插件中使用插件媒体相对于使用自定义数据的诸多优势:
重载函数 AK::Wwise::IAudioPlugin::SetPluginObjectMedia,存储指针供今后使用。在 Wwise 插件(设计工具部分)初始化时将调用此功能。通过实现此功能,您将收到 IPluginObjectMedia* 的接口,以便您管理媒体文件。
class MyEffect : public AK::Wwise::IAudioPlugin { ... virtual void SetPluginObjectMedia( IPluginObjectMedia * in_pObjectMedia ) { m_pObjMedia = in_pObjectMedia; } AK::Wwise::IPluginObjectMedia * m_pObjMedia; }
您可以通过调用 AK::Wwise::IPluginObjectMedia::SetMediaSource 来导入媒体文件。在导入媒体时,媒体将被复制到插件的 Originals 目录下,全面由 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 继承并实现必要的功能(包括 ConvertFile 和 GetCurrentConversionSettingsHash),这些功能可让您将导入的原始 wav 转码成实时组件的相应格式。
class MyEffect : public AK::Wwise::IAudioPlugin , public AK::Wwise::IPluginMediaConverter
一旦实现 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, LPCWSTR in_szSourceFile, LPCWSTR in_szDestFile, AkUInt32 in_uSampleRate, AkUInt32 in_uBlockLength, AK::Wwise::IProgress* in_pProgress, AK::Wwise::IWriteString* io_pError ) { // 将原始源文件转码成经过转码的文件 // 至少将源始文件复制到已转码的文件中 ::CopyFile(in_szSourceFile,in_szDestFile, FALSE); return AK::Wwise::ConversionSuccess; } 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> <EffectPlugin Name="YOUR_EFFECT" 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; // 没有冲激响应的时候无需实例化插件 ... }
在 Wwise 中所有总线效果器存储在 Init.bnk 中。为了避免 Init.bnk 过大,插件媒体不会自动添加到 Init.bnk 中。您需要手动添加效果器 ShareSet(共享集),或者将总线添加到单独的 SoundBank中去。