版本

menu_open
Wwise SDK 2019.1.11
如何创建 Wwise 音频设备插件( Sink 插件)

音频设备插件接口实现

音频设备插件(Audio Device plug-in)是音频处理链的终端。自然音频设备是指操作系统原生支持的声音系统。倘若附加硬件或驱动程序允许,还可以有更多输出终端形式。Sink 插件的作用是将最终混音采样转码为兼容格式并传输至设备。

\subsectionse_audiodevice_engine 声音引擎组件 在声音引擎端编写音频设备插件的过程包括实现 AK::IAkSinkPlugin 接口。本节只介绍此接口专用的函数。请参阅 如何创建 Wwise 声音引擎插件 了解与其他插件类型(AK::IAkPlugin 接口)共享的接口组件的信息。另请参阅与所述 AkSink 插件相关的示例代码(samplecode)。

音频设备始终通过其所用插件 (Audio Device ShareSet) 和设备 ID 指定。此设备 ID 对 Wwise 声音引擎来说并无意义,只是为了方便插件实现类区分多个相同类型的设备。该 ID 由游戏通过 AK::SoundEngine::InitAK::SoundEngine::AddOutput 中使用的 AkOutputSettings::idDevice 参数传递。比如,对于要访问 Windows 音频设备的音频设备插件,可能会识别出某台电脑上的多个 Windows 设备。

若所用设备无需与多个设备区分,则可忽略该参数。若需要区分,则还须支持“默认设备”概念(在 idDevice 参数为 0 时选择的设备)。插件参数决定在接收到 0 值时是选择第一个可用设备还是特定设备。

在 Wwise 设计工具中使用插件时,将定期更新参数,而不管参数是否支持 RTPC。如果使用 Wwise 时需要,这可以让插件支持在运行时更改非 RTPC 参数的值。若在设计时不希望插件支持该功能,则需在初始化时保留参数值副本,以便确保在使用插件的过程中保持值不变。

适用于音频设备插件的 Wwise 设计工具 DLL

跟其他插件一样,Sink 插件也需要对应的设计工具 DLL。有关插件通用 Wwise 设计工具组件的基本设置,请参阅“ 如何创建 Wwise 插件 DLL ”。此外,Sink 插件还可使用从 DLL 导出的 AkGetSinkPluginDevices 函数。此函数的作用是填写用户可在设计工具中选择用于测试的设备(Audio Hardware Preferences 对话框中)。此函数是可选的。若不使用该函数,则插件将在必要时初始化为默认输出。

Wwise 将使用插件 ID、OutputDeviceDescriptor 的预分配数组和数组的最大大小来调用 AkGetSinkPluginDevices。设备名称的最大长度为 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) // 验证插件 ID。
{
if (io_uMaxCount > 2) // 确保数组中有足够空间。
{
wcscpy_s(out_rDesc.name, AK_MAX_OUTPUTDEVICEDESCRIPTOR, L"First Device"); // 复制第一个设备的名称。(This is visible to the user.)
io_Devices[0].idDevice = 1234; // 此设备的 ID。(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"); // 复制第二个设备的名称。(This is visible to the user.)
io_Devices[1].idDevice = 4567; // 此设备的 ID。(Can be anything meaningful for the plug-in; this will get passed back into IAkSinkPlugin::Init.)
}
}
}

通常,必须在 DEF 文件中添加以下命令行并将此函数从 DLL 导出:

LIBRARY "MyPlugin"
EXPORTS
AkCreatePlugin
AkGetSinkPluginDevices

备注: 若要将插件整合到 Unity 或 Unreal 中,请记得创建运行时动态链接库(DLL、SO、DYLIB)。这与设计工具 DLL 有所不同。请参阅 动态库

测试您的音频设备插件

在实现了插件的 Wwise 部件(effectpluginwwise)和声音引擎部件后,应该对您的新插件进行测试。以下是测试的步骤。

  • 在您的 Wwise 工程中,根据新插件创建 Audio Device ShereSet(音频设备共享集)。为 ShareSet 指定名称,保证不重名。
  • 生成 SoundBank。
  • 确保已在游戏代码中注册插件。请参阅 Wwise 声音引擎插件概述
  • 在声音引擎初始化参数中指定要使用的音频设备ID。AkOutputSettings 中的 ID 为工程中 Audio Device ShareSet 名称的哈希值(由 AK::SoundEngine::GetIDFromString 给出)。

例如:

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

另外,也可结合 Audio Device 插件使用 AK::SoundEngine::AddOutput。

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

有关更多信息,请参阅以下各节:

AkOutputSettings settingsMainOutput
Main output device settings.
Definition: AkSoundEngine.h:224
AKSOUNDENGINE_API AKRESULT Init(AkInitSettings *in_pSettings, AkPlatformInitSettings *in_pPlatformSettings)
AKSOUNDENGINE_API AKRESULT RegisterGameObj(AkGameObjectID in_gameObjectID)
Platform-independent initialization settings of output devices.
Definition: AkSoundEngine.h:129
AkUInt32 idDevice
Display name of the device. Null terminated. Note that the name can't be more than 256 characters inc...
Definition: AudioPlugin.h:674
AKSOUNDENGINE_API void GetDefaultInitSettings(AkInitSettings &out_settings)
AK_ID_DECLARE BasePlatformID Windows
Definition: PlatformID.h:87
AKSOUNDENGINE_API void GetDefaultPlatformInitSettings(AkPlatformInitSettings &out_platformSettings)
AKSOUNDENGINE_API AkUInt32 GetIDFromString(const char *in_pszString)
AKSOUNDENGINE_API AKRESULT AddOutput(const AkOutputSettings &in_Settings, AkOutputDeviceID *out_pDeviceID=NULL, const AkGameObjectID *in_pListenerIDs=NULL, AkUInt32 in_uNumListeners=0)
AKSOUNDENGINE_API AkUInt32 GetDeviceIDFromName(wchar_t *in_szToken)
AkUniqueID audioDeviceShareset
Definition: AkSoundEngine.h:142
AKSOUNDENGINE_API AkPlayingID PostEvent(AkUniqueID in_eventID, AkGameObjectID in_gameObjectID, AkUInt32 in_uFlags=0, AkCallbackFunc in_pfnCallback=NULL, void *in_pCookie=NULL, AkUInt32 in_cExternals=0, AkExternalSourceInfo *in_pExternalSources=NULL, AkPlayingID in_PlayingID=AK_INVALID_PLAYING_ID)

此页面对您是否有帮助?

需要技术支持?

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

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

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

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

开始 Wwise 之旅