延遲時鐘

合成器迷你埠驅動程式模型的設計目的是允許在多個裝置之間同步處理音訊輸出。 因此,它包含比純 UART 裝置所提供的更複雜計時模型。

事件會傳遞至 (,並從具有相關聯時間戳記的迷你埠驅動程式) 擷取。 這個時間戳記相對於 主時鐘。 主時鐘是整個系統中所有排序所使用的相同時鐘。 主時鐘時間是以 100 奈秒刻度為單位來測量。

迷你埠驅動程式會藉由呼叫 IMasterClock::GetTime,從主要時鐘取得目前的時間。 在釘選建立期間,埠驅動程式會將核心模式 IMasterClock 介面傳遞至迷你埠驅動程式,作為 IMiniportDMus::NewStream 方法的其中一個輸入參數。 目前,主要時鐘會包裝系統系統時鐘。 當有需要其處於 執行 狀態的針腳時,主時鐘永遠不會變更。 它是永不暫停的固定速率時鐘。

所有轉譯裝置在接受事件的時間與可以聽到事件的時間之間會有一些延遲。 此延遲可以是常數或變數 (,如同軟體合成器的情況,延遲取決於音訊緩衝區的目前播放位置) 。 此延遲會由下列方式補償:

  • 允許 DMus 迷你埠驅動程式事先接收足以即時播放的事件,即使裝置的延遲也一樣。 事件會由 DMus 埠驅動程式中的 Sequencer 引擎排序迷你埠驅動程式。

    在釘選建立時,埠驅動程式會以 100 奈秒單位查詢迷你埠驅動程式是否有差異時間。 這個差異時間是迷你埠驅動程式想要接收事件的每個事件呈現時間前多遠。 埠驅動程式會盡最大努力傳遞事件。 為IMiniportDMus::New) StreamSchedulePreFetch參數所指定的這個差異 (指定非常大的值,可讓埠驅動程式在從使用者模式傳遞事件至埠驅動程式時,立即將事件傳遞至迷你埠驅動程式。

  • 通知應用程式排程事件的距離。 在此情況下,不建議使用最大延遲。 由於一旦提交事件,就無法取消事件,因此事件可以提交到其呈現時間越接近,應用程式與合成器可以互動的回應愈快。 為了處理這項需求,DirectMusic 引進了延遲時鐘的概念。

    延遲時鐘會在未來提供最接近的時間,讓事件可以排程播放,且仍會依時間播放。 換句話說,如果應用程式會根據延遲時鐘排程在目前時間之前播放的事件,則事件會延遲播放。 合成器迷你埠驅動程式會藉由回應 KSPROPERTY_SYNTH_LATENCYCLOCK 屬性專案來提供延遲時鐘。

    迷你埠驅動程式會查詢 KSPROPSETID_Synth 和KSPROPERTY_SYNTH_LATENCYCLOCK。 迷你埠驅動程式的屬性處理常式應該會傳回延遲時鐘,以指定在主要時鐘方面,下一次可依時間轉譯資料的時間。 例如,如果主時鐘目前讀取 50,而且目前有 25 個單位的延遲,則延遲時鐘會讀取 75。 以這種方式實作時鐘的原因是延遲不需要是常數,而傳回的值比只使用差異還多。