共用方式為


時鐘同步處理

波形接收器要做的一項關鍵任務是解決參考時鐘晶振和採樣時鐘晶振之間的時間漂移。 它使用相當於鎖相迴路的軟件來做到這一點。

波形接收會追蹤緩衝區中下一個可以寫入的樣本數目。 因此,即使它知道當前處於第 20 號樣本,波匯器仍然需要檢查主時鐘以獲取參考時間。 它有一個線程,大約每 20 毫秒喚醒一次,並向主時鐘詢問當前時間。 例如,主時鐘可能會回報目前時間 (以毫秒為單位) 為 420。

波接收器還維護一個延遲時鐘,它根據主時鐘顯示當前時間與採樣時間之間的偏移。 它使用此資訊來計算預期的主時鐘時間,並將其與實際主時鐘的讀數進行比較,以確定這兩個時鐘是否已經發生偏移。

波匯器使用鎖相環來調整採樣時間。 檢查漂移時,由於讀數包含一些抖動,波匯不會完全調整。 相反,它會將取樣時脈往主時脈的方向移動一部分距離。 通過這種方式,波匯器可以平滑抖動錯誤,同時保持大致同步。它還會利用這段時間,將其轉換為相對於主時鐘的延遲時鐘時間。 這很重要,因為應用程式可能需要知道合成器在任何時候轉譯的位置。

延遲時鐘會告訴應用程式可以排程播放新音符的最早時間。 延遲時鐘時間是主時鐘時間加上代表合成器延遲的偏移量。 此延遲代表從應用程式提交要播放的新音符到合成器實際播放音符的時間最小延遲。 在任何時候,應用程式都可以排程音符在或晚於目前延遲時鐘時間播放,但不早於目前的延遲時鐘時間。

例如,如果主時鐘目前位於時間 420,且應用程式有想要盡快播放的附註,則延遲時鐘會告訴它可以播放附註的最早時間。 如果軟體合成器的延遲為 100 毫秒,則下次可以播放音符的時間是時間 520。

假設一個事件被標記為按照參考時間的520進行播放。 合成器通過將音符渲染成樣本並在採樣時間內執行所有計算來完成其工作。 因此,它需要知道參考時間 520 在採樣時間中的對應值。 在使用者模式中,波匯點(wave sink)提供合成器使用的兩個功能:

IDirectMusicSynthSink::SampleToRefTime 和 IDirectMusicSynthSink::RefTimeToSample**

若要在此案例中執行轉換,合成器會在波浪接收器上呼叫 IDirectMusicSynthSink::RefTimeToSample

然後,波形接收器會傳回取樣時間 (例如,600)。 該註釋會在樣本時間 600 呈現。 然後,當波形接收端呼叫合成器 IDirectMusicSynth::Render 方法來渲染資料流程的下一部分(例如,從取樣時間 600 到 800)時,音符會在取樣時間 600 渲染至緩衝區。

注意 取樣時間會保留為 64 位元數字,以避免溢位。 (DWORD 值會在 27 小時內變換。

總而言之,合成器在採樣時間內完成其所有內部數學計算,而波接收器負責將參考時間和採樣時間之間進行互相轉換。 波接收器還管理與主時鐘的同步並提供延遲信息。 將此功能隱藏在波接收器中,可以更輕鬆地編寫合成器。