XAudio 2.9 版本作为 NuGet 包提供。 开发人员可以使用其应用重新分发此版本的 XAudio 2.9。 这允许应用在旧版本的 Windows 上使用 XAudio 2.9,这些版本不包括 XAudio 2.9 作为作系统映像的一部分。 建议使用此可再发行组件而不是从 DirectX SDK 重新分发 XAudio 2.7,因为 XAudio 2.7 自 2010 年以来未更新。
请确保访问 DirectX 登陆页 ,以获取 DirectX 开发人员的更多资源。
支持的平台
XAudio 2.9 NuGet 包(Microsoft.XAudio2.Redist.*.nupkg)包括实现 XAudio 2.9 API 的 32 位和 64 位版本的 DLL。 DLL 被称为 XAUDIO2_9REDIST.DLL。 此 DLL 适用于 Windows 7 SP1、Windows 8、Windows 8.1、Windows 10 和 Windows 11。 ARM 上还有适用于 Windows 11 的 ARM64 DLL 版本。
当 DLL 在 Windows 10/Windows 11 系统上使用时,它会检查属于作系统的XAUDIO2_9.DLL的版本号,如果作系统较新,它将委托对作系统中XAUDIO2_9.DLL的所有 API 调用。 这可确保应用始终使用当前平台上可用的最新版本的 XAudio 2.9。
DLL 不适用于 Xbox One 或 Xbox Series X|S。 如果在 Xbox 上使用,DLL 将始终委托对 Xbox 操作系统中 XAUDIO2_9.DLL 的所有 API 调用。
DLL 不适用于 UWP 应用。 UWP 应用应使用属于操作系统的 XAUDIO2_9.DLL。
安装 NuGet 包
安装 NuGet 包的最简单方法是在 Microsoft Visual Studio 中使用 NuGet 包管理器 。 如果执行此作,Visual Studio 项目文件将自动更新为包含 Microsoft.XAudio2.Redist.targets。 .targets 文件将包含 XAudio2 的头文件的 Include 文件夹添加到项目包含路径的集合中。 .targets 文件还将使 .DLL 或 .EXE 链接到 XAUDIO2REDIST.LIB 和 XAPOBASEREDIST.LIB。
库 XAPOBASEREDIST.LIB 只有在您打算实现自定义 XAudio 处理对象(XAPO)时才需要,如果未使用,您可以将其从 Microsoft.XAudio2.Redist.targets 中删除。
还可以使用其他工具提取 NuGet 包的内容,甚至将文件扩展名重命名为 .zip,并使用任何 ZIP 提取程序工具提取文件。
还有一个
xaudio2redist
端口可用于 VC++ 包管理器。
编译你的应用
选择要包含的标头
XAudio 2.9 NuGet 包包含 Windows 10 SDK 中包含的相同 XAudio2 头文件。 但是,头文件已对其进行了一些调整,以确保你可以在显式面向所有 受支持的平台(包括较旧版本的 Windows)时使用它们。
如果在 Microsoft Visual Studio 中使用 NuGet 包管理器安装 NuGet 包 ,则将头文件的路径放在 Windows SDK 头文件的路径前面。 这意味着,如果项目中的代码包含XAUDIO2.H头文件,它将从NuGet包中选取跨平台头文件。 这是通常期望的行为。
如果手动将路径添加到项目的包含标头中,应小心,因为如果指定顺序错误,可能会从 Windows SDK 中包含特定于 OS 版本的 XAUDIO2.H,而不是 XAUDIO2.H 的跨平台版本。
为了减少包含标头时的错误,NuGet 包中包含每个标头的一个版本,并附加了“REDIST”字样。 例如,除了XAUDIO2.H之外,NuGet 包还包括 XAUDIO2REDIST.H。 如果你愿意,代码可以直接包含XAUDIO2REDIST.H,以消除关于正在使用哪个头文件的任何歧义。 包括使用 -REDIST.H 版本的头文件时,项目文件中列出的包含文件目录的顺序并不重要。
请注意,如果你的应用也在为 Xbox One 编译,则应继续包括 XAUDIO2.H,因为某些特定于 Xbox One 的 API 已从 XAUDIO2REDIST.H 中排除。 此 NuGet 包不适用于 Xbox One。
加载 DLL
我们建议将您的应用程序链接到XAUDIO2REDIST.LIB,并将XAUDIO2_9REDIST.DLL安装到与应用程序的可执行文件相同的文件夹中。 这将导致启动可执行文件后立即加载XAUDIO2_9REDIST.DLL。 但是,如果需要,可以使用 LoadLibraryEx 和 GetProcAddress 按需加载XAUDIO2_9REDIST.DLL。 如果你的应用并不总是需要使用 XAudio2 API,则这是一个很好的解决方案。 但是,如果执行此作,则应将XAUDIO2_9REDIST.DLL加载到应用退出之前,因为尝试卸载 DLL 可能会导致崩溃(如果后台线程仍在 DLL 中执行代码)。
与较旧的 XAudio 2.7 不同,无法使用 CoCreateInstance 加载 DLL。
验证 DLL 签名
Microsoft 使用 SHA-2 签名对 XAUDIO2_9REDIST.DLL 二进制文件进行了签名。 尝试验证签名的任何代码(例如游戏的反作弊模块)都需要支持 SHA-2。 请注意,Windows 7 SP1 最初不支持 SHA-2,需要更新才能添加该功能。 更新以 KB4474419的形式提供。
正在测试
较新版本的 Windows 10 中的空间声音
从 Windows 10 1903 更新开始,如果满足某些条件,XAudio 2.9 会自动使用 虚拟环绕声。 建议测试在 Windows 10 1903(或更高版本)上生成多声道声音的游戏,以验证游戏是否按预期显示。
启用空间声音
用户可以通过右键单击 Windows 系统托盘中的扬声器图标来启用空间声音格式。
如果使用 XAudio2 API 的进程被 Windows 游戏栏识别为游戏,XAudio 2.9 将仅使用用户选择的空间声音格式。 在开发过程中,游戏栏可能尚未将该过程识别为游戏。 若要更改此项,请使用 Win+G 键盘快捷方式在游戏运行时打开游戏栏。 然后单击“设置”图标,并选中显示“记住这是游戏”的复选框。
选择退出空间声音
可以通过在 IXAudio2::CreateMasteringVoice 中为 AUDIO_STREAM_CATEGORY 参数指定特定值,选择退出 XAudio2 使用空间声音编码器。
为以下类别启用空间声音:
- AudioCategory_ForegroundOnlyMedia
- 音频类别_游戏音效
- 音频类别_游戏媒体 (AudioCategory_GameMedia)
- 音频类别_电影
- 音频类别_媒体
如果指定了以下任何类别,则不会启用空间声音:
- 音频类别_其他
- 音频类别_通信
- 音频类别_警报
- AudioCategory_音效
- 音频类别_游戏聊天
- 音频类别_语音
错误处理
测试游戏是否可以处理音频设备的变化,例如,当耳机插入或拔下时,这一点很重要。 这应该使用仅支持 44.1 kHz 采样率的耳机进行测试。 许多低端 USB 耳机和蓝牙耳机仅支持 44.1 kHz。 即使使用 虚拟音频终结点 功能,48 kHz 采样率与 44.1 kHz 采样率之间的转换也可能导致错误。 如果耳机还支持 48 kHz,则不会发生此错误。 请注意,虚拟音频终结点功能在 Windows 7 SP1 上不可用。
当 XAudio 2.9 无法从音频终结点的更改中自动恢复时,会返回错误代码 XAUDIO2_E_DEVICE_INVALIDATED。 但是,我们建议应用程序不要对错误代码的具体数值进行过于严格的依赖。
若要收到错误通知,应用应实现 IXAudio2EngineCallback 接口,并通过调用 IXAudio2::RegisterForCallbacks 方法提供指向该接口的指针。 如果播放期间发生错误,则 XAudio2 API 将调用 IXAudio2EngineCallback::OnCriticalError 的应用实现。
请注意,如果音频管道暂停,则不一定调用 IXAudio2EngineCallback::OnCriticalError 。 例如,如果用户最小化应用,或者出于任何原因暂停应用,音频播放可能会暂停。 如果音频设备更改在此期间发生,则仅当应用调用 IXAudio2::StartEngine 和/或调用 IXAudio2SourceVoice::Start 时,才会返回错误。 如果应用可以暂停播放,则应测试在播放暂停时更改音频设备,以验证应用是否仍可从这种情况恢复。
与 XAudio 2.7 相比,XAudio 2.9 API 差异
本部分总结了 XAudio 2.7 与 XAudio 2.9 的可再发行版本之间的一些 API 差异。
支持的格式
XAudio 2.9 在电脑上支持以下输入格式:
- 线性 16 位 PCM
- 线性 32 位浮点式 PCM
- 16 位 ADPCM
- xWMA
XMA 格式仅在 Xbox One 上受支持。
首选 CPU 核心
可以指定哪个 CPU 核心 XAudio 2.9 应该用于其音频处理线程。 但是,通常首选让 XAudio 2.9 自行选择此值。 为此,在调用 XAudio2Create 时将 XAudio2Processor 参数设置为XAUDIO2_USE_DEFAULT_PROCESSOR。
XAudio 2.9 将在 Xbox One 上选择不同于电脑上的 CPU 核心。 IXAudio2Extension::GetProcessor 方法可用于确定 XAudio2 选择了哪个 CPU 核心。
虚拟音频终结点
在 Windows 8 或更高版本上运行时,XAudio 2.9 默认使用虚拟音频终结点。 这意味着,如果使用 XAudio 2.9 时默认音频终结点发生更改,它将尝试自动切换到新的音频终结点。 这类情况的一个例子是,当默认音频终端是一对通过 USB 连接的耳机时,如果用户将耳机拔下。 这将导致扬声器成为新的默认音频终结点。
如果应用在调用 IXAudio2::CreateMasteringVoice 时指定了特定的音频格式,XAudio 2.9 可能无法执行此开关。 例如,如果应用指定主语音应使用 48 kHz 采样率,并且新音频设备仅支持 44.1 kHz,则自动开关将失败,XAudio 2.9 将报告 XAUDIO2_E_DEVICE_INVALIDATED 错误。
应用可以通过将 XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT 标志传递到 IXAudio2::CreateMasteringVoice 来选择退出使用虚拟音频终结点。
虚拟音频终结点在 Windows 7 SP1 上不可用。 XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT标志对 Windows 7 SP1 不起作用。
音频类别
应用应为其音频流指定类别。 这是通过在调用 IXAudio2::CreateMasteringVoice 方法时提供 AudioCategory 枚举中的值来完成的。 例如,AudioCategory_GameEffects。 音频类别可能会影响 Windows 处理声音的方式,或者它如何表示音量控制面板中的音频流。 音频类别还会影响是否自动启用 虚拟环绕声 。
音频处理量子持续时间
在大多数电脑上,XAudio 2.9 以 10 毫秒的区块处理音频。 这称为处理量子。 但是,在某些硬件上,此量子的持续时间可能与 10 毫秒不同。 需要知道确切量子的应用可以调用 IXAudio2Extension::GetProcessingQuantum 方法来检索值。
空间声音和虚拟环绕
从 Windows 10 1903 更新开始,如果满足某些条件,XAudio 2.9 会自动使用虚拟环绕声。 建议测试在 Windows 10 1903(或更高版本)上生成多声道声音的游戏,以验证游戏是否按预期显示。 有关如何测试此功能的讨论,请参阅 测试空间声音 部分。
通常,XAudio 2.9 会向下折叠任何多声道音频,以匹配音频终结点支持的“物理”音频通道数。 例如,如果游戏提供 7.1 声道音源,但声音在耳机上播放,XAudio 2.9 将使用行业标准折叠矩阵将 7.1 声道音频转换成立体声。 如果计算机连接到 HDMI 音频终结点,as-is 则会通过 HDMI 连接传输 7.1 通道的音频。
Windows 10 添加了对空间音频的支持,使用一个集中式编码器将音频编码为用户选择的空间声音格式。 Windows 10 随附了一种称为 Windows Sonic 的空间声音格式。 可以从 Microsoft 应用商店下载其他格式(如 Dolby Atmos for Headphones)。 某些空间声音格式(如 Windows Sonic 和 Dolby Atmos for Headphones)旨在用于立体声音频输出端。 这些格式使用专有算法将环绕声折叠为立体声,从而实现“虚拟”环绕声效果。 换句话说,听众可以在只戴耳机或使用一对立体声扬声器时,感知到声音从3D空间的不同位置传来。
可以使用 XAudio 2.9 附带的 X3DAudio API 来实现类似的效果。 主要区别在于,X3DAudio 要求应用开发人员专门为 3D 音频编写代码,而虚拟环绕声则会自动应用于任何传统基于通道的音源。
在 Windows 10 1903 及更新版本中,使用 XAudio 2.9 的游戏将使用用户在音频终结点上启用的系统范围空间声音格式(如果有)。 这意味着 XAudio 2.9 通常不会将环绕声折叠到立体声。 相反,环绕声音信号将传送到空间声音编码器(例如 Windows Sonic),以实现虚拟环绕声音效果。
CreateHrtfApo
CreateHrtfApo 函数仅在 Windows 10 上可用。 它未在 XAudio 2.9 可再发行包中实现。