Skip to main content
XBOX One 音訊系統的關鍵元件是可調整硬體音訊處理引擎 (SHAPE),其功能如下:
  • 使用固定功能硬體區塊,有效率地執行常用的音訊功能:XMA、取樣率轉換器 (SRC)、等化器與壓縮,以及篩選器音量
  • 提供可程式化的內嵌音訊控制處理器 (ACP) 來控制這些區塊
下列項目可用於高速作業,並將主記憶體匯流排上的流量降至最低。
  • 用於存取系統記憶體的直接記憶體存取 (DMA) 程序
  • 稱為混音緩衝區的特殊內部記憶體 混音緩衝區是儲存一個完整音訊畫面資料的記憶體區塊。SHAPE 硬體通常會從一個或兩個混音緩衝區讀取,並寫入輸出混音緩衝區。此一般程序有一些例外,例如 XMA 解碼以及 DMA 與 SRC 區塊。
許多遊戲並不會直接實作流程圖。XAudio2 與音訊中介軟體會隱含地實作 SHAPE 元件。不過,建構流程圖可提供最大的彈性,並可存取 XBOX One 主機的音訊加速功能。 本主題提供 SHAPE 硬體與功能區塊的概觀。

控制流程

以下是音訊處理的典型控制流程。
  1. 壓縮的 XMA 音訊資料檔案會載入主系統記憶體。
  2. XMA 解碼器區塊會將部分 XMA 資料解碼為脈衝碼調變 (PCM) 資料。這會將輸出儲存在系統記憶體中的 XMA 解碼緩衝區。
  3. SRC 區塊會從 XMA 解碼緩衝區讀取 PCM 樣本,並執行必要的取樣率轉換與音高偏移。這可讓任意取樣率的音訊資料進入 SHAPE 加速器區塊。SRC 區塊會將以固定 48 KHz 速率執行的音訊資料輸出至內部混音緩衝區。
  4. 現在會執行任何其他 SHAPE 處理,以及對暫存混音緩衝區的讀取和寫入。處理由 ACP 控制,而 ACP 本身則由應用程式透過本文件集所述的 ACP API 驅動。處理包括等化、壓縮、篩選器縮放與音量縮放。
  5. 最後階段稱為喇叭輸出累積,喇叭混音緩衝區會在此收集並混合來自多個音源的樣本以進行播放。選用的全域音訊效果可在此階段處理。
可以使用替代程序,讓主應用程式 CPU 執行更任意的處理。前三個步驟與先前所述的步驟相同。
  1. 壓縮的 XMA 音訊資料檔案會載入主系統記憶體。
  2. XMA 解碼器區塊會將部分 XMA 資料解碼為 PCM 資料,並將輸出儲存在系統記憶體中的 XMA 解碼緩衝區。
  3. SRC 區塊會從 XMA 解碼緩衝區讀取 PCM 樣本,並執行必要的取樣率轉換與音高偏移。這可讓任意取樣率的音訊資料進入 SHAPE 加速器區塊。SRC 區塊會將以固定 48 KHz 速率執行的音訊資料輸出至內部混音緩衝區。
  4. 在此步驟中,程序流程會分歧。DMA 系統會用來將一個或多個混音緩衝區傳輸至主系統記憶體。
  5. 應用程式 CPU 會對主記憶體中的緩衝區執行任何必要的訊號處理。
  6. DMA 系統會用來將處理過的音訊資料從主記憶體緩衝區傳輸至暫存混音緩衝區。在此步驟之後,程序與先前所述的相同。
  7. 現在會執行任何其他 SHAPE 處理,以及對暫存混音緩衝區的讀取和寫入。處理由 ACP 控制,而 ACP 本身則由應用程式透過本文件集所述的 ACP API 驅動。處理包括等化、壓縮、篩選器縮放與音量縮放。
  8. 最後階段 (喇叭輸出累積) 是喇叭混音緩衝區收集並混合來自多個音源的樣本以進行播放的階段。選用的全域音訊效果可在此階段處理。
