Latenzuhren

Das Synthesizer-Miniporttreibermodell ist so konzipiert, dass die Audioausgabe zwischen mehreren Geräten synchronisiert wird. Daher enthält es ein komplexeres Zeitsteuerungsmodell als das, das von einem reinen UART-Gerät bereitgestellt wird.

Ereignisse werden an den Miniporttreiber mit einem zugeordneten Zeitstempel übermittelt (und erfasst). Dieser Zeitstempel ist relativ zu einer master Uhr. Die master Uhr ist dieselbe Uhr, die von allen Sequenzierungen im gesamten System verwendet wird. Die Masteruhrzeit wird in Einheiten von 100-Nanosekunden-Ticks gemessen.

Der Miniporttreiber ruft die aktuelle Uhrzeit von der master Uhr ab, indem er IMasterClock::GetTime aufruft. Zum Zeitpunkt der Pinerstellung übergibt der Porttreiber die IMasterClock-Schnittstelle im Kernelmodus an den Miniporttreiber als einen der Eingabeparameter an die IMiniportDMus::NewStream-Methode . Derzeit umschließt die master Uhr die System-Echtzeituhr. Die master Uhr ändert sich nie, wenn Es Pins gibt, die erfordern, dass sie sich im Ausführungszustand befindet. Es ist eine Uhr mit konstanter Rate, die nie anhält.

Alle Renderinggeräte haben eine gewisse Latenz zwischen dem Zeitpunkt, zu dem sie ein Ereignis akzeptieren und dem Zeitpunkt, zu dem das Ereignis gehört werden kann. Diese Latenz kann konstant oder variabel sein (wie bei einem Softwaresynthesizer, bei dem die Latenz von der aktuellen Wiedergabeposition des Audiopuffers abhängt). Diese Latenz wird kompensiert durch:

  • Ermöglicht es dem DMus-Miniporttreiber, Ereignisse weit genug im Voraus zu empfangen, damit sie trotz der Latenz des Geräts pünktlich wiedergegeben werden können. Ereignisse werden für den Miniporttreiber von einer Sequencer-Engine im DMus-Porttreiber sequenziert.

    Zum Zeitpunkt der Pinerstellung fragt der Porttreiber den Miniporttreiber nach einer Deltazeit in Einheiten von 100 Nanosekunden ab. Diese Deltazeit ist, wie weit vor der Präsentationszeit jedes Ereignisses der Miniporttreiber das Ereignis empfangen möchte. Der Porttreiber unternimmt seine besten Anstrengungen, um Ereignisse so weit voraus zu liefern. Wenn Sie einen sehr großen Wert für dieses Delta angeben (angegeben durch den SchedulePreFetch-Parameter von IMiniportDMus::NewStream), übergibt der Porttreiber die Ereignisse an den Miniporttreiber, sobald sie aus dem Benutzermodus an den Porttreiber übermittelt werden.

  • Informieren von Anwendungen darüber, wie weit die Planung von Ereignissen voraus ist. Die Verwendung der maximalen Latenz ist in diesem Fall nicht wünschenswert. Da Ereignisse nicht abgesagt werden können, sobald sie übermittelt werden, können Die Anwendung und der Synth interagieren, je näher Ereignisse an ihre Präsentationszeit übermittelt werden können. Um diese Anforderung zu erfüllen, hat DirectMusic das Konzept einer Latenzuhr eingeführt.

    Die Latenzzeitzeit bietet den nächsten Zeitpunkt in der Zukunft, zu dem ein Ereignis für die Wiedergabe geplant und weiterhin pünktlich wiedergegeben werden kann. Mit anderen Worten: Wenn die Anwendung ein Ereignis plant, das vor der aktuellen Zeit gemäß der Latenzzeit abgespielt werden soll, wird das Ereignis zu spät wiedergegeben. Synthesizer-Miniporttreiber bieten eine Latenzzeit, indem sie auf das KSPROPERTY_SYNTH_LATENCYCLOCK-Eigenschaftselement reagieren.

    Der Miniporttreiber wird nach KSPROPSETID_Synth und KSPROPERTY_SYNTH_LATENCYCLOCK abgefragt. Der Eigenschaftenhandler des Miniporttreibers sollte eine Latenzuhr zurückgeben, die in Bezug auf die master Uhr angibt, wenn Daten das nächste Mal pünktlich gerendert werden können. Wenn beispielsweise die master Uhr derzeit 50 liest und es derzeit 25 Latenzeinheiten gibt, liest die Latenzuhr 75. Der Grund, warum die Uhr auf diese Weise implementiert wird, ist, dass die Latenz nicht konstant sein muss und der zurückgegebene Wert für Anwendungen von größerem Nutzen ist als nur das Delta.