Freigeben über


WavePci-Latenz

Der WavePci-Porttreiber behandelt die Pufferung eines Audiostreams anders als der WaveCyclic-Treiber.

Wenn Ihr WavePci-Miniporttreiber Hardwaremischungen ermöglicht, sendet DirectSound ein IRP an den WavePci-Porttreiber, das den gesamten DirectSound-Wave-Stream in einem einzigen zyklischen Puffer enthält. DirectSound weist den Puffer als zusammenhängenden Block des virtuellen Speichers zu. Um das Kopieren des DirectSound-Puffers zu vermeiden, ordnet die Kernelstreaming-Ebene den Puffer im virtuellen Kernelmodus zu und generiert eine MDL (Speicherbeschreibungsliste), die sowohl die virtuellen als auch physischen Adressen der Speicherseiten im zyklischen Puffer angibt. Der WavePci-Porttreiber partitioniert den zyklischen Puffer in eine Sequenz von Allokatoren-Frames (siehe KS-Allokatoren). Der Miniporttreiber gibt seine bevorzugte Allokator-Framegröße an, wenn die IMiniportWavePciStream::GetAllocatorFraming-Methode während der Streaminitialisierung vom Porttreiber aufgerufen wird. Allerdings kann SysAudio, der Systemdiagramm-Builder, die Einstellungen des Miniporttreibers überschreiben, um den Anforderungen der anderen Komponenten im Audiofilterdiagramm gerecht zu werden.

Der WavePci-Port-Treiber stellt dem Miniport-Treiber den zyklischen Puffer als Folge von Zuordnungen zur Verfügung. Eine Zuordnung ist entweder ein vollständiger Zuordnungsframe oder ein Teil eines Frames. Wenn sich ein bestimmter Zuordnungsframe vollständig auf einer Seite befindet, präsentiert der Porttreiber diesen Frame dem Miniporttreiber als einzelne Zuordnung. Wenn ein Zuordnungsframe eine oder mehrere Seitenbegrenzungen überschreitet, teilt der Porttreiber den Frame an jeder Seitengrenze und stellt ihn als zwei oder mehr Zuordnungen dar. Jeder Aufruf von IPortWavePciStream::GetMapping stellt die nächste aufeinanderfolgende Zuordnung in der Sequenz bereit.

Im Gegensatz zum WaveCyclic-Fall, bei dem der Miniporttreiber kaum Kontrolle darüber hat, wie viele Millisekunden an Daten auf der Hardware gepuffert werden, hat der WavePci-Miniporttreiber erhebliche Kontrolle über die Anzahl der Zuordnungen, die er jederzeit geöffnet hat. Die Anzahl der geöffneten Zuordnungen erhöht sich um eine mit jedem Aufruf von GetMapping und verringert sich um eine mit jedem Aufruf von ReleaseMapping. (Ein GetMapping-Aufruf kann natürlich fehlschlagen, sodass der Treiber weniger Kontrolle über die Anzahl der Zuordnungen hat.) Durch Steuern der Anzahl der offenen Zuordnungen und Verfolgen der kumulativen Größe der Zuordnungen kann der Miniporttreiber (innerhalb einer Toleranz, die von der Zuordnungsgröße abhängig ist) die Anzahl der Millisekunden der Pufferung ermitteln, die für die Hardware verfügbar sind. Ihr WavePci-Miniporttreiber sollte genügend Seitenzuordnungen anfordern, um die Wahrscheinlichkeit eines Mangels auf ein akzeptables Maß zu reduzieren.

Wenn die Richtlinie Ihres Miniporttreibers darin besteht, bis zu 50 Millisekunden an Daten zu puffern, z. B. zwischen den Lese- und Schreibzeigern, denken Sie daran, dass dieser Grenzwert die maximale Datenmenge darstellt, die der Treiber ansammelt, aber nicht den Beitrag des Treibers zur Latenz des Streams darstellt. Ihr Treiber sollte so konzipiert sein, dass die Latenz so klein wie möglich bleibt. Wenn ein Miniporttreiber seine anfänglichen Zuordnungen abruft, bevor er mit dem Wiedergeben eines neuen Streams beginnt, kann der Miniporttreiber weiterhin Zuordnungen anfordern, bis er entweder seinen Puffergrenzwert (in diesem Beispiel 50 Millisekunden) erreicht oder keine weiteren Zuordnungen mehr sofort verfügbar sind. Im letzteren Fall darf der Miniporttreiber jedoch nicht warten, bis weitere Zuordnungen verfügbar sind, bevor er mit der Wiedergabe des Streams beginnt. Stattdessen sollte der Treiber sofort mit der Wiedergabe der bereits erhaltenen Zuordnungen beginnen. Wenn später weitere Zuordnungen verfügbar sind, kann der Treiber weiterhin zusätzliche Zuordnungen abrufen, bis er entweder seinen Grenzwert für die Puffergröße erreicht oder keine weiteren Zuordnungen mehr sofort verfügbar sind.

Im Allgemeinen sollte die DMA-Hardware eines WavePci-Geräts so konzipiert sein, dass sie direkt auf Audio-Frames zugreift, die in beliebigen Byte-Anordnungen gespeichert sind und sich über Grenzen zwischen nicht zusammenhängenden Seiten des physischen Speichers erstrecken. Wenn Sie über ein Gerät verfügen, das erfordert, dass die Zuordnungen eine integrale Anzahl von Audioframes sind, ist dieses Gerät in den unterstützten Audioformaten begrenzt. Natürlich sollte ein Gerät mit dieser Einschränkung immer noch in der Lage sein, eine Audioframe-Größe zu verarbeiten, die einer Leistung von zwei entspricht.

Beispielsweise erfordert ein Gerät mit vier Kanälen und einer 16-Bit-Beispielgröße eine Audioframegröße von acht Bytes. Eine integrale Anzahl von Audioframes passt gut in eine Seite (oder eine andere Zuordnungsframegröße, die ein Vielfaches von acht Bytes ist). Im Fall eines 5.1-Kanalstreams mit 16-Bit-Beispielen beträgt die Audioframegröße jedoch 12 Byte und ein Stream, der die Größe einer einzelnen Seite überschreitet, enthält zwangsläufig Audioframes, die über Seitengrenzen hinausgehen. (Die Zahlen in Wellenfilter veranschaulichen dieses Problem.) Hardware, die keine beliebigen Byteausrichtungen und beliebige Bytelängenzuordnungen verarbeiten kann, muss vom Treiber abhängig sein, um eine Zwischenkopie durchzuführen, wodurch die Leistung beeinträchtigt wird.

Der Ac97-Beispieladaptertreiber im Microsoft Windows Driver Kit (WDK) implementiert eine GetAllocatorFraming-Methode. Der Miniporttreiber verwendet diese Methode, um seine bevorzugte Framezuordnungsgröße zu kommunizieren. In Windows 2000 und Windows Me ruft der Porttreiber diese Methode nur auf, wenn der Splitter-Systemtreiber (Splitter.sys) über dem Ausgabepin instanziiert wird. In Windows XP und höher ruft der Porttreiber diese Methode auch für Eingabestreams auf. Denken Sie daran, dass SysAudio bei der Entscheidung für eine Framezuordnungsgröße die Einstellungen des Miniporttreibers ignorieren kann.