共用方式為


Time-Stamped 事件

合成器計時的概觀是,而不是在需要播放時只傳送附注,每個附注都會時間戳記並放在緩衝區中。 然後,此緩衝區會在時間戳記所指定的時間的兩毫秒內進行處理並播放。 (雖然計時解析度在數百奈秒內,但我們將會以毫秒為單位討論,這更方便此討論的時間單位。)

因為系統透過延遲時鐘知道延遲,所以時間戳記事件可以在緩衝區中等候其適當時間播放,而不只是將事件放入佇列中,而希望延遲很低。

主要時鐘會實作 COM IReferenceClock介面, (Microsoft Windows SDK檔) 中所述。 系統上的所有裝置都會使用此參考時間。

Microsoft 的波浪接收實作會建置每 20 毫秒喚醒一次的執行緒。 執行緒的工作是建立另一個緩衝區,並將它交給 DirectSound。 若要建立該緩衝區,它會呼叫合成器,並要求它轉譯指定的音樂資料量。 其要求的數量取決於執行緒喚醒的實際時間,這不太可能是 20 毫秒。

實際傳遞至合成器的內容只是記憶體中開始將資料寫入 PCM 緩衝區的位置指標,以及指定要寫入的資料長度參數。 接著,synth 可以將 PCM 資料寫入此緩衝區,並填入最多指定的數量。 也就是說,它會從開始位址轉譯,直到到達指定的長度為止。 該記憶體區塊可以是 DirectSoundBuffer (,這是預設案例) ,但它也可能是 DirectShow 圖形或波接收所定義的一些其他目標。

PCM 緩衝區在概念上是迴圈 (,也就是說,它會持續迴圈) 。 合成器會將描述音效的 16 位數位轉譯為緩衝區的後續配量。 每次執行緒喚醒時,配量大小會稍有不同,因為接收無法完全每隔 20 毫秒喚醒一次。 因此,每次執行緒喚醒時,都會播放播放,以判斷在返回睡眠之前,應該先進行緩衝區的進度。

從應用程式的觀點來看,synth 埠驅動程式本身具有 IDirectMusicSynth::GetLatencyClock 函式,可從波接收取得時鐘。 因此有兩個時鐘:

  • 每個人都會接聽的時鐘,包括波接收。

  • 由波接收實作的延遲時鐘,應用程式會看到此時鐘為 DirectMusic 埠,以提供延遲時鐘。

換句話說,應用程式會要求延遲時鐘,但會將時鐘視為來自 DirectMusic 埠抽象概念,而不是來自波接收。

這個延遲時鐘所傳回的時間是緩衝區可以轉譯到的最早時間,因為合成器已經轉譯到緩衝區中的該點。 如果合成器在其上次寫入時轉譯較小的緩衝區,則延遲也會較小。

因此,波接收會在 synth 上呼叫 IDirectMusicSynth::Render ,呈現緩衝區並要求填入轉譯的資料。 如下圖所示,synth 會採用 IDirectMusicSynth::P layBuffer 函式呼叫所產生的所有時間戳記事件。

圖表說明合成器中時間戳記訊息的佇列程式。

每個輸入緩衝區都包含時間戳記訊息。 每個訊息都會放在佇列中,以在時間戳記所指定的時間轉譯成緩衝區。

此模型的重要事項之一是時間戳記以外的任何特定順序。 這些事件會串流處理在 中,以便在轉譯之前隨時新增到佇列中。 所有專案都是以事件為基礎,與時間有關。 例如,如果參考時間目前為 400 個時間單位,則現在發生 400 時所要發生的所有時間戳記。 事件時間戳記從現在開始會發生 10 個單位,會在 410 次發生。