Vorabrufoffsets

Ein WavePci-Miniporttreiber ruft die IPreFetchOffset::SetPreFetchOffset-Methode auf, um den Vorabrufoffset eines hardwarebeschleunigten DirectSound-Ausgabestreams anzugeben. Dieser Offset ist die Anzahl der Datenbytes, die den Schreibcursor vom Wiedergabecursor im Hardwarepuffer des Audiogeräts trennen. Der Schreibcursor gibt die Pufferposition an, in die eine DirectSound-Anwendung sicher das nächste Soundbeispiel schreiben kann. Der Wiedergabecursor gibt die Pufferposition des Soundbeispiels an, das derzeit vom Audiogerät wiedergegeben wird.

DirectSound fragt den WavePci-Porttreiber nach den aktuellen Positionen der Wiedergabe- und Schreibcursor ab, indem eine KSPROPERTY_AUDIO_POSITION-Eigenschaftsanforderung gesendet wird. Als Reaktion auf diese Anforderung ruft der Porttreiber die aktuelle Wiedergabeposition vom Miniporttreiber ab, indem er IMiniportWavePciStream::GetPosition aufruft. Wie der Porttreiber die Schreibposition bestimmt, hängt davon ab, ob SetPreFetchOffset aufgerufen wurde.

Standardmäßig positioniert der Porttreiber den Schreibcursor in der letzten Zuordnung, die vom Miniporttreiber angefordert wurde. Mit jedem Aufruf von IPortWavePciStream::GetMapping wird der Standardoffset für den Vorabruf größer. Wenn der WavePci-Miniporttreiber eine große Anzahl von Zuordnungen abruft, kann der Standardoffset sehr groß werden.

Der Aufruf von SetPreFetchOffset überschreibt die Standardeinstellung. Nach diesem Aufruf berechnet der Porttreiber die Schreibposition, indem er den angegebenen Prefetchoffset zur Wiedergabeposition hinzufügt (unter Berücksichtigung des Wraparounds am Ende des DirectSound-Puffers).

Ein Miniporttreiber kann aus verschiedenen Gründen eine große Anzahl von Zuordnungen zuordnen. Eine besteht darin, den Mehraufwand für Audiovorgänge auf dem Systemprozessor zu reduzieren. Mit mehr Zuordnungen benötigt der Treiber weniger Unterbrechungen, um das Audiogerät kontinuierlich mit Daten zu versorgen. Ein weiterer Grund ist, dass die Zuweisung von mehr Zuordnungen die Wahrscheinlichkeit verringert, dass die Audiowiedergabe Störungen erleidet, wenn schlecht verhaltene Gerätetreiber das System für kurze Zeit binden.

Ein Problem bei einem großen Vorabrufoffset besteht darin, dass einige DirectSound-Anwendungen über die relativen Positionen der Wiedergabe- und Schreibcursor verwechseln können. In Windows 95/98 behalten Audio-VxDs einen relativ kleinen Vorabrufoffset bei, und DirectSound-Anwendungen, die für diese Betriebssysteme geschrieben wurden, werden möglicherweise nicht ordnungsgemäß ausgeführt, wenn der Offset größer als erwartet ist.

Beispielsweise kann eine Anwendung den DirectSound-Puffer in eine obere und eine untere Hälfte unterteilen und dann die beiden Hälften zwischen der Anwendung und dem Gerät "Ping Pong". Wenn der Schreibcursor zum ersten Mal in die obere oder untere Hälfte des Puffers eintritt, schreibt er den Datenwert eines halben Puffers in diese Pufferhälfte. Bei diesem Schema wird davon ausgegangen, dass der Wiedergabecursor immer in der anderen Hälfte des Puffers positioniert ist – der Hälfte, in die nicht geschrieben wird. Beachten Sie, dass diese Annahme falsch ist, wenn der Vorabrufoffset die Hälfte der Puffergröße überschreitet. Wenn der Schreibcursor das Ende des DirectSound-Puffers erreicht und bis zum Anfang des Puffers umschließt, befindet er sich in derselben Pufferhälfte wie der Wiedergabecursor. Wenn die Anwendung die Daten eines halben Puffers in die neue Position des Schreibcursors schreibt, überschreibt sie die Position des Wiedergabecursors und zerstört Daten, die noch nicht wiedergegeben wurden.

Obwohl die Anwendung selbst sicherlich für diese Art von Fehler verantwortlich gemacht werden kann, kann ein WavePci-Miniporttreiber den Fehlermodus beseitigen, indem einfach SetPreFetchOffset aufgerufen wird, um den Prefetchoffset auf einen kleineren Wert festzulegen.

Durch Festlegen des Prefetchoffsets auf einen kleineren Wert wird der resultierende Schreibcursor näher an den Wiedergabecursor verschoben. Sie sollten den Vorabrufoffset auf die FIFO-Größe Ihrer Hardware festlegen. Ein typischer Vorabrufoffset ist etwa 64 Beispiele, abhängig vom Hardwaredesign der DMA-Engine.

Um mit bestimmten älteren DirectSound-Anwendungen kompatibel zu bleiben, polstert DirectSound derzeit die Schreibcursor von hardwarebeschleunigten Pins um 10 Millisekunden. Beachten Sie, dass sich die Auffüllung in Zukunft ändern kann.

Weitere Informationen zum Verwalten von Schreibcursorn und Wiedergabecursorn auf Treiberebene finden Sie unter Audiopositionseigenschaft.