共用方式為


合成器延遲

合成器計時的另一個考慮是延遲,這是目前時間與第一次可播放筆記之間的差異。 MIDI 訊息無法提交至合成器,並在目前的取樣時間轉譯成輸出緩衝區。 應該針對已經放在緩衝區中的資料進行額度,但尚未串流至波浪輸出裝置。

因此,波接收應該實作延遲時鐘,這是Microsoft Windows SDK檔) 中所述的IReferenceClock物件 (。 延遲時鐘的 IReferenceClock::GetTime 方法會擷取資料已寫入緩衝區的範例時間,並將它轉換成相對於主時鐘的參考時間。 波接收器會使用 IDirectMusicSynthSink::SampleToRefTimeIDirectMusicSynthSink::RefTimeToSample在參考和取樣時間之間進行轉換,因此在此案例中,synth 會呼叫 IDirectMusicSynthSink::RefTimeToSample 來完成轉換。

延遲時間全都由波接收管理。 您實作 IDirectMusicSynthSink::GetLatencyClock 方法應該輸出延遲時鐘的指標,而且 IDirectMusicSynth::GetLatencyClock必須接著擷取此指標。 應用程式會使用延遲時鐘,藉由呼叫 IDirectMusicSynth::P layBuffer 方法,判斷 MIDI 訊息可以排入佇列以播放的最早時間點。

下圖顯示 MIDI 訊息的延遲範例。

說明 PCM 緩衝區迴圈中 MIDI 訊息延遲的圖表。

在上圖中,延遲時鐘會指向 PCM 緩衝區迴圈中可以播放筆記的第一個位置。 請注意,主時鐘位於 22 個時間單位,這是音效目前播放的來源點,但 22 到 30 個時間單位之間的空間已經填滿波資料,因此無法再寫入。 因此,可以排程播放新時間戳記 MIDI 事件的第一個位置是時間 30。 因此,延遲時鐘會讀取 30 個時間單位。

訊息可以排程在這段延遲時間之後或之後播放。 因此,在合成器的輸入緩衝區中放置之前,要立即轉譯的訊息會加上延遲時間, (不是目前時間) 。