共用方式為


延遲時鐘

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

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

迷你埠驅動程式會呼叫 IMasterClock::GetTime ,從主要時鐘取得目前的時間。 在建立 pin 時,端口驅動程式會將核心模式下的 IMasterClock 介面傳遞給迷你端口驅動程式,作為 IMiniportDMus::NewStream 方法的其中一個輸入參數。 目前,主時鐘覆蓋系統實時時鐘。 當有引腳需要主時鐘處於 運行 狀態時,主時鐘永遠不會改變。 這是永不暫停的固定速率時鐘。

所有轉譯裝置在接受事件的時間與可以聽到事件的時間之間都有一定程度的延遲。 此延遲可以是常數或可變的 (例如軟體合成器,其中延遲取決於音訊緩衝區的目前播放位置)。 此延遲可透過下列方式補償:

  • 允許 DMus 迷你埠驅動程式提前足夠多地接收事件,以便即使裝置有延遲,仍可以按時播放事件。 DMus 埠驅動程式中的排序器引擎會針對迷你埠驅動程式排序事件。

    在針腳建立時,埠驅動程式會查詢迷你埠驅動程式,以 100 奈秒為單位的差異時間。 此差異時間是指迷你埠驅動程式希望在每個事件的簡報時間之前接收到事件的時間差。 端口驅動程式盡最大努力提前傳遞事件。 為此 delta 指定極大值(由 IMiniportDMus::NewStreamSchedulePreFetch 參數指定),當事件從使用者模式傳遞至埠驅動程式時,埠驅動程式會立即將事件傳遞至迷你埠驅動程式。

  • 告知應用程式事件應提前多久進行排程。 在此情況下,不希望使用最大延遲。 因為事件一旦提交就無法取消,所以提交事件越接近其簡報時間,應用程式和合成器互動的回應速度就越快。 為了處理這項需求,DirectMusic 引進了延遲時鐘的概念。

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

    會查詢迷你埠驅動程式的 KSPROPSETID_Synth 和 KSPROPERTY_SYNTH_LATENCYCLOCK。 迷你埠驅動程式的屬性處理常式應該傳回延遲時鐘,以主要時鐘為例,指定下次可以按時轉譯數據的時間。 例如,如果主時鐘目前讀取 50,且目前有 25 個延遲單位,則延遲時鐘讀取 75。 以這種方式來實現時鐘,是因為延遲不需要恆定,並且傳回的值對應用程式來說,比僅僅是差值更有用處。