Skip to main content
在本主題中,我們將使用 Microsoft Game Development Kit (GDK) 隨附的其中一個範例,逐步說明如何在 XBOX Series X 裝置上使用硬體摺積殘響的預期程式碼流程。

硬體連線和啟動

必須透過 XDspConnect 或 XDspConnectWithMaximumStreamLimit 與硬體加速單元建立連線。呼叫端會使用下列參數設定連線的需求:
  1. baseBuffer - 指向使用者配置記憶體的指標,此記憶體必須足以容納將傳遞給硬體的輸入、輸出、包絡緩衝區和/或區塊乘數緩衝區。此記憶體應透過 XMemAlloc 以下列屬性配置:XALLOC_MEMTYPE_PHYSICAL_CACHEABLE、XALLOC_PAGESIZE_64KB、XALLOC_ALIGNMENT_64K。這些屬性應使用 MAKE_XALLOC_ATTRIBUTES() 設定,如下列範例所示。在 XDspDisconnect 呼叫成功之前,不應釋放此記憶體。此緩衝區的大小應至少為 64KB。
  2. baseBufferLength - baseBuffer 的長度 (以位元組為單位)。此緩衝區應至少為 64KB,且不超過 500 MB。
  3. aggregateImpulseResponseInSeconds - 代表將使用 XDspActivate 搭配 XDspProcessType::Convolution 同時啟用的所有個別脈衝回應的總持續時間。如果此值為 0,則無法啟用任何使用 XDspProcessType::Convolution 的串流。
  4. handle - 指向 XDspClientHandle 的指標,用來保存此呼叫所傳回的控制代碼。
如果呼叫成功,呼叫端就可以使用 baseBuffer,透過 XDspCommand 參數傳遞輸入資料並擷取串流的輸出資料。在 XDspCommand 中傳遞的任何緩衝區都應以 16 位元組對齊。下列簡單緩衝區管理員範例可用於管理輸入和輸出緩衝區。
與輸入和輸出緩衝區類似,每個串流的包絡緩衝區都應該是傳遞給 XDspConnect 或 XDspConnectWithMaximumStreamLimit 之 baseBuffer 的一部分。每個包絡緩衝區的長度可依下列方式計算。
以下是配置記憶體並建立連線之第一個步驟的程式碼範例。請注意,如果可作用中的串流數目低於 256,可以使用 XDspConnectWithMaximumStreamLimit 取代 XDspConnect,以減少內部記憶體使用量。
其中 XMemAllocAttributes 代表上述的屬性。下列程式碼會將 aggregateImpulseResponse 設定為 32 秒。

串流的啟用和停用

與裝置建立連線之後,呼叫端應傳送串流啟用命令以進行摺積、FFT 或 IFFT。呼叫端必須在 XDspActivationParameters 中指定 XDspProcessType、區塊框架計數、聲道計數、以浮點數為單位的脈衝回應長度,以及指向頻域中脈衝回應資料的指標。只允許單聲道或立體聲串流。對於 XDspProcessType::ForwardFourierTransform 和 XDspProcessType::inverseFourierTransform,XDspActivationParameters::impulseResponse 應為 nullptr,且 XDspActivationParameters::impulseResponseLengthInFloats = 0。應適當地設定 XDspActivationOptions。 以下是啟用一個摺積串流的程式碼。
XDspActivate 會以其中一個參數傳回 XDspStatus 緩衝區。此 XDspStatus 緩衝區應用來尋找硬體為此串流所處理之命令的狀態。收到啟用結果之後,呼叫端就可以開始提交資料以進行摺積/FFT/IFFT。這應使用 XDspSubmitCommand 或 XDspSubmitCommandWithEnvelope API 來完成。每次呼叫時,呼叫端都必須執行下列動作:
  1. 以剛好 blockFrameCount 的資料填入輸入緩衝區。
  2. 以適當的值以及 16 位元組對齊的輸入和輸出緩衝區填入 XDspCommand。
  3. 呼叫 XDspSubmitCommand 將命令提交至硬體。此函式會傳回命令序號,可用來追蹤傳送至硬體的命令數目。
  4. 若要套用包絡,請以脈衝回應篩選器每個區塊的增益值填入包絡緩衝區,並呼叫 XDspSubmitCommandWithEnvelope,並持續以相同的包絡緩衝區進行此呼叫,直到不再需要包絡或需要變更包絡為止。
  5. 不再需要包絡時,請以 nullptr 作為 envelopeBuffer 呼叫 XDspSubmitCommand 或 XDspSubmitCommandWithEnvelope。請注意,以 nullptr 作為 envelopeBuffer 的 XDspSubmitCommandWithEnvelope 等同於 XDspSubmitCommand。
  6. 切換包絡時,只有在硬體已處理所有使用目前 envelopeBuffer 的命令且結果已被取回時,才能為下一個包絡更新該緩衝區。否則,請使用不同的包絡緩衝區。
下列程式碼片段示範以脈衝回應篩選器每個區塊的增益值填入包絡緩衝區的範例。此處示範如何只使用脈衝回應篩選器的前半部,前半部脈衝回應區塊的增益值從 1.0f 開始線性遞減,而後半部則以 0.0f 的增益值填入。對於立體聲脈衝回應篩選器,左聲道的整個篩選器後面接著右聲道的篩選器;立體聲脈衝回應篩選器的包絡緩衝區也遵循相同的模式,整個左聲道的增益值後面接著整個右聲道的增益值。如需計算包絡緩衝區大小的相關資訊,請參閱使用 XDSP API 的包絡概觀。
下列程式碼片段示範以有效的 envelopeBuffer 呼叫 XDspSubmitCommandWithEnvelope 來套用包絡。這與示範如何使用 XDspSubmitCommand 提交命令的程式碼片段相同,只是多傳入了 envelopeBuffer 參數。應重複執行此動作,直到不再需要包絡為止,屆時應呼叫 XDspSubmitCommand,或以 nullptr 作為 envelopeBuffer 呼叫 XDspSubmitCommandWithEnvelope。
接下來,可以依下列方式檢查 XDspStatus,以尋找提交至硬體之命令的狀態:
當串流中的封包已處理完畢,或硬體在 XDspStatus 結果中傳回錯誤時,應呼叫 XDspDeactivate。
如果硬體尚未處理完為此串流提交的所有命令,XDspDeactivate 會傳回 XDSP_E_PENDING_RESULTS。

終止

XDspDeactivate 成功之後,呼叫端必須呼叫 XDspDisconnect 以中斷與音訊硬體加速單元的連線,以釋放所有已配置的資源。如果並非所有串流都已停用,XDspDisconnect 將傳回 XDSP_E_NOT_ALL_HANDLES_DEACTIVATED 錯誤。

參考 API 文件

另請參閱

XDSP 概觀 使用 XDSP API 的包絡概觀
Last modified on October 6, 2026