個別 SHAPE 區塊由兩個主要軟體元素控制:內容與執行清單。內容儲存在主記憶體中,會保留狀態並為特定 SHAPE 硬體區塊內的處理元素提供控制。內容最初由 CPU 產生,但可以由 CPU 或 SHAPE ACP 更新。每個音訊畫面都會依個別硬體區塊的需要,將內容讀入 SHAPE 子系統。在音訊畫面大小為 128 個樣本且取樣率為 48 KHz 的情況下,每個音訊聲道的內容會以 375 Hz 的速率交換。 執行清單由 SHAPE 音訊處理器處理的中繼命令所組成。由於處理器可程式化且具彈性,執行清單的格式與功能也很有彈性。有些中繼命令具有隱含資料,有些則具有明確引數。中繼命令也會使用由硬體配置的混音緩衝區,指定特定 SHAPE 硬體區塊取得輸入的位置以及寫入輸出的位置。傳送至 SHAPE 硬體進行處理的命令清單稱為流程圖,相關說明請參閱 ACP 概觀。圖 1 顯示四個 SHAPE 加速器區塊及其與其他主要元件的互動。 圖 1. 四個 SHAPE 加速器區塊及其與其他主要元件的互動。 四個 SHAPE 加速器區塊

DMA

直接記憶體存取 (DMA) 系統支援讀取/寫入功能,並可自動進行浮點數到整數以及整數到浮點數的轉換。DMA 系統使用環狀緩衝區,其中包含以 128 個樣本為一個區塊的非交錯樣本。 DMA 處理器可讓 SHAPE 引擎將資料從混音緩衝區傳送至主系統記憶體,並將資料從主系統記憶體擷取至混音緩衝區以進行進一步處理。DMA 以區塊為單位執行。一次傳輸一個音訊畫面的資料。為了便於處理區塊交錯資料,略過值會指定在讀取或寫入樣本時,系統記憶體中要略過 (從基底位址起算) 的音訊畫面區塊數目。因此,多聲道串流的每個聲道都需要一個 DMA 內容。 音訊資料樣本一律以 32 位元值 (整數或浮點數) 讀取和寫入,並依照 DMA 內容 FloatConvert 旗標中的指定。為了協助減少資料頻寬量,DMA 的方向 (讀取或寫入) 是在 DMA 命令中指定,而不是在 DMA 內容中指定。DMA 引擎不進行訊號處理,但可以將浮點數轉換為整數,以及將整數轉換為浮點數。這可讓應用程式 CPU 以浮點格式處理資料樣本。 若要計算 DMA 緩衝區的大小,請使用下列公式。
讀取與寫入指標的遞增方式如下。
音訊緩衝區內的位址計算方式如下。
例如,如果 DMA 緩衝區包含三個畫面和四個聲道,緩衝區的組織方式會如圖 2 所示,每個聲道區塊包含 128 個連續樣本。 圖 2. DMA 緩衝區。 音訊 DMA 緩衝區 由於 SHAPE 時脈獨立於 CPU 時脈,因此延遲可能是一項因素。硬體到軟體以及軟體到硬體的轉換會產生 2.66 MS 的延遲。當您同步處理重要程式碼,並針對某些音效使用多次轉換時,請考慮實作以 CPU 時脈為基礎的延遲,以同步處理音效轉譯。此外,請考慮開發可容許延遲的子混音,以協助降低 CPU 使用量。

XMA

XMA 格式支援單聲道、立體聲及交錯的多聲道音效,並具有可變位元速率與壓縮。相較於 XBOX 360 的 XMA 實作,已進行數項改進,包括提高時脈速率 (例如音高偏移功能改善了 40%),以及將語音數從 320 增加到 512。 XMA 解碼器區塊會解碼主記憶體中的部分 XMA 資料,並將 PCM 資料傳回主記憶體中的 XMA 解碼緩衝區。XMA 解碼器區塊與 XBOX 360 XMA 解碼器區塊相同,只有為了與其他 SHAPE 元件互動而進行的少量狀態相關增強功能。 XMA 解碼器暫存器區塊已加入與每個語音解碼輸出相關的狀態資訊。每個 XMA 內容有五個位元,用來指定 PCM 輸出緩衝區中尚未使用的音訊資料量。這些暫存器實作於 XMA 解碼器區塊內。這讓它們隨時可用來判斷是否有足夠的樣本可為 SRC 鎖定內容,而無須讀取主記憶體。
SHAPE 不支援 xWMA,但可透過使用 XAudio2 來支援。

PCM

