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

硬體連線和啟動

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

串流的啟用和停用

與裝置建立連線之後,呼叫端應傳送串流啟用命令以進行摺積、FFT 或 IFFT。呼叫端必須在 XDspActivationParameters 中指定 XDspProcessType、區塊框架計數、聲道計數、以浮點數為單位的脈衝回應長度,以及指向頻域中脈衝回應資料的指標。只允許單聲道或立體聲串流。對於 XDspProcessType::ForwardFourierTransform 和 XDspProcessType::inverseFourierTransform,XDspActivationParameters::impulseResponse 應為 nullptr,且 XDspActivationParameters::impulseResponseLengthInFloats = 0。應適當地設定 XDspActivationOptions。 以下是啟用一個正向傅立葉轉換串流的程式碼,反向傅立葉轉換的程式碼也類似。
XDspActivate 會以其中一個參數傳回 XDspStatus 緩衝區。此 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 錯誤。
Last modified on October 6, 2026