目次

Wwise SDK 2018.1.11
オーディオプラグインにメディアを追加する

プラグインメディアのシステムは、Wwiseアーキテクチャを利用して、プラグイン(エフェクト、ソース、シンク、ミキサーなど)からバイナリデータファイルをプロジェクトに保存できるようになっています。

プラグインでカスタムデータを使用する代わりにプラグインメディアを使用することには、幾つかの利点があります:

  • データの組み込み持続性
  • ソース管理の一元化 (ワークグループ機能を使用)
  • プラットフォーム別のデータコンバージョンが可能
  • エンドユーザーが、データを保持するSoundBankを選択することが可能

Wwise オーサリング プラグイン

ブラグインメディアの管理

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 を呼び出して、メディアファイルをインポートします。メディアをインポートすると、プラグインのオリジナルディレクトリにコピーされ、Wwiseがこれを完全に管理します。インデックス0でプラグインメディアファイルを追加するには:

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

後に、 AK::Wwise::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 の機能についての文書を参照してください。

ランタイムのためにメディアを変換する

ランタイムのためにメディアを変換したい場合があるかもしれません。変換機能を実装するには、 AK::Wwise::IPluginMediaConverter から継承し、インポートしたオリジナルのwavを、リアルタイムのコンポーネントに合わせた適切な形式に変換するために必要な機能 (ConvertFile および GetCurrentConversionSettingsHashを含む) を実装する必要があります。

一度 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,
{
// Convert the original source to a converted file.
// At minimum, copy the original file to converted
::CopyFile(in_szSourceFile,in_szDestFile, FALSE);
}
ULONG YourPlugin::GetCurrentConversionSettingsHash( const GUID & in_guidPlatform, AkUInt32 in_uSampleRate , AkUInt32 in_uBlockLength )
{
AK::FNVHash32 hashFunc;
// Generate a Hash from 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>
<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, // 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.
...
}
Note: これは、ランタイムに エフェクト プラグインメディアを使った例です。同時に、 ソース プラグインなど、ほかのプラグインタイプの使い方の参考にもなります。例えばソースプラグインの場合は、 AK::IAkSourcePlugin を実装し、 AK::IAkSourcePluginContext ポインターを受領することになります。

Wwiseでの使い方

Effects Inside Busでプラグインメディアを使用する

Wwiseでは、すべてのバス エフェクトはInit.bnkに保存されています。Init.bnkが大きくなりすぎるのを避けるため、プラグインメディアを自動的にInit.bnkに追加することはありません。手作業で、エフェクトシェアセットまたはバスを、別のSoundBankに追加する必要があります。