Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein WaveCyclic Miniport-Treiber kopiert Audiodaten zwischen dem DMA-Puffer, auf den die HARDWARE des HD-Audiocontrollers zugreift, und den Clientpuffer, auf den die Audioanwendung für den Benutzermodus zugreift:
Bei einem Wiedergabedatenstrom kopiert der Treiber Daten aus dem Clientpuffer in den DMA-Puffer.
Bei einem Erfassungsdatenstrom kopiert der Treiber Daten aus dem DMA-Puffer in den Clientpuffer.
Für Wiedergabe- und Aufnahmedatenströme kann der Treiber die beste Leistung erzielen, indem es das Zwischenspeichern des DMA-Pufferspeichers (Cachetyp MmCached) und das Vertrauen auf den Bussnooping-Mechanismus des PCI-Controllers ermöglicht, um die Cachekohärenz sicherzustellen. Einige Implementierungen von PCI Express-Controllern überwachen jedoch nicht die isochronen Datenübertragungen des HD-Audiokontrollers, wie etwa Intels anfänglicher PCI Express-Chipsatz.
Der Funktionstreiber kann nicht erkennen, ob die PCI-Controllerhardware die Abschnüffung von DMA-Pufferübertragungen unterstützt oder isochrone Datenübertragungen durchführt. Um potenzielle Probleme mit der Cachekoherenz zu vermeiden, deaktiviert der Treiber das Zwischenspeichern des DMA-Pufferspeichers, indem der Cachetyp für diesen Speicher als MmWriteCombined angegeben wird. (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 der WaveCyclic-Miniporttreiber ähnlich verhalten, es sei denn, Sie können überprüfen, ob der PCI-Controller tatsächlich die Abschnüffung von DMA-Pufferübertragungen unterstützt.
Um Geräte und Systeme zu unterstützen, die kein Bus-Snooping ausführen, sollte ein kundenspezifischer Funktionstreiber die folgenden Regeln befolgen:
Geben Sie für einen Wiedergabedatenstrom 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 das DMA-Modul sichtbar zu machen. KeMemoryBarrier überträgt die kopierten Daten effizient in den Arbeitsspeicher, wobei die Datencaches des Prozessors weitgehend unberührt bleiben.
Geben Sie für einen Aufnahmedatenstrom den Cachetyp des DMA-Puffers entweder als MmWriteCombined oder MmNonCached an. Darüber hinaus sollte der Funktionstreiber das Schreiben in den DMA-Puffer vermeiden. Wenn sie die direkte Verarbeitung von Audiobeispielen durchführen muss, sollte sie zuerst die Daten an anderer Stelle kopieren.
Der Datenblock, den der Funktionstreiber in den DMA-Puffer kopiert oder daraus abruft, muss nicht an einer Grenze des schreibkombinierenden Puffers beginnen oder enden, und seine Größe muss kein Vielfaches der schreibkombinierenden Puffergröße (in der Regel 32 oder 64 Byte) sein.
Bei Codec-Funktionstreibern, die die HDAUDIO_BUS_INTERFACE_BDL Version des DDI verwenden, führt die AllocateContiguousDmaBuffer-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 zu Write-Combining finden Sie im Handbuch zur IA-32 Intel Architektur für Softwareentwickler auf der Intel-Website.