Uhrsynchronisierung
Eine wichtige Aufgabe für die Wellensenke besteht darin, die Zeitabweichung zwischen den Referenzuhr- und Sample-Clock-Kristallen aufzulösen. Dies erfolgt mit dem Softwareäquivalent einer phase-locked-Schleife.
Die Wellensenke verfolgt, welche Stichprobennummer im Puffer als Nächstes geschrieben werden kann. Obwohl sie also weiß, dass sie eingeschaltet ist, z. B. Stichprobe 20, muss die Wellensenke noch die master Uhr überprüfen, um eine Referenzzeit zu erhalten. Es verfügt über einen Thread, der ungefähr alle 20 Millisekunden aktiviert wird und die master Uhr nach der aktuellen Zeit fragt. Die master Uhr meldet möglicherweise, dass die aktuelle Zeit (in Millisekunden) z. B. 420 beträgt.
Die Wellensenke behält auch eine Latenzuhr bei, die den Offset zwischen der aktuellen Zeit gemäß der master Uhr und der Stichprobenzeit anzeigt. Anhand dieser Informationen wird die erwartete master Uhrzeit berechnet und mit dem tatsächlichen master Uhrlesewert verglichen, um festzustellen, ob die beiden Uhren auseinanderdriften.
Die Wellensenke verwendet eine phasengebundene Schleife, um die Stichprobenzeit anzupassen. Bei der Überprüfung auf Abweichung passt sich die Wellensenke nicht um die gesamte Menge an, da die Messwerte einige Jitter enthalten. Stattdessen verschiebt sie die Stichprobenuhr um einen Bruchteil des Abstands zur master Uhr. Auf diese Weise glättet die Wellensenke Jitterfehler, während sie ungefähr synchron bleibt. Außerdem wird diese Zeit in eine Latenzuhrzeit konvertiert, die relativ zur master Uhr ist. Dies ist wichtig, da die Anwendung möglicherweise wissen muss, wo der Synthesizer zu einem beliebigen Zeitpunkt gerendert wird.
Die Latenzuhr teilt der Anwendung den frühesten Zeitpunkt mit, zu dem die Wiedergabe einer neuen Notiz geplant werden kann. Die Latenzzeit ist die master Uhrzeit plus einem Offset, der die Latenz des Synthesizers darstellt. Diese Latenz stellt die minimale Verzögerung zwischen dem Zeitpunkt dar, zu dem die Anwendung eine neue Notiz übermittelt, die wiedergegeben werden soll, bis zu dem Zeitpunkt, zu dem der Synthesizer die Notiz tatsächlich wiedergibt. Die Anwendung kann jederzeit planen, dass eine Notiz zu oder später als ab der aktuellen Latenzzeit wiedergegeben wird.
Wenn die master Uhr beispielsweise zur Zeit 420 ist und die Anwendung einen Hinweis hat, dass sie so schnell wie möglich wiedergeben möchte, teilt die Latenzuhr ihr mit, dass die Notiz frühestens wiedergegeben werden kann. Wenn der Softwaresynthesizer eine Latenz von 100 Millisekunden hat, ist das nächste Mal, dass er eine Notiz wiedergeben kann, bei 520.
Angenommen, ein Ereignis ist für die Wiedergabe zur Zeit 520 in der Referenzzeit markiert. Der Synthesizer erledigt seine Arbeit, indem er Notizen in Stichproben rendert und alle berechnungen in der Abtastzeit ausführt. Daher muss er wissen, was eine Referenzzeit von 520 in der Stichprobenzeit konvertiert. Im Benutzermodus bietet die Wellensenke zwei Funktionen, die der Synth verwendet:
IDirectMusicSynthSink::SampleToRefTime und IDirectMusicSynthSink::RefTimeToSample**
Um die Konvertierung in diesem Fall durchzuführen, ruft der Synth IDirectMusicSynthSink::RefTimeToSample auf der Wellensenke auf.
Die Wellensenke gibt dann eine Stichprobenzeit zurück (z. B. 600). Die betreffende Notiz wird zum Beispiel 600 gerendert. Wenn dann die synth IDirectMusicSynth::Render-Methode von der Wellensenke aufgerufen wird, um den nächsten Teil des Datenstroms zu rendern (z. B. von der Beispielzeit 600 bis 800), wird die Notiz zur Abtastzeit 600 in den Puffer gerendert.
Hinweis Die Beispielzeit wird als 64-Bit-Zahl beibehalten, um einen Rollover zu vermeiden. (Ein DWORD-Wert rollt innerhalb von 27 Stunden.)
Zusammenfassend lässt sich sagen, dass der Synthet alle seine internen Berechnungen in der Abtastzeit ausführt, und die Wellensenke führt die Konvertierung in die Stichprobenzeit von der Referenzzeit aus und umgekehrt. Die Wellensenke verwaltet auch die Synchronisierung mit der master Uhr und stellt Latenzinformationen bereit. Das Ausblenden dieser Funktionalität in der Wellensenke erleichtert das Schreiben des Synthesizers.