同步和非同步編解碼器命令
TransferCodecVerbs常式可讓函式驅動程式將命令傳送至連接到 HD 音訊控制器的音訊和數據機編解碼器。 編解碼器命令可以同步或非同步執行:
如果 對 TransferCodecVerbs 的呼叫提交要同步處理的命令清單,則常式只會在編解碼器或編解碼器處理所有命令之後傳回。
如果 對 TransferCodecVerbs 的呼叫提交要以非同步方式處理的命令清單,則常式會在 HD 音訊匯流排驅動程式將命令新增至其內部命令佇列時立即傳回,而不需要等候編解碼器或編解碼器處理命令。 編解碼器處理命令之後,匯流排驅動程式會呼叫回呼常式來通知函式驅動程式。
根據它所傳送之編解碼器命令的本質,函式驅動程式會使用下列一或多項技術,從編解碼器擷取回應:
如果函式驅動程式必須具有編解碼器的回應,才能執行任何其他處理,則會使用同步模式。
如果函式驅動程式不需要等候編解碼器命令完成、若要查看編解碼器回應,以及知道命令何時完成,則它會使用非同步模式、忽略回呼常式 (,除了釋放編解碼器命令的儲存體) 之外,捨棄或忽略編解碼器命令的回應。
如果函式驅動程式必須知道編解碼器命令何時完成,但不需要查看回應,則會使用非同步模式,並依賴回呼常式來通知。 不過,它會捨棄或忽略編解碼器命令的回應。 回呼常式可能會使用 核心串流 (KS) 事件 ,將通知傳送至驅動程式的主要部分。
如果函式驅動程式必須同時知道編解碼器命令何時完成和回應是什麼,但必須立即繼續處理,而不是等候命令完成,則會使用非同步模式,並避免讀取回應,直到收到回呼常式為止。 回呼常式或驅動程式的主要部分都可以檢查回應。
如果 TransferCodecVerbs 成功將命令清單新增至匯流排驅動程式的內部命令佇列,則會傳回STATUS_SUCCESS。 即使呼叫成功,回應可能仍然無效。 函式驅動程式必須檢查編解碼器回應中的狀態位,以判斷它們是否有效。 此規則同時適用于同步和非同步模式。
無效回應的原因可能是下列其中一項:
命令未連線到編解碼器。
編解碼器已回應,但在 RIRB 中發生第一次輸入、先出 (FIFO) 滿溢時,回應就會遺失。
後者的問題表示 RIRB FIFO 的大小不足。
每個編解碼器回應都包含 IsValid 旗標,指出回應是否有效,以及 HasFifoOverrun 旗標,以指出是否已發生 RIRB FIFO 滿溢。 如果 IsValid = 0,表示回應無效, HasFifoOverrun 旗標有助於識別失敗的來源:
如果 HasFifoOverrun = 0,則編解碼器無法在必要的時間間隔內回應。 可能是因為命令從未到達編解碼器。
如果 HasFifoOverrun = 1,則命令可能到達編解碼器,但因 FIFO 滿溢而遺失回應。
呼叫 TransferCodecCommands期間,呼叫端會提供 HDAUDIO_CODEC_TRANSFER 結構的陣列指標。 每個 結構都包含命令,並提供回應的空間。 匯流排驅動程式一律會將每個回應寫入結構,其中包含觸發回應的命令。
對於每一次 對 TransferCodecCommands的呼叫,處理命令的順序取決於陣列中的命令順序。 處理陣列中的第一個命令一律會在處理第二個命令開始之前完成,依此類推斷。
此外,如果用戶端對 TransferCodecCommands 進行非同步呼叫,然後第二次呼叫 TransferCodecCommands 而不等候第一次回呼常式,則會根據用戶端提交兩組命令群組命令的順序定義兩個呼叫群組的相對順序。 因此,匯流排驅動程式會先處理第一次呼叫的所有命令,然後再開始處理第二次呼叫中的命令。
不過,兩個不同的函式驅動程式實例所傳送命令的相對順序是未定義的。 (每個實例都有自己的實體裝置物件。) 例如,如果實例 1 呼叫 TransferCodecCommands 以 A、B 和 C 的順序傳送命令 A、B 和 C,而實例 2 會呼叫 TransferCodecCommands ,以 X-Y-Z 順序傳送命令 X、Y 和 Z,則匯流排驅動程式可能會依 A-X-Y-B-Z-C 循序執行命令。
當個別的函式驅動程式執行緒共用相同硬體資源的存取權時,來自不同驅動程式執行緒的命令相對順序可能很重要。 如果是,函式驅動程式會負責同步處理執行緒之間的資源分享。
例如,將資料位元組序列寫入編解碼器的硬體介面可能包含索引暫存器和 8 位資料暫存器。 首先,函式驅動程式會提交編解碼器命令,以將起始索引載入至索引暫存器。 接下來,驅動程式會提交命令,以將資料的第一個位元組寫入資料暫存器。 索引暫存器會在每次連續寫入資料暫存器之後遞增,直到傳輸完成為止。 不過,如果兩個驅動程式執行緒無法正確同步處理其索引和資料暫存器存取權,則兩個執行緒個別暫存器存取的相對順序未定義,而結果可能是資料損毀或硬體設定無效。
TransferCodecVerbs常式可在兩個 HD 音訊 DDI 版本中使用。