線性脈衝碼調變 (PCM) 支援 48 KHz 下最多 7.1 環繞音效。例如,如果使用者的音響系統是 5.1 環繞音效或立體聲,ACP 就會進行降混。將支援 S/PDIF 輸出。 也支援包含 16 位元單聲道或立體聲整數、32 位元單聲道浮點數或 32 位元單聲道整數 (24 位元靠左對齊,或遮罩掉較低 8 位元的 32 位元) 的線性與環狀 PCM 緩衝區。

取樣率轉換器 (SRC) 區塊

SRC 區塊會執行以整數為基礎的取樣率轉換,並將輸出資料寫入混音緩衝區。SRC 通常用於模擬樂器、將輸入樣本轉換為比來源低或高一個八度,以及都卜勒和其他效果。 SRC 區塊會從系統記憶體讀取 32 位元浮點 PCM 資料,或 16 位元、24 位元或 32 位元的定點資料。對於輸入資料,區塊可以採用 XMA 硬體解碼器的輸出,或由軟體維護的資料。 由於 SRC 區塊與 XMA 解碼器緊密整合,因此可以判斷 XMA 解碼緩衝區中已解碼 PCM 資料的樣本數,是否足以建立並完成一個音訊畫面的樣本,而無須讀取主記憶體。 SRC 以單聲道或立體聲模式運作。PCM 資料會從記憶體讀取,並轉換為通用的 24 位元定點格式以進行取樣率轉換。視模式而定,輸出會寫入一個或兩個混音緩衝區。 立體聲資料以 16 位元資料的交錯串流形式儲存在記憶體中。左聲道位於每個 32 位元字組的最低有效 16 位元,右聲道位於最高有效 16 位元。同樣在立體聲模式中,PCM 資料會在讀取的同時解除交錯。左聲道資料 (樣本 0,2,4,6…) 會經過處理並輸出至一個混音緩衝區。右聲道資料 (樣本 1,3,5,7…) 會寫入第二個混音緩衝區。圖 3 顯示取樣率轉換模式。 圖 3. 取樣率轉換模式。 取樣率轉換模式 SRC 區塊的輸入可以是不超過 384 KHz 減去 epsilon 的任何取樣率。不過,輸出會是 48 KHz 的固定速率。Epsilon 是要求的整數值與硬體所使用之浮點值之間的微小差異。 SHAPE 每個音訊畫面最多可處理 512 個 SRC 聲道 (單聲道和立體聲的任意組合)。 SRC 支援線性與多相位內插、單聲道與立體聲,以及從 1:16 (降低四個八度) 到 3.99:1 (提高將近兩個八度) 的重新取樣範圍。

等化與壓縮

壓縮器會監視輸入的位準並建立動態增益值,藉此限制訊號的動態範圍。接著,壓縮器會使用增益值作為訊號的乘數,根據輸入訊號的目前位準適當地縮放訊號。換句話說,壓縮器是一種自動音量控制,會持續監視輸入訊號並自行調整。 壓縮器只會作用於超過特定閾值的訊號。低於閾值的訊號會原封不動地通過。閾值由應用程式設定為 EQComp 內容資料的一部分。內容中的可程式化控制項用於執行壓縮或擴展。 壓縮器會根據指定輸入位準與輸出位準比例的參數來改變音效資料。此比例代表輸入訊號超過閾值時要執行的衰減程度。範例如下。
  • 在 2:1 時,每超過閾值 2 dB,壓縮器就會輸出超過閾值位準 1 dB。
  • 在 1:1 時,壓縮器基本上是關閉的。
比例由應用程式設定為內容資料的一部分。下圖 (圖 4) 顯示壓縮器對輸入訊號的效果。低於閾值時,輸出等於輸入。高於閾值時,壓縮器會依比例所指定的量減少輸出 (大約 2:1)。 圖 4. 輸入/輸出音量曲線。 輸入/輸出音量曲線 attack 與 release 參數會指定壓縮器啟動的速度;也就是說,依比例所指定的量完全衰減超過閾值的音效需要多久時間。Attack 與 release 以毫秒為單位指定,對應於壓縮器因應超過或低於閾值的訊號而改變輸出增益的速度。這些調整可以是線性或以對數為基礎。 下圖 (圖 5) 顯示在輸入超過閾值達 attack 所指定的時間之前,不會達到您想要的輸出位準。此圖也顯示只有在輸入低於閾值達 release 所指定的時間之後,輸入與輸出才會回到單位增益。 圖 5. 起音/釋音時間。 起音/釋音時間 接著,輸入會乘以目前的輸出增益。這第一次乘法會執行實際的壓縮,也就是根據輸入振幅,透過隨時間變化的函數縮放訊號。 還有一個額外的增益縮放,這是最後一個步驟。補償增益是由應用程式設定的固定值。由於壓縮 (尤其是在低閾值時) 可能會產生增益相對較低的訊號,因此會使用補償增益將訊號帶回可用的範圍。 壓縮器中還有一個額外參數是 RMS。在一般模式中,輸入位準是瞬時的,並針對每個樣本計算。在 RMS 模式中,會保留前 128 個樣本的移動平均 (RMS 值的近似值)。移動平均會作為輸入位準使用,而不是使用目前輸入樣本的絕對位準。 EQ/壓縮器-擴展器區塊包含兩個串聯的獨立處理單元:三頻段可程式化等化器與動態範圍壓縮器 (圖 6)。此區塊用於控制音效的頻率與動態範圍,並從一個或兩個混音緩衝區取得輸入。
  • 一個輸入是要處理的音訊訊號。
  • 第二個輸入稱為旁鏈,是用來決定音訊壓縮的選用控制訊號。
等化器具有完全可程式化的係數。軟體可以完全控制等化器的傳遞函數。 圖 6. 等化器以三個串聯的雙二階篩選器實作,分別標示為 A、B 和 C。 三個雙二階篩選器 每個雙二階篩選器都會實作下列方程式,其中 x 是輸入,y 是輸出,而 a1、a2、b0、b1 和 b2 是係數。可以在 SHAPE_EQCOMP_CONTEXT 結構中存取這些係數。
一般而言,對音效執行等化時,特定頻率的區域會被削減或增強。削減 (衰減) 頻率時不會產生問題:輸出訊號的位準會等於或低於輸入訊號。然而,增強頻率時,訊號的峰對峰動態範圍通常會相應增加。例如,將低頻增強 6 dB 會使輸出增益高於輸入。如果輸入訊號已經是滿刻度 (-0 dBFS),輸出必定會超過最大值。 因此,三個串接雙二階 EQ 區段內的動態範圍會在二進位小數點左側保留額外 8 位元的精確度,所以 s.23 輸入格式在 EQ 處理期間會變成 s8.23。額外的範圍可讓每個 EQ 階段在大多數情況下提供增益提升,而不會使音訊輸出飽和。不過,在最大輸入條件下,且在所有三個階段套用最大 +18 dB 增益時,第三個階段可能會飽和,在這種情況下,硬體會偵測到此峰值溢位事件。 每個雙二階篩選器的篩選係數 (b0、b1、b2、a1 和 a2) 都是 24 位元整數。這允許最高 +/- 7.998 的係數範圍,適合為允許的篩選器類型、20 Hz 到 18 KHz 的頻率範圍,以及 -18 dB 到 18 dB 的增益範圍提供係數。 壓縮器-擴展器可以在三種旁鏈模式之一中運作。
  • 在一般模式 (圖 7) 中,有來自混音緩衝區的單一音訊輸入。輸入會送入等化器,隨後由壓縮器處理並輸出至混音緩衝區。 圖 7. 一般模式。 一般模式
  • 在內部模式 (圖 8) 中,輸入訊號會直接送入壓縮器的音訊輸入,同時也會分流並傳送至等化器。訊號從等化器傳送至壓縮器的旁鏈輸入。 圖 8. 內部模式。 內部模式
  • 在外部模式 (圖 9) 中,會使用來自兩個獨立混音緩衝區的兩個獨立輸入訊號。輸入訊號會送入等化器,再進入壓縮區塊的音訊輸入。旁鏈輸入訊號會直接送入壓縮器的旁鏈輸入。 圖 9. 外部模式。 外部模式
SHAPE 每個音訊畫面最多可處理 512 個 EQCOMP 內容。

篩選器/音量區塊 (FLTVOL)

FLTVOL 用於執行下列動作:
  • 模擬音效繞過或穿過物體時的遮蔽
  • 將音效的能量分配到多個喇叭,以模擬音效抵達的方向。
FLTVOL 會從混音緩衝區取得單一聲道的輸入資料,對其進行篩選與音量縮放,然後將輸出寫入混音緩衝區。一般而言,會使用數個篩選器/音量控制項來產生一進多出的聲像,例如環繞音效聲像。聲像控制器通常用於取得音效並執行 n 喇叭聲像調整以及一或多個殘響效果。使用狀態變數篩選器,遊戲可以輕鬆建立增強的距離效果,以及 I3DL2 風格的遮蔽與阻礙效果。 就其本質而言,狀態變數篩選器可能會產生共振,導致中間值超過 1.0 或 -1.0。為了減輕中間值飽和所造成的問題,FLTVOL 會對輸入訊號套用可程式化的餘裕空間縮放量,然後在輸出時加以補償。縮放是透過將資料算術右移特定位元數來達成。內容的餘裕空間欄位會指定輸入訊號在 FLTVOL 處理之前所接受的右移位元數 (0、1、2 或 3)。例如,如果指定的餘裕空間值為 3,狀態變數篩選器就可以為內部產生的共振與溢位保留額外三個位元 (18 dB) 的餘裕空間。 將輸入資料右移必然會降低低端的精確度。輸入音訊訊號最低的餘裕空間位元會永久遺失。因此,只有在狀態變數篩選器中發生內部飽和時,才將餘裕空間位元指定為非零值。若要這麼做,請檢查 FLTVOL 內容中內部溢位位元的值。如果原始來源資料是 16 位元 (例如,如果原始來源資料是 XMA),通常可以將餘裕空間位元設為其最大值 3,而不會使音效產生明顯變化,因為較低位元本來就會以零填補。 彈性狀態變數篩選器的實作也允許對語音套用共振篩選,以協助建立有趣的音訊效果與變化。為了在進入與離開設定點之間提供平滑的轉換,篩選器參數與音量屬性會逐個樣本逐步調整。FLTVOL 區塊以 Chamberlin 篩選器實作,提供三種模式:高通、低通及具有可變 Q (頻寬) 控制的帶通。Chamberlin 篩選器的參數計算方式如下。
f 與 q 參數由 SHAPE 區塊之外的軟體計算。更新係數時,係數會在一個音訊畫面的期間內逐漸變化至新值。控制位元用於決定要使用哪個輸出 (帶拒、高通、帶通或低通) 作為 FLTVOL 區塊的最終輸出。 每個聲道或串流的內容資料都儲存在系統記憶體中。雖然效能限制為 2560 個 48 KHz 同時串流 (這表示 SHAPE 每個音訊畫面最多可處理 2560 個 FLTVOL 內容),但記憶體中可定址的內容數目更多,以簡化串流重複使用的案例。 篩選行為的設計與 XAudio2 相同。

混音緩衝區

混音緩衝區有三個主要用途。
  • 混音緩衝區可作為系統 (或個別玩家) 每個喇叭輸出的最終混音目的地。處理每個音效時,其後續輸出會混入這些緩衝區。
  • 在硬體區塊之間傳遞音訊資料緩衝區時,混音緩衝區可作為暫存位置。
  • 搭配 DMA 引擎,混音緩衝區可作為將資料從 SHAPE 硬體與音訊子系統傳遞至主系統 以及將資料從主系統記憶體傳回 SHAPE 硬體與音訊子系統的機制。
SHAPE 系統大量使用混音緩衝區。最多可以有 8192 個並行虛擬混音緩衝區 (識別碼從 0 到 8191) 轉譯至 128 個實體聲道。混音可以使用硬體累加器執行,而不需要與記憶體之間的 DMA。混音緩衝區支援計量與截波。

溢位、強度與飽和

在遊戲音訊引擎中,管理餘裕空間可能非常困難。因此,每個 SHAPE 區塊都會維護與訊號餘裕和增益相關聯的狀態。除了 SRC 以外,每個區塊都會維護一個旗標,指出處理期間是否發生內部飽和。 除了內部飽和旗標之外,每個硬體區塊也會維護兩個四位元數字,代表硬體區塊輸出的強度。強度的計算方式是判斷音訊畫面期間的峰值輸出,並計算峰值絕對值的前導零。其中一個四位元數字保存持續的峰值強度,另一個則由硬體在每個音訊畫面重設。 除了監視每個個別硬體區塊的峰值強度之外,也會維護混音緩衝區的峰值強度。當硬體區塊的輸出加入混音緩衝區時,峰值強度會以相同方式計算,也就是計算前導零。每個硬體區塊狀態都會維護另一組四位元峰值強度值。這些值代表硬體區塊的輸出累積到混音緩衝區之後,混音緩衝區的峰值強度。其中一個四位元數字代表持續進行的持續峰值強度。另一個則在每個音訊畫面更新。峰值強度值會儲存在 SHAPE 區塊的內容中,即使所代表的是混音緩衝區狀態。 峰值強度依照下表進行編碼 (程式碼位於 ShapeHardwareContexts.h 檔案中)。 為了協助管理餘裕並避免溢位與飽和,除了細微的增益設定之外,還可以在累積到輸出混音緩衝區之前,對硬體區塊的輸出執行 0 到 7 位元的右移。這會在每個 SHAPE 硬體區塊的內容中指定。

SHAPE 佇列

SHAPE 音訊處理器管理兩個佇列,有助於減少系統硬體與應用程式硬體之間的互鎖。
  1. 命令與控制佇列 (CCQ) 用於提供 SHAPE 音訊處理器一系列命令,讓其在可以執行時執行,通常是在完成目前音訊畫面的處理時。每輸出一個音訊畫面,就會讀取一次 SHAPE 執行清單。不過,CCQ 只會讀取並執行一次。 CCQ 是讓 CPU 在音訊畫面界限更新任何區塊內容資料的機制,而不需要與 SHAPE 硬體進行硬體互鎖。範例包括為 XMA 區塊提供更多位元串流資料、更新各種區塊的內容參數,以及指向新的執行清單。這通常是在變更音訊處理流程圖時執行。
  2. 狀態與報告佇列 (SRQ) 由 SHAPE 音訊處理器用來向 CPU 報告不需要即時回應的各種事件。範例包括位元串流緩衝區使用量的更新、錯誤、警告與旗標、偵錯資料、效能資料及狀態資訊。

程式設計考量

透過 IACPHAL 介面可以直接對 SHAPE 硬體進行程式設計。不過,為 SHAPE 硬體準備音訊資料的程序很複雜。我們提供了許多公用程式方法、結構與列舉。這些公用程式提供控制 SHAPE 硬體所需的全部或大部分方法。Microsoft Game Development Kit (GDK) 包含這些公用程式的原始程式碼,以因應少數需要修改程式碼來處理特定類型資料的情況。 專案中唯一需要明確包含的標頭檔是 acphal.h,它會參考所有公用程式標頭檔。所有公用程式函式都會參考 NO_SHAPE_CONTEXT_VALIDATION 巨集。如果定義了此巨集,就會略過所有驗證。這對最終零售版組建很有用。 如需與 XAudio2 執行個體共用 SHAPE 與 XMA 資源的詳細資訊,請參閱 XAudio2Create 函式的「備註」一節。 如需所有公用程式方法的詳細資訊,請參閱 ACP 概觀。

持續性與非持續性流程圖

您可以將流程圖提交為持續性或非持續性處理。持續性流程圖經過處理後會保持常駐,因此在讀取與寫入指標前進且其他內容資訊更新之後,會在下一個畫面中重複其處理。在下列任一案例中使用持續性流程圖。
  • 高度複雜的流程圖,每個畫面都需要大量 CPU 處理來重新組合
  • 高度靜態的流程圖,在一段較長的期間內具有相同數目與設定的語音
在下列任一案例中使用非持續性流程圖。
  • 語音拓撲經常變更。
  • 遊戲音訊軟體引擎的處理節奏與 SHAPE 硬體脫鉤;也就是說,它不是 2.667 MS 的倍數。
  • 您想要以快於即時的速度執行音訊處理,也就是在圖形可用時立即提交以供使用。

偵錯問題

開發流程圖時,註冊訊息有助於對可能發生的任何問題進行偵錯。具體而言,請使用 Connect 的 NumMessages 參數。訊息系統會針對各種問題提供豐富的意見反應,包括無效的流程圖 (ACP_FLOWGRAPH_TERMINATED_REASON_INVALID_GRAPH)、遭封鎖的命令,以及當您嘗試執行超過硬體 2.667 MS 畫面大小所允許的處理量時所造成的畫面逾時。在發行遊戲之前,請觀察每個已提交流程圖的 ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED 訊息,以確認流程圖處理一致成功。

遺漏的訊息

如果您使用 ACP 訊息來驅動引擎狀態,而且處理許多訊息,則應在開發期間檢查 ACP_MESSAGE 的 droppedMessageCount 欄位。此欄位的值不為零,表示訊息佇列已滿且必須捨棄訊息。在此案例中,請考慮更快地處理佇列並將其加大。

畫面逾時

流程圖可能無法在音訊畫面結束 (2.667 MS) 之前完成的原因有很多,例如處理太多流程圖或處理結構不良的流程圖。對於持續性流程圖,這種未完成的流程圖會產生 ACP_FLOWGRAPH_TERMINATED_TIME_EXCEEDED 訊息,而且這些持續性流程圖將不會完成。相較之下,非持續性流程圖不受此限制,會持續執行直到完成為止,即使跨越多個畫面也一樣。

遭封鎖的命令

SRC 與 DMA 命令在數種案例中可能會被回報為遭封鎖 (ACP_MESSAGE_TYPE_SRC_BLOCKED、ACP_MESSAGE_TYPE_DMA_BLOCKED),如下表所示。 | 命令類型| 封鎖案例| | --- | --- | --- | --- | | XMA SRC| 相關聯的 XMA 內容發生剖析器錯誤或沒有來源資料。錯誤為 SHAPE_XMA_ERROR_STATUS_READ_BUFFER_INVALID_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOUNDARY_INTO_INVALID_READ_BUFFER_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOTH_READ_BUFFER_BOUNDARIES。XMA SRC 不會因為缺少已解碼的資料而封鎖。| | PCM SRC| 相關聯的 PCM 內容為 SHAPE_PCM_MODE_CIRCULAR,且沒有來源資料。| | 讀取 (從混音緩衝區 DMA)| DMA 緩衝區已滿。| | 寫入 (DMA 至混音緩衝區)| DMA 緩衝區是空的。| 命令被判定為遭封鎖之後 (這會發生在命令加入 SHAPE 佇列進行處理之前,以及執行階段),就會從圖形中移除,這可能會導致音訊中斷。在開發期間,請將遭封鎖的命令作為改善流程圖處理時首先查看的地方。此外,在發行之前,請確定您的遊戲完全避免命令遭到封鎖。 您可以確保音訊緩衝區夠大,並以與緩衝區大小相關的固定間隔串流資料,以避免 DMA 命令遭到封鎖。例如,如果您一次串流四個硬體畫面,請確保緩衝區中有這些畫面的某個倍數 (至少以八個畫面進行雙重緩衝),讓硬體可以在遊戲的讀取指標之前寫入。或者,您可以在提交下一個流程圖之前強制清空緩衝區:使用資料、更新 DMA 讀取指標,然後提交流程圖。 SRC 命令有三種模式。
  • SHAPE_SRC_COMMAND_TYPE_START 用於流程圖中幾乎所有的 SRC 命令。執行一般處理,並預期在目前流程圖之後會有更多音訊資料。
  • SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE 用於立即停止處理來源 XMA 或 PCM 資料。SRC 會為此畫面輸出歸零的緩衝區。
  • SHAPE_SRC_COMMAND_TYPE_STOP_END 用於表示語音的最後一個封包。
如果語音的最後一個封包未以 STOP_END 或 STOP_IMMEDIATE 提交,SRC 命令將不會完成,這會導致作用中的流程圖停滯。持續性流程圖會在音訊畫面結束時終止,而非持續性流程圖則永遠不會完成。

同步處理問題

如果您不遵守 SHAPE 硬體使用內容與命令的方式,可能會發生同步處理問題。雖然您的遊戲保有對 ACP 配置記憶體的完整存取權,但請注意不要在內容結構使用中時修改它。您可以使用 SubmitCommand 提交要在特定畫面、下一個畫面開始時或盡快執行的命令。
「盡快」案例仍與任何遊戲 CPU 處理非同步。有些命令可能不會立即完成,例如當內容正在進行不可中斷的作業時。請等候 ACP_MESSAGE_TYPE_COMMAND_COMPLETED,以確認命令確實已處理。
如需詳細資訊,請參閱進入 SHAPE:音訊流程圖建構的最佳做法。
Last modified on October 6, 2026