Synthesizerlatenz
Ein weiterer Aspekt beim Synthesizer-Timing ist die Latenz, die den Unterschied zwischen der aktuellen Zeit und der ersten Wiedergabe einer Notiz darstellt. Eine MIDI-Nachricht kann nicht an den Synthesizer gesendet und zum aktuellen Beispielzeitpunkt im Ausgabepuffer gerendert werden. Daten, die bereits im Puffer platziert wurden, aber noch nicht an das Wellenausgabegerät gestreamt wurden, sollten freigestellt werden.
Die Wellensenke sollte daher eine Latenzuhr implementieren, bei der es sich um ein IReferenceClock-Objekt handelt (beschrieben in der Microsoft Windows SDK-Dokumentation). Die IReferenceClock::GetTime-Methode der Latenzuhr ruft die Beispielzeit ab, bis zu der Daten bereits in den Puffer geschrieben wurden, und konvertiert dies in die Referenzzeit relativ zur master Uhr. Die Wellensenke führt Konvertierungen zwischen Referenz- und Samplezeit mit IDirectMusicSynthSink::SampleToRefTime und IDirectMusicSynthSink::RefTimeToSample durch. In diesem Fall ruft der Synth daher IDirectMusicSynthSink::RefTimeToSample auf, um die Konvertierung zu erreichen.
Die Latenzzeit wird alle von der Wellensenke verwaltet. 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 Latenzuhr, um den frühesten Zeitpunkt zu bestimmen, zu dem eine MIDI-Nachricht für die Wiedergabe in die Warteschlange eingereiht werden kann, wenn sie an den Synthesizer übergeben wird, indem die IDirectMusicSynth::P layBuffer-Methode aufgerufen wird.
Ein Beispiel für die Latenz einer MIDI-Nachricht ist in der folgenden Abbildung dargestellt.
In der vorherigen Abbildung zeigt die Latenzuhr auf die erste Stelle in der PCM-Pufferschleife, an der eine Notiz wiedergegeben werden kann. Beachten Sie, dass die master Uhr bei 22 Zeiteinheiten liegt. Dies ist der Punkt, an dem der Sound derzeit 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 erste Ort, an dem ein neues MIDI-Ereignis mit Zeitstempel geplant werden kann, um die Zeit 30 zu spielen. Die Latenzuhr liest also 30 Zeiteinheiten.
Nachrichten können so geplant werden, dass sie zu dieser Latenzzeit oder zu einem beliebigen Zeitpunkt danach wiedergegeben werden. Daher werden Nachrichten, die sofort gerendert werden sollen, mit der Latenzzeit (nicht der aktuellen Zeit) gestempelt, bevor sie im Eingabepuffer des Synthesizers platziert werden.