對於 Windows based 的應用程式或設備驅動程式來說,處理 real-time 的影音串流資料是一個非常具挑戰性的工作,因為 Windows 本身就不是一個 real-time 的作業系統,沒辦法保證週期性動作能夠準時的執行。 錄音卡通常是由 kernal-mode 的驅動程式控制,驅動程式會把音頻訊號切成一段一段固定長度的資料區塊,並且週期性的對系統發出中斷呼叫來傳送資料,然而 Windows 有一套特殊的中斷控制機制,驅動程式並不能立即在他的中斷程序中完成資料傳輸,而是透過延遲程序呼叫 (Deffered Procedure Call 簡稱 DPC) 排程處理,等清單上其他較早的 DPC 全部完成後才真正進行資料的傳輸。 由於 DPC 的執行按照先進先出的原則,要前一個執行完畢才能執行下一個,所以如果有任何 DPC 花了過多的時間,其他的 DPC 就會被延遲。 為了達到合理的 DPC 延遲,微軟在 Windows 驅動程式開發套件的文件中建議硬體開發廠商必須盡快的返回 DPC 程序,不幸的有很多驅動程式都沒有遵照這個建議。這些驅動程式花費了過長的時間導致其他驅動程式的 DPC 嚴重延遲。而如果當錄音卡發出中斷呼叫準備傳送下一個資料區塊,而上一個 DPC 卻還來不及執行的話,就會發生暫存區溢載而導致斷音。 如果要用比較淺顯易懂的方式來形容的話,想像一下,假設你的老闆每天下午都會叫你去郵局存錢 (呼叫中斷),到郵局第一件事要排隊抽號碼牌,但不是抽完號碼牌錢就存好了,拿到號碼牌還要照著號碼排隊等窗口 (DPC 排程),如果排隊順利,你就可以在銀行關門前把錢存好安心下班。萬一前面碰到一個很 "盧" 的顧客,害你等到郵局關門還存不到錢,拿著錢離開郵局又被搶,結果今天的錢你就存不到了 (斷音)。 在現實生活中,可能你老闆明天也不敢拿錢叫你去存了 (或是你得回家吃自己了),但是對電腦來說,新的資料還是會源源不絕的一直送過來, 如果老是有這種很 "盧" 的顧客的話,你就會常常存不到錢,結果就是嗶嗶啵啵的一直斷音。 要知道自己的斷音是不是 DPC Latency 造成的,有一個工具可以使用 - DPC Latency Cheker,這裡有下載網址: http://www.thesycon.de/dpclat/dpclat.exe 使用的方法很簡單,如果執行以後你看到的圖形都是綠色的像這樣: 那就表示你的系統沒有 DPC Latency 的問題,相反的如果有出現紅色的話,就表示有問題了 (黃色也很危險) 假設已經透過 DPC Latency Checker 確定系統存在 DPC Latency 問題的話,要如何揪出這個很 "盧" 的奧客呢? 其實很簡單,但是很花時間,只要到 Windows 的裝置管理員裡面把有嫌疑的設備一一停用,再一邊檢查 DPC Latency Checker 看症狀是否有改善,就知道奧客是誰了,一旦知道是那個設備在作怪,你可以看看原廠有沒有更新的驅動程式可以改善這個問題,如果沒有的話,非必要的設備乾脆就移除,必要的設備只好買別的牌子 (別種晶片) 的試試看。 但是裝置管理員裡面設備這麼多,要從合下手呢? 這篇文章的參考資料有以下建議: 1. 網路卡或無線網路卡 2. 內建數據機 3. 內建音效卡 4. 任何主機板上額外插的 PCI 卡、PCI-E 卡或筆記型電腦的 PCMCIA 卡、Express 卡 另外以下是不建議嘗試的部分: 1. 任何列在系統裝置下的設備 2. 安裝作業系統的硬碟 3. 連接到這個硬碟的 IDE 或 SATA 介面 4. 鍵盤 5. 滑鼠或其他不可取代的指向設備 6. 如果唯一的鍵盤滑鼠是 USB 的話,對應的 USB 介面也不可停用 7. 顯示卡 8. 我自己補充的,如果你的錄音卡是 USB 或 1394 的話,USB 或 1394 當然也不能停用 以上這些都是系統必須的元件,關掉可能會造成系統不穩,即使能成功關掉而且解決了 DPC 問題,但系統卻變得無法操作的話也沒什麼意義 (除非你有辦法用別的設備取代這些元件) 另外一點經驗分享,曾經有碰到案例是主機版的預設值就有超頻,而超頻也可能造成 DPC Latency 不正常。