目次

Wwise SDK 2018.1.11
Wwise オーディオ デバイス プラグインの作り方 (Sink プラグイン)

オーディオデバイスプラグインインターフェースの実装

オーディオ デバイス プラグインは、オーディオの処理チェーンの最終ポイントです。Natural AudioデバイスはOSのサウンドシステムですが、追加のハードウェアやドライバを使うことで許容される場合は、他の出力も可能です。シンクプラグインの役目は、ミックスされた最終オーディオサンプルを、デバイスが分かる形式でデバイスに転送することです。

サウンドエンジンコンポーネント

オーディオデバイスプラグインを書くことは、サウンドエンジン側では、 AK::IAkSinkPlugin インターフェースの実装を意味します。ここでは、これらのインターフェースに固有の関数のみがカバーされています。他のプラグインタイプと共有されるインターフェースコンポーネント( AK::IAkPlugin インターフェース)に関する情報については、Wwise サウンドエンジン プラグインの作り方 を参照してください。サンプルコードは、提供のAkSink プラグインを参照してください (サンプル) 。

オーディオデバイスは常に、そのオーディオデバイスが使用するプラグイン(Audio Deviceシェアセット)と具体的なデバイスIDによって、特定されます。このデバイスIDはWwiseサウンドエンジンにとって特に意味はなく、プラグインの作成者が、同じ種類のデバイスが多数ある場合にそれぞれ区別できるためだけのものです。 AK::SoundEngine::Initや AK::SoundEngine::AddOutputで使われる AkOutputSettings::idDeviceパラメータを経由して、ゲームから送信されます。例えば、Windowsのオーディオデバイスにアクセスするオーディオデバイスプラグインからは、あるコンピュータ上で多数のWindowsデバイスを確認する可能性があります。

複数あるデバイス同士を区別する必要のないデバイスを使う場合は、このパラメータを無視します。一方、これを実装する必要がある場合は、 idDevice パラメータが 0 の時に選択される "デフォルトデバイス"のコンセプトに、必ず対応してください。 0を受信した時に、最初に使用できるデバイスを選択するのか、特定デバイスを指定するのかは、プラグインプログラマーの自由です。

Wwiseオーサリングアプリケーションでプラグインを使用する場合、パラメータが RTPCに対応しているかどうかに関わらず、パラメータは定期的に更新されます。これにより、Wwise 使用の必要に応じて、プラグインは非 RTPC 値の実行時の値の変更をサポートすることができます。プラグインがこれをサポートしないようにデザイン段階でするには、初期化時にパラメータ値のコピーを作成し、プラグインの存続期間を通じてこれらの値が変化しないようにする必要があります。

オーディオデバイスプラグイン用の、WwiseオーサリングDLL

シンクプラグインも他のプラグインと同様に、オーサリングDLL側で対応する部分が必要です。全プラグイン共通となるWwiseオーサリング側のコンポーネントの、基本的な設定については、 Wwise プラグイン DLL の作成方法 を参照してください。また、シンクプラグインに対して、DLL: AkGetSinkPluginDevices からエクスポートした関数を追加で設定できます。この関数の目的は、テストする時にオーサリングツールで選択できるデバイスを表示させるためで、Audio Hardware Preferences ダイアログに表示されます。この関数はオプションです。これを実装しないと、必要に応じてプラグインがデフォルトの出力先に初期化すると予想されます。

Wwiseは AkGetSinkPluginDevices をコールして、その際にプラグインID、事前にアロケーションした OutputDeviceDescriptor のアレイ、そしてアレイの最大サイズを提供します。デバイス名の長さは、最大 AK_MAX_OUTPUTDEVICEDESCRIPTOR (256文字)です。カウント(io_uMaxCount)が正しく入力された記述子の数を反映するように、修正します。

void __stdcall AkGetSinkPluginDevices(unsigned short in_usCompanyID, unsigned short in_usPluginID, AK::Wwise::OutputDeviceDescriptor * io_Devices, unsigned int &io_uMaxCount)
{
if (in_usCompanyID == MY_COMPANY_ID && in_usPluginID == MY_PLUGIN_ID) // Validate the plug-in ID.
{
if (io_uMaxCount > 2) // Make sure there is enough space in the array.
{
wcscpy_s(out_rDesc.name, AK_MAX_OUTPUTDEVICEDESCRIPTOR, L"First Device"); // Copy the name of the first device. (This is visible to the user.)
io_Devices[0].idDevice = 1234; // ID of this device. (Can be anything meaningful for the plug-in; this will get passed back into IAkSinkPlugin::Init.)
wcscpy_s(out_rDesc.name, AK_MAX_OUTPUTDEVICEDESCRIPTOR, L"Second Device"); // Copy the name of the second device. (This is visible to the user.)
io_Devices[1].idDevice = 4567; // ID of this device. (Can be anything meaningful for the plug-in; this will get passed back into IAkSinkPlugin::Init.)
}
}
}

この関数をDLLからエクスポートする必要があり、通常は以下のようにDEFファイルに1行追加します:

LIBRARY "MyPlugin"
EXPORTS
AkCreatePlugin
AkGetSinkPluginDevices
Note: プラグインをUnityやUnrealで見せるには、ランタイムダイナミックライブラリ(DLL、つまりdylib)を必ず作成します。これは、オーサリングDLLとは異なります。ダイナミックライブラリ 参照

オーディオ デバイス プラグインをテストする

プラグインのWwise側( effectpluginwwise)とサウンドエンジン側の部分を実装後、以下の手順でプラグインをテストできます:

  • Wwise プロジェクトで、新しいプラグインを使って Audio Device Shareset を作成します。ShareSet には固有な名前をつけてください。
  • バンクを生成し。
  • プラグインがゲームコードで登録されているかを確認します。 Wwiseサウンドエンジン プラグインの概要 参照してください。
  • サウンドエンジンの初期化パラメータに使用する、オーディオデバイスIDを指定します。AkOutputSettingsにあるIDは、このプロジェクトのAudio Deviceシェアセットの名前のハッシュ値であり、 AK::SoundEngine::GetIDFromString で提供されるものです。

例:

AkInitSettings initSettings;
AkPlatformInitSettings platformInitSettings;
initSettings.settingsMainOutput.audioDeviceShareset = AK::SoundEngine::GetIDFromString("YourNewAudioDeviceSharesetNameHere");
AK::SoundEngine::Init( &initSettings, &platformInitSettings );

あるいは、オーディオデバイスプラグインを、 AK::SoundEngine::AddOutputと合わせて使うこともできます。

AkOutputSettings outputSettings("YourNewAudioDeviceSharesetNameHere", 0 /*Default device*/)'
AK::SoundEngine::AddOutput(outputSettings);

詳細については、以下のセクションを参照してください: