ACP 概觀
本節說明 ACP 的程式設計介面。acphal 程式庫 (acphal.lib) 定義了可調整硬體音訊處理引擎 (Scalable Hardware Audio Processing Engine,SHAPE) 的 API 集。Microsoft Game Development Kit (GDK) 中也包含一系列音訊公用程式和原始程式碼,協助您準備可搭配 SHAPE 使用的音訊資料。公用程式標頭定義了下列項目:
- 每種支援資料格式的內容結構
- 一組完整的函式,可用來讀取和寫入這些內容
- 流程圖
- DMA 公用程式
- EQ 壓縮器公用程式
- 濾波器音量公用程式
- PCM 公用程式
- SRC 公用程式
- XMA 公用程式
- 目標值
- 執行緒安全
- 針對 PCM 和 XMA 資料使用 SRC 的指導方針
- 暫停和繼續遊戲
流程圖
若要使用 SHAPE,遊戲通常會建立 SHAPE 流程圖。如需替代方法的說明,請參閱 XMA 公用程式一節。SHAPE 流程圖是一個命令陣列 (每個 SHAPE 區塊一個命令) 以及隨附的內容資料,用來描述個別區塊的作業順序及其處理的資料。ACP 會使用流程圖中的資料,正確排程 SHAPE 區塊內的作業。 遊戲負責建置流程圖並將其提交至 ACP。若要建置流程圖,請使用 ShapeFlowGraph (流程圖公用程式方法)。 在下列圖中,綠色區塊代表 SHAPE 元件,青色區塊是來源素材,而有標籤的黃色圓圈則是硬體混音緩衝區。3D 音效
圖 1. 兩個語音,各自在兩個輸出之間平移,並傳送至一個共同輸出。
軟體音訊引擎的前端
圖 2. 軟體引擎的基本前端。使用此模型的所有語音可能都會使用相同的結構。
轉譯音訊
若要轉譯音訊- 建立類似先前範例中所示的流程圖,定義要處理的音訊圖。
- 建立內容結構,定義流程圖將如何處理以及處理哪些內容。
-
使用 SubmitCommand 方法將流程圖提交至 ACP。根據
SubmitCommand的參數,流程圖會處理一次後捨棄,或在每個音訊畫面中處理。 -
遊戲負責更新每個音訊畫面的內容資料,方法是使用
ACP_COMMAND_UPDATE_*_CONTEXT命令,或是將更新與流程圖處理正確同步並手動更新內容。- ACP_COMMAND_UPDATE_DMA_CONTEXT
- ACP_COMMAND_UPDATE_EQCOMP_CONTEXT
- ACP_COMMAND_UPDATE_FILTVOL_CONTEXT
- ACP_COMMAND_UPDATE_PCM_CONTEXT
- ACP_COMMAND_UPDATE_SRC_CONTEXT
- ACP_COMMAND_UPDATE_XMA_CONTEXT
ACP_COMMAND_TYPE_UPDATE_*_CONTEXT 命令在每個音訊畫面更新少量內容。使用這些命令更新大量內容並不有效率,因為除了處理命令之外,還必須將大量內容資料複製並傳輸至 ACP。如果您要更新大量內容,遊戲應修改內容資料,然後將非持續性流程圖提交至 ACP,或善用 ACP_COMMAND_TYPE_START_FLOWGRAPH 命令以及 ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH 命令的 waitForStart 參數,以暫緩處理直到內容更新完成。當流程圖完成處理後,即可再次更新內容。
更新內容的第三種替代方式是使用雙重緩衝處理。遊戲可以在處理流程圖時更新內容的第二份複本,並在音訊畫面開始時交換內容。
流程圖剖析
ACP 會在音訊畫面結束時終止持續性流程圖的剖析,此音訊畫面是有 2.667 毫秒限制的 ACP 音訊畫面。如果遊戲的流程圖需要音訊畫面 75% 的時間來處理,但遊戲直到音訊畫面進行到 30% 時才讓處理開始,則流程圖中未剖析的部分就會被清除。流程圖本身不會被變更。發生這種情況時,如果遊戲已註冊接收訊息,ACP 就會傳送ACP_MESSAGE_TYPE_FLOWGRAPH_TERMINATED 訊息。若要判斷哪些命令未插入內部 SHAPE 佇列,遊戲可以檢查流程圖命令的 queued 旗標。
無論提交時間為何,非持續性流程圖通常都會處理至完成。例外情況之一是由於來源資料無法使用或 disabled 旗標使用不當,而導致一或多個命令被封鎖。遊戲可以在 ACP 音訊畫面期間的任何時間點提交非持續性流程圖,並可確定 (少數邊界情況除外) 它會完成。好處是,只要遊戲仍在 2.667 毫秒的 ACP 音訊畫面間隔內處理流程圖,就不必與音訊時鐘完全同步。風險是,如果遊戲未穩定地提交流程圖,或流程圖需要超過 2.667 毫秒,就可能導致音訊中斷。
以下是流程圖存留期的摘要。
- 持續性流程圖會在 ACP 上保持作用中,直到提交新的流程圖或 null 流程圖 (實際上會將其移除) 將其取代為止。
- 除非用戶端指示 ACP 等待開始命令,否則 ACP 會在音訊畫面開始時開始處理持續性流程圖。
- ACP 會在音訊畫面結束前不久停止處理持續性流程圖,即使尚未完全處理完畢。
- 非持續性流程圖只會在完成前保持作用中,完成後即被移除。
- 非持續性流程圖會在音訊畫面之間保持作用中。只有在完成後才會被移除。
命令處理與流程圖剖析無關。ACP 會持續掃描新命令,並在剖析流程圖或執行其他工作時盡快處理這些命令。
更新流程圖
更新流程圖的選項與先前所述更新內容的選項類似。基本規則相同:請勿在處理流程圖時更新流程圖。 您可以使用三種策略來更新流程圖。- 使用非持續性流程圖,視需要重建,並在音訊畫面開始時提交。遊戲可以視需要多次重複使用相同的流程圖。如果流程圖沒有變更,遊戲就不需要重建。您也可以在處理舊流程圖時建構新流程圖,以雙重緩衝此方法。重建時,不僅可以從頭建構流程圖,還可以透過適當設定混音緩衝區識別碼,視需要儲存和連結流程圖的各個區段。
-
使用持續性流程圖,並只在需要變更時重建和取代。雙重緩衝在此也適用。藉由不使用 ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH 的
waitForStart參數,可以讓 ACP 自由執行。ACP 會在音訊畫面開始時,並在處理完標記為該音訊畫面的命令後,立即開始處理流程圖。或者,可以設定waitForStart參數,以防止在傳送ACP_COMMAND_TYPE_START_FLOWGRAPH命令之前處理流程圖。這不會直接影響流程圖更新,但可稍微改善同步。 -
在流程圖命令上使用
disabled旗標來停用流程圖的部分內容。例如,可以建置一個主流程圖,但每次執行只啟用所需的區段。這必須與選項 1 或 2 搭配使用,才能將新的流程圖傳送至 ACP。請注意,ACP 目前不會周遊流程圖來尋找孤立的區塊。遊戲必須停用流程圖中的完整路徑 (而不只是第一個節點)。如果未這麼做,SHAPE 命令會暫時使硬體停滯。這些停滯可能很單純,例如單一無法處理的區塊以少量成本被移除;也可能嚴重到使整個語音停滯。
ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED 來管理更新,則在 ACP 將訊息新增至訊息佇列到遊戲呼叫 PopMessage 之間,ACP 可能會閒置很長一段時間。請勿使用此方法管理更新,請讓 ACP 保持運作。
多個流程圖
如果多個流程圖的合計需求不超過硬體功能,遊戲可以在每個音訊畫面處理多個流程圖。好處是遊戲可以執行多個音訊引擎 (包括中介軟體和自訂引擎),或將剖析拆分為更容易管理的區塊。缺點是 SHAPE 硬體在此模式下的執行效率會較低。若要達到 SHAPE 的最大輸送量,每個 SHAPE 區塊都必須保持 100% 忙碌,而在處理多個流程圖時是不可能做到的。 每個 ACP 用戶端只能載入一個流程圖。如果用戶端提交新的流程圖,就會取代現有的流程圖。需要支援多個流程圖的遊戲,必須為每種流程圖類型建立個別的用戶端 (每個用戶端都有自己的命令和訊息佇列),或必須等待流程圖完成後再提交新的流程圖。 多個流程圖的支援是設計給多個用戶端使用,而不是單一用戶端。這讓中介軟體引擎可以提交其流程圖,而遊戲則可提交個別的流程圖進行額外的自訂處理。請為遊戲所需的每個 ACP 用戶端建立IACPHAL 介面的執行個體。
由於所有 ACP 和 SHAPE 資源 (尤其是內容陣列) 由所有用戶端共用,因此用戶端必須協調這些資源的配置和共用。
DMA 公用程式
包含 ShapeDMAContext.h 檔案中的直接記憶體存取 (DMA) 公用程式。下列公用程式會在 SHAPE_DMA_CONTEXT 結構上運作。如需詳細資訊,請參閱 ShapeDmaContext (DMA 公用程式方法)。EQ 壓縮器公用程式
包含 ShapeEqCompContext.h 檔案中的 EQCOMP 公用程式。這些公用程式會在 SHAPE_EQCOMP_CONTEXT 結構上運作。 如需詳細資訊,請參閱 ShapeEqCompContext (EQCOMP 公用程式方法)。濾波器音量公用程式
包含 ShapeFiltVolContext.h 檔案中的濾波器音量公用程式。這些公用程式會在 SHAPE_FILTVOL_CONTEXT 結構上運作。 如需詳細資訊,請參閱 ShapeFiltVolContext (FLTVOL 公用程式方法)。PCM 公用程式
包含 ShapePCMContext.h 檔案中的脈衝編碼調變 (PCM) 公用程式。這些公用程式會在 SHAPE_PCM_CONTEXT 結構上運作。 如需詳細資訊,請參閱 ShapePcmContext (PCM 公用程式方法)。SRC 公用程式
包含 ShapeSRCContext.h 檔案中的取樣率轉換器 (SRC) 公用程式。這些公用程式會在 SHAPE_SRC_CONTEXT 結構上運作。 如需詳細資訊,請參閱 ShapeSrcContext (SRC 公用程式方法)。XMA 公用程式
包含 ShapeXMAContext.h 檔案中的 XMA 公用程式。這些公用程式會在 SHAPE_XMA_CONTEXT 結構上運作。 如需詳細資訊,請參閱 ShapeXmaContext (XMA 公用程式方法)。 硬體模擬的 XMA 解碼功能有限。如需詳細資訊,請參閱 SHAPE_XMA_CONTEXT 結構主題。 遊戲可以在不使用流程圖的情況下使用 XMA 資料,但資料仍必須透過 ACP,使用下表所示的 ACP_COMMAND_TYPE 命令。
使用這些命令,遊戲可以依照下列作業順序,以幾乎與使用 XBOX 360 XMA HAL 相同的方式使用 XBOX One ACP HAL。
- 以相關資料填入一或多個內容:緩衝區、位移等。
- 啟用內容。
-
更新內容。如果內容已停用,遊戲可以直接修改其內容。如果內容已啟用,遊戲可以先將其停用,或使用
ACP_COMMAND_TYPE_UPDATE_XMA_CONTEXT命令,後者可能更有效率,因為 ACP 會處理停用、等待和更新。
目標值
公用程式函式中可設定的目標值,代表參數在音訊畫面結束時的最終值。例如,SHAPE_FILTVOL_CONTEXT 結構包含gain 和 gainTarget 的值。在處理畫面時,gain 會使用線性內插和下列方程式計算。
gain 將等於 gainTarget。
可以為 ACP 設定目標參數,如下表所示。
執行緒安全
IACPHAL 介面方法和 ACPHAL 方法是安全執行緒。如果呼叫了 ApuCreateHeap,該堆積會由所有執行緒使用。 下列公用程式函式不是安全執行緒。不過,我們提供了這些函式的原始程式碼。如有必要,您可以讓它們成為安全執行緒。一般的做法是使用關鍵區段物件。- ShapeFlowGraph (流程圖)
- ShapeDmaContext (DMA)
- ShapeEqCompContext (EQCOMP)
- ShapeFiltVolContext (FLTVOL)
- ShapePcmContext (PCM)
- ShapeSrcContext (SRC)
- ShapeXmaContext (XMA)
針對 PCM 和 XMA 資料使用 SRC 的指導方針
下表顯示將 SRC 區塊與 PCM 和 XMA 資料搭配使用的指導方針。完成上述任一情境後,SRC 命令會是
SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE。暫停和繼續遊戲
遊戲必須能夠暫停和繼續,例如當使用者將其置於受限模式時。使用IAcpHal 直接針對 SHAPE 硬體撰寫程式碼時,若要暫停和繼續,只需讓遊戲停止提交命令即可。已提交的命令會正常完成,並可能填滿訊息佇列。
如果遊戲使用持續性流程圖,應載入 null 流程圖以停止處理。這與使用 XAudio2 撰寫程式碼時的暫停和繼續程序不同。如需詳細資訊,請參閱 XAudio2 概觀。
