Richtlinie zum Kopieren und Zwischenspeichern von Daten
Ein WaveCyclic-Miniporttreiber kopiert Audiodaten zwischen dem DMA-Puffer, auf den die HARDWARE des HD-Audiocontrollers zugreift, und dem Clientpuffer, auf den die Benutzermodus-Audioanwendung zugreift:
Für einen Wiedergabedatenstrom kopiert der Treiber Daten aus dem Clientpuffer in den DMA-Puffer.
Für einen Erfassungsdatenstrom kopiert der Treiber Daten aus dem DMA-Puffer in den Clientpuffer.
Sowohl für Wiedergabe- als auch für Aufzeichnungsstreams kann der Treiber die beste Leistung erzielen, indem er die Zwischenspeicherung des DMA-Pufferspeichers (Cachetyp MmCached) aktiviert und sich auf den Bussnoopingmechanismus des PCI-Controllers verlässt, um die Cachekohärenz sicherzustellen. Einige PCI-Express-Controllerimplementierungen schnüffeln jedoch die isochronen Datenübertragungen des HD-Audiocontrollers nicht aus (z. B. der anfängliche PCI Express-Chipsatz von Intel).
Der Funktionstreiber kann nicht erkennen, ob die PCI-Controllerhardware das Snooping von DMA-Pufferübertragungen unterstützt oder isochrone Datenübertragungen durchführt. Um potenzielle Probleme mit der Cachekohärenz zu vermeiden, deaktiviert der Treiber die Zwischenspeicherung des DMA-Pufferspeichers, indem er den Zwischenspeichertyp für diesen Speicher als MmWriteCombined angibt. (MmNonCached würde auch funktionieren, aber möglicherweise nicht so gut funktionieren.) Wenn Sie einen benutzerdefinierten Adaptertreiber schreiben, der auf dem Beispielfunktionstreiber basiert, sollte sich ihr WaveCyclic-Miniporttreiber ähnlich verhalten, es sei denn, Sie können überprüfen, ob der PCI-Controller tatsächlich das Snooping von DMA-Pufferübertragungen unterstützt.
Um Geräte und Systeme zu unterstützen, die keine Bussnooping ausführen, muss ein benutzerdefinierter Funktionstreiber die folgenden Regeln befolgen:
Geben Sie für einen Wiedergabestream den Cachetyp des DMA-Puffers als MmWriteCombined an. Rufen Sie nach dem Kopieren eines Datenblocks aus dem Clientpuffer in den DMA-Puffer die KeMemoryBarrier-Funktion auf, um die Daten für die DMA-Engine sichtbar zu machen. KeMemoryBarrier löscht die kopierten Daten auf effiziente Weise in den Arbeitsspeicher, sodass die Datencaches des Prozessors weitgehend ungestört bleiben.
Geben Sie für einen Erfassungsstream den Cachetyp des DMA-Puffers als MmWriteCombined oder MmNonCached an. Darüber hinaus sollte der Funktionstreiber das Schreiben in den DMA-Puffer vermeiden. Wenn die direkte Verarbeitung von Audiobeispielen durchgeführt werden muss, sollten die Daten zuerst an eine andere Stelle kopiert werden.
Der Datenblock, den der Funktionstreiber in oder aus dem DMA-Puffer kopiert, ist nicht erforderlich, um auf einer Schreibkombinationspuffergrenze zu beginnen oder zu enden, und seine Größe muss kein Vielfaches der Schreibkombinierungspuffergröße sein (in der Regel 32 oder 64 Bytes).
Bei Codecfunktionstreibern, die die HDAUDIO_BUS_INTERFACE_BDL Version des DDI verwenden, führt die AllocationContiguousDmaBuffer-Routine sowohl die Zuordnung als auch die Zuordnung des DMA-Pufferspeichers durch. Die Routine legt den Cachetyp des Puffers immer auf MmWriteCombined fest.
Weitere Informationen zum Kombinieren von Schreibvorgängen finden Sie im IA-32 Intel Architecture Software Developer's Manual auf der Intel-Website .