プラグイン メディアシステムを使うと、プラグイン (エフェクト、ソース、またはミキサー) は、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 を呼び出して、メディアファイルをインポートします。メディアをインポートすると、プラグインのオリジナルディレクトリにコピーされ、Wwiseがこれを完全に管理します。 プラグインメディアをインデックス 0に追加します:
m_pObjMedia->SetMediaSource( tszFilename, 0, bReplace );
後に、AKWwise::IPluginObjectMedia::InvalidateMediaSource を呼び出して、メディアファイルの変換を要求することができます。 プラグインデータを変更する際、この関数をオーバーライドして、通知します
virtual void NotifyPluginMediaChanged() { // React to changes // ... // Notify Wwise the data needs to be reconverted m_pPSet->NotifyInternalDataChanged( AK::IAkPluginParam::ALL_PLUGIN_DATA_ID ); }
詳細については AK::Wwise::IPluginObjectMedia の機能についての文書を参照してください。
ランタイムのためにメディアを変換したい場合があるかもしれません。変換機能を実装するには、AKWwise::IPluginMediaConverter から継承し、インポートしたオリジナルのwavを、リアルタイムのコンポーネントに合わせた適切な形式に変換するために必要な機能 (ConvertFile および GetCurrentConversionSettingsHashを含む) を実装する必要があります。
class MyEffect : public AK::Wwise::IAudioPlugin , public AK::Wwise::IPluginMediaConverter
一度 AK::Wwise::IPluginMediaConverter に全ての機能を実装すると、 GetPluginMediaConverterInterface() 関数をオーバーライドして、Wwise にメディアを変換することを伝えることができます。
virtual AK::Wwise::IPluginMediaConverter* GetPluginMediaConverterInterface() { return this; }
以下は、AKWwise::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 ) { // Convert the original source to a converted file // At minimum, copy the original file to converted ::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; // Generate a Hash from effect parameters that have an influence on the conversion // Take the source file name 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>
プラグインのリアルタイムコンポーネントで、AKIAkEffectPlugin を実装する場合には、 Init(...) 関数で、AKIAkEffectPluginContext ポインターを受け取ります。AKIAkEffectPluginContext から、AKIAkPluginContextBase::GetPluginMedia を呼び出して、変換したメディアを手に入れます。これはWwiseのSoundBankにパッケージされています.
AKRESULT RunTimeEffect::Init( AK::IAkPluginMemAlloc* in_pAllocator, // Memory allocator interface. AK::IAkEffectPluginContext* in_pFXCtx, // FX Context. const AkAudioFormat& in_rFormat // Audio input format. ) { AkUInt8 * pPluginData = NULL; AkUInt32 uPluginDataSize; in_pFXCtx->GetPluginMedia( 0, pPluginData, uPluginDataSize ); if ( pPluginData == NULL ) return AK_Fail; // No point in instantiating plug-in without impulse response ... }
Wwiseでは、すべてのバス エフェクトはInit.bnkに保存されています。Init.bnkが大きくなりすぎるのを避けるため、プラグインメディアを自動的にInit.bnkに追加することはありません。手作業で、エフェクトシェアセットまたはバスを、別のSoundBankに追加する必要があります。