WaveCyclic Latency
Wenn Ihr WaveCyclic-Miniporttreiber eine Hardwaremischung eines Audiowiedergabedatenstroms bereitstellt, übermittelt DirectSound einen IRP an den WaveCyclic-Porttreiber, der den gesamten DirectSound-Wellenstrom in einem einzelnen zyklischen Puffer enthält. Der WaveCyclic-Porttreiber empfängt den IRP und speist die Wellendaten Stück für Stück in den DMA-Puffer ein, den Ihr Treiber verfügbar macht. WaveCyclic versucht, den Schreibzeiger des DMA-Puffers etwa 40 Millisekunden vor dem Lesezeiger zu halten. Selbst wenn Ihr Treiber Hardwaremischungen mit DirectSound durchführt, kann er mit etwa 40 Millisekunden zusätzlicher Daten im DMA-Puffer rechnen.
Die Tatsache, dass der WaveCyclic-Porttreiber versucht, bis zu 40 Millisekunden Daten im zyklischen Puffer zu sammeln, bedeutet nicht, dass der WaveCyclic-Porttreiber der Latenz des Datenstroms 40 Millisekunden hinzufügt. Tatsächlich fügt der Porttreiber sehr wenig Latenz hinzu. Kurz bevor ein neuer Stream abgespielt wird, schreibt der Porttreiber die Anfangsdaten noch in den Anfang des zyklischen Puffers, der Porttreiber schreibt weiter, bis entweder keine Daten mehr verfügbar sind oder der Puffer ganze 40 Millisekunden an Daten enthält. Wenn jedoch weniger als diese Datenmenge sofort verfügbar ist, erzwingt der Porttreiber nicht das Warten des Miniporttreibers. Stattdessen kann der Miniporttreiber sofort mit der Wiedergabe der bereits gepufferten Daten beginnen. Wenn später mehr Daten verfügbar sind, schreibt der Porttreiber die Daten weiter in den Puffer, bis entweder keine weiteren Daten verfügbar sind oder die Zwischenlese- und Schreibzeiger gepufferte Datenmenge 40 Millisekunden erreicht.
Nach einer Zeit des fasten Hungers kann ein KMixer-Stream Intervalle der Stille enthalten. Wenn WaveCyclic nur genügend Wellendaten von KMixer empfangen hat, um dreißig statt vierzig Millisekunden zusätzlicher Daten im DMA-Puffer beizubehalten, beginnt WaveCyclic nach dem Ende der gültigen Daten von KMixer mit dem Schreiben von Stille in den DMA-Puffer. Diese Richtlinie stellt sicher, dass das Audiogerät, wenn ein Starvation auftritt und das Gerät über das Ende der gültigen Daten hinaus liest, Stille anstelle veralteter oder nicht initialisierter Daten rendert.
Die In den DMA-Puffer geschriebene Stille wird relativ klein gehalten, und wenn es KMixer gelingt, dem WaveCyclic-Porttreiber zusätzliche Daten zu liefern, bevor die Stille wiedergegeben wurde, überschreibt diese Daten die Stille im Puffer. Ohne Hunger empfängt das Audiogerät einen kontinuierlichen Datenstrom gemischter Daten ohne Intervalle erzwungener Stille. Beim Debuggen des Treibers wird möglicherweise die IMiniportWaveCyclicStream::Silence-Methode Ihres Miniporttreibers aufgerufen, obwohl Ihr Audiorenderer nicht hungert.