Freigeben über


Synthesizerlatenz

Eine weitere Überlegung beim Synthesizer-Timing ist die Latenz, die den Unterschied zwischen der aktuellen Zeit und dem ersten Zeitpunkt darstellt, zu dem eine Note wiedergegeben werden kann. Eine MIDI-Nachricht kann nicht an den Synthesizer übermittelt und zur aktuellen Beispielzeit in den Ausgabepuffer gerendert werden. Es sollte für Daten berücksichtigt werden, die bereits im Puffer platziert wurden, aber noch nicht an das Audio-Ausgabegerät gestreamt wurden.

Die Wave Sink sollte daher einen Latenzzeitmesser implementieren, bei dem es sich um ein IReferenceClock-Objekt handelt (in der Microsoft Windows SDK-Dokumentation beschrieben). Die IReferenceClock::GetTime-Methode der Latenzuhr ruft die Sample-Zeit ab, bis zu der Daten bereits in den Puffer geschrieben wurden, und konvertiert diese in die Referenzzeit relativ zur Masteruhr. Die Wellenspüle führt Konvertierungen zwischen Bezug und Beispielzeit mit IDirectMusicSynthSink::SampleToRefTime und IDirectMusicSynthSink::RefTimeToSample durch, sodass in diesem Fall der Synth IDirectMusicSynthSink::RefTimeToSample aufruft, um die Konvertierung auszuführen.

Die Latenzzeit wird durch das Wellen-Sink gesteuert. Ihre Implementierung der IDirectMusicSynthSink::GetLatencyClock-Methode sollte einen Zeiger auf die Latenzuhr ausgeben, und dieser Zeiger muss wiederum von IDirectMusicSynth::GetLatencyClock abgerufen werden. Die Anwendung verwendet die Latenz-Uhr, um den frühesten Zeitpunkt zu ermitteln, zu dem eine MIDI-Nachricht in die Warteschlange gestellt werden kann, wenn sie an den Synthesizer übergeben wird, indem die IDirectMusicSynth::PlayBuffer-Methode aufgerufen wird.

Ein Beispiel für die Latenz einer MIDI-Nachricht ist in der folgenden Abbildung dargestellt.

Diagramm, das die Latenz einer MIDI-Nachricht in einer PCM-Pufferschleife veranschaulicht.

In der vorherigen Abbildung zeigt die Latenzuhr auf die erste Stelle in der PCM-Pufferschleife, an der eine Note abgespielt werden kann. Beachten Sie, dass die Masteruhr bei 22 Zeiteinheiten liegt. Dies ist der Punkt, an dem der Sound gerade wiedergegeben wird, aber der Raum zwischen 22 und 30 Zeiteinheiten wurde bereits mit Wellendaten gefüllt und kann nicht mehr geschrieben werden. Daher ist der früheste Zeitpunkt, an dem ein neues zeitgestempeltes MIDI-Ereignis abgespielt werden kann, bei Zeit 30. Somit zeigt die Latenzuhr 30 Zeiteinheiten.

Nachrichten können für die Wiedergabe zu oder zu einem beliebigen Zeitpunkt nach dieser Wartezeit geplant werden. Daher werden Nachrichten, die sofort gerendert werden sollen, mit der Latenzzeit (nicht der aktuellen Uhrzeit) gestempelt, bevor sie im Eingabepuffer des Synthesizers platziert werden.