Skip to main content
在本主题中,我们将通过 Microsoft Game Development Kit (GDK) 附带的一个示例,逐步介绍在 XBOX Series X 设备上使用硬件卷积混响的预期代码流程。

硬件连接与启动

必须通过 XDspConnectXDspConnectWithMaximumStreamLimit 建立与硬件加速单元的连接。调用者使用以下参数设置连接的要求:
  1. baseBuffer - 指向用户分配的一块内存,其大小足以容纳将传给硬件的输入、输出、包络缓冲区和/或块乘子缓冲区。该内存应通过 XMemAlloc 分配,属性为:XALLOC_MEMTYPE_PHYSICAL_CACHEABLEXALLOC_PAGESIZE_64KBXALLOC_ALIGNMENT_64K。这些属性应通过 MAKE_XALLOC_ATTRIBUTES() 设置,示例见下文。该内存在 XDspDisconnect 调用成功之前不能释放。此缓冲区至少 64KB。
  2. baseBufferLength - baseBuffer 的长度(字节数)。此缓冲区至少 64KB,且不超过 500 MB。
  3. aggregateImpulseResponseInSeconds - 表示将通过 XDspActivateXDspProcessType::Convolution 同时激活的所有单独脉冲响应的总时长。如果此值为 0,则不能激活任何 XDspProcessType::Convolution 类型的流。
  4. handle - 指向 XDspClientHandle 的指针,用于接收本次调用返回的句柄。
如果调用成功,调用者即可通过 XDspCommand 参数使用 baseBuffer 向硬件传入输入数据并获取流的输出数据。传给 XDspCommand 的任何缓冲区都必须按 16 字节对齐。以下是可用于管理输入输出缓冲区的简单缓冲区管理器示例。
以下是分配内存并建立连接的第一步代码示例。
其中 XMemAllocAttributes 表示上述属性。下列代码将 aggregateImpulseResponse 设为 32 秒。

流的激活与停用

在与设备建立连接后,调用者应发送一个流激活命令以启用卷积、FFT 或 IFFT。调用者必须在 XDspActivationParameters 中指定 XDspProcessType、块帧数、声道数、以浮点数表示的脉冲响应长度以及指向频域脉冲响应数据的指针。只允许单声道或立体声流。对于 XDspProcessType::ForwardFourierTransformXDspProcessType::inverseFourierTransformXDspActivationParameters::impulseResponse 应为 nullptr,且 XDspActivationParameters::impulseResponseLengthInFloats = 0。XDspActivationOptions 应做相应设置。 以下是激活一个卷积流的代码。
XDspActivate 会返回一个 XDspStatus 缓冲区作为其参数之一。该缓冲区可用于查询硬件为该流处理的命令的状态。收到激活结果后,调用者即可开始提交用于卷积/FFT/IFFT 的数据。这应通过 XDspSubmitCommand API 完成。每次调用 XDspSubmitCommand 时,调用者必须:
  1. 用恰好 blockFrameCount 帧数据填充输入缓冲区。
  2. 用合适的值以及按 16 字节对齐的输入/输出缓冲区填充 XDspCommand
  3. 调用 XDspSubmitCommand 将命令提交给硬件。该函数返回一个命令序号,可用于跟踪已发送给硬件的命令数量。
接下来,可按如下方式检查 XDspStatus 以获取已提交给硬件的命令的状态:
当流中的数据包处理完毕,或硬件在 XDspStatus 结果中返回错误时,应调用 XDspDeactivate
如果硬件尚未完成本流所有已提交命令的处理,XDspDeactivate 会返回 XDSP_E_PENDING_RESULTS

终止

XDspDeactivate 成功后,调用者必须调用 XDspDisconnect 断开与音频硬件加速单元的连接,以释放所有已分配的资源。如果并非所有流都已停用,XDspDisconnect 会返回 XDSP_E_NOT_ALL_HANDLES_DEACTIVATED 错误。

参考 API 文档

另请参阅

XDSP 概述
最后修改于 2026年8月24日