共用方式為


時鐘同步處理

要執行的波接收關鍵工作是解決參考時鐘與取樣時鐘時鐘的時鐘之間時間漂移。 它會使用與階段鎖定迴圈相等的軟體執行這項作業。

波浪接收會追蹤緩衝區中可寫入的樣本編號。 因此,即使知道它已開啟,例如範例 20,波接收仍然需要檢查主要時鐘以取得參考時間。 它有一個執行緒,大約每隔 20 毫秒喚醒一次,並要求目前的主要時鐘。 例如,主要時鐘可能會回報目前的時間 (以毫秒為單位) ,例如 420。

波接收也會維護延遲時鐘,根據主要時鐘和樣本時間,顯示目前時間之間的位移。 它會使用這項資訊來計算預期的主要時鐘時間,並將它與實際的主時鐘讀數進行比較,以查看兩個時鐘是否已漂移。

波接收會使用階段鎖定迴圈來調整取樣時間。 檢查漂移時,因為讀數包含一些抖動,所以波接收不會依整個量進行調整。 相反地,它會將樣本時鐘依一些距離向主時鐘移動。 如此一來,波接收會平滑化抖動錯誤,同時保持大致同步。它也需要這個時間,並將它轉換成相對於主要時鐘的延遲時鐘時間。 這很重要,因為應用程式可能需要知道合成器在任何時間點的轉譯位置。

延遲時鐘會告知應用程式最早可以排程播放新附注的時間。 延遲時鐘時間是主要時鐘時間加上代表合成器延遲的位移。 此延遲代表應用程式提交要播放之新附注到合成器實際播放筆記的時間之間的最小延遲。 應用程式可以隨時排程在或晚于或晚于播放的附注,但目前延遲時鐘時間不會早于任何時間。

例如,如果主要時鐘目前為 420,且應用程式有一個請注意,它想要儘快播放,則延遲時鐘會告知它最早的時間可以播放筆記。 如果軟體合成器有 100 毫秒的延遲,下次可以播放筆記的時間是 520。

假設事件標示為在參考時間 520 時播放。 合成器會藉由將附注向下轉譯成樣本,並在取樣時間中執行其所有計算來執行其工作。 因此,它必須知道 520 的參考時間在取樣時間中轉換成什麼。 在使用者模式中,波接收提供兩個函式,讓合成使用:

IDirectMusicSynthSink::SampleToRefTime 和 IDirectMusicSynthSink::RefTimeToSample**

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

然後,波接收會傳回取樣時間 (,例如 600) 。 有問題的附注會在取樣時間 600 轉譯。 然後,當波接收呼叫 synth IDirectMusicSynth::Render 方法以轉譯資料流程的下一個部分 (時,例如,從樣本時間 600 到 800) ,就會在取樣時間 600 將附注轉譯到緩衝區 600。

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

總而言之,synth 會在樣本時間中執行其所有內部數學運算,而波接收會從參考時間轉換成樣本時間,反之亦然。 波接收也會管理與主要時鐘的同步處理,並提供延遲資訊。 在波浪接收器中隱藏這項功能可讓您更輕鬆地撰寫合成。