Wellenfilter
Wellenfilter stellen Geräte dar, die wellenformatierte digitale Audiodaten rendern und/oder erfassen. Anwendungen greifen in der Regel über die DirectSound-API oder über die Microsoft Windows Multimedia-Funktionen waveOutXxx und waveInXxx auf die Funktionen dieser Geräte zu. Informationen zu den Wellenformaten, die WDM-Audiotreiber unterstützen können, finden Sie unter WAVEFORMATEX und WAVEFORMATEXTENSIBLE.
Ein Wellenrenderingfilter empfängt als Eingabe einen digitalen Wave-Audiostream und gibt entweder ein analoges Audiosignal (an einen Satz von Lautsprechern oder einen externen Mixer) oder einen digitalen Audiostream (z. B. an einen S/PDIF-Anschluss) aus.
Ein Wave-Capture-Filter empfängt als Eingang entweder ein analoges Audiosignal (von einem Mikrofon oder einer Eingangsbuchse) oder einen digitalen Stream (z. B. von einem S/PDIF-Anschluss). Derselbe Filter gibt einen Wellenstrom aus, der digitale Audiodaten enthält.
Ein einzelner Wellenfilter kann gleichzeitig Rendering und Aufzeichnung durchführen. Dieser Filtertyp kann z. B. ein Audiogerät darstellen, das Audio über einen Satz von Lautsprechern wiedergeben und gleichzeitig Audio über ein Mikrofon aufzeichnen kann. Alternativ kann die Wave-Rendering- und Wave-Capture-Hardware wie unter Dynamische Audiountergeräte beschrieben als separate Wellenfilter dargestellt werden.
Ein Audioadaptertreiber bildet einen Wellenfilter, indem er einen Wave-Miniporttreiber, den der Hardwarehersteller als Teil des Adaptertreibers implementiert, mit einem Wellenporttreiber bindet, den das System implementiert. Der Miniporttreiber verarbeitet alle hardwarespezifischen Vorgänge für den Wellenfilter, und der Porttreiber verwaltet alle generischen Wellenfilterfunktionen.
Der PortCls-Systemtreiber (Portcls.sys) implementiert drei Wellenporttreiber: WaveRT, WavePci und WaveCyclic.
Die drei Arten von Wellenfiltern funktionieren wie folgt:
Ein WaveRT-Filter ordnet einen Puffer für Wellendaten zu und macht diesen Puffer für den Client im Benutzermodus direkt zugänglich. Der Puffer kann abhängig von den Hardwarefunktionen des Wellengeräts aus zusammenhängenden oder nicht zusammenhängenden Speicherblöcken bestehen. Der Client greift als zusammenhängender Block des virtuellen Speichers auf den Puffer zu. Der Puffer ist cyclisch, d. h. wenn der Lese- oder Schreibzeiger des Geräts (zum Rendern) das Ende des Puffers erreicht, wird er automatisch bis zum Anfang des Puffers umbrochen.
Ein WavePci-Filter greift direkt auf den Puffer des Clients zu. Obwohl der Client als einzelner zusammenhängender Block des virtuellen Speichers auf den Puffer zugreift, muss der WavePci-Filter als eine Reihe von möglicherweise nicht zusammenhängenden Speicherblöcken auf den Puffer zugreifen. Blöcke, die aufeinander folgende Teile des Rendering- oder Aufzeichnungsdatenstroms enthalten, werden auf dem Gerät in die Warteschlange eingereiht. Wenn der Lese- oder Schreibzeiger des Geräts das Ende eines Blocks erreicht, wird er an den Anfang des nächsten Blocks in der Warteschlange verschoben.
Ein WaveCyclic-Filter ordnet einen Puffer zu, der aus einem einzelnen zusammenhängenden Speicherblock besteht, der als Ausgabe- (zum Rendern) oder Eingabepuffer (für die Erfassung) verwendet wird. Dieser Puffer ist zyklischer. Da der Puffer für den Client nicht direkt zugänglich ist, muss der Treiber Daten zwischen dem zyklischen Puffer des Treibers und dem Benutzermoduspuffer des Clients kopieren.
WaveRT wird gegenüber WavePci und WaveCyclic bevorzugt. WavePci und WaveCyclic wurden mit früheren Versionen von Windows verwendet.
Ein WaveRT-Filter kann ein Audiogerät darstellen, das sich in einem Systembus befindet, z. B. PCI oder PCI Express. Der Hauptvorteil eines WaveRT-Filters gegenüber einem WaveCyclic- oder WavePci-Filter besteht darin, dass ein WaveRT-Filter es einem Client im Benutzermodus ermöglicht, Audiodaten direkt mit der Audiohardware auszutauschen. Im Gegensatz dazu erfordern WaveCyclic- und WavePci-Filter einen regelmäßigen Softwareeingriff des Treibers, was die Latenz des Audiodatenstroms erhöht. Darüber hinaus können Audiogeräte mit und ohne Scatter/Gather-DMA-Funktionen als WaveRT-Filter dargestellt werden. Weitere Informationen finden Sie im Whitepaper A Wave Port Driver for Real-Time Audio Streaming( A Wave Port Driver for Real-Time Audio Streaming ).
WaveRT-Filter
Ein WaveRT-Filter wird als Port/Miniport-Treiberpaar implementiert. In Windows Vista und höher erstellt eine WaveRT-Filterfactory einen WaveRT-Filter wie folgt:
Es instanziiert ein WaveRT-Miniporttreiberobjekt.
Es instanziiert ein WaveRT-Porttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortWaveRT aufgerufen wird.
Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Vorgang. Die Port- und Miniporttreiber kommunizieren miteinander über ihre IPortWaveRT - und IMiniportWaveRT-Schnittstellen .
Weitere Informationen finden Sie im Whitepaper A Wave Port Driver for Real-Time Audio Streaming( A Wave Port Driver for Real-Time Audio Streaming ).
Informationen zu früheren Versionen von Windows
WaveCyclic-Informationen für frühere Versionen von Windows
Ein WaveCyclic-Filter kann ein Audiogerät darstellen, das eine Verbindung mit einem Systembus herstellt, z. B. ISA, PCI, PCI Express oder PCMCIA. Wie der Name "WavePci" schon sagt, stellt ein WavePci-Filter in der Regel ein Gerät dar, das eine Verbindung mit einem PCI-Bus herstellt, obwohl im Prinzip ein WavePci-Gerät stattdessen beispielsweise eine Verbindung mit einem ISA-Bus herstellen kann. Im Gegensatz zu den einfacheren Geräten, die von WaveCyclic unterstützt werden, muss ein von WavePci unterstütztes Gerät über Scatter/Gather-DMA-Funktionen verfügen. Ein Audiogerät, das sich im PCI-Bus befindet, aber keine Scatter-/Gather-DMA enthält, kann als WaveCyclic-Filter, aber nicht als WavePci-Filter dargestellt werden.
WavePci-Informationen für frühere Versionen von Windows
Ein WavePci-Gerät ist in der Lage, DMA-Datenübertragungen zu oder aus Puffern durchzuführen, die sich an beliebigen Speicheradressen befinden können und die mit beliebigen Byteausrichtungen beginnen und enden. Im Gegensatz dazu erfordert die DMA-Hardware für ein WaveCyclic-Gerät nur die Möglichkeit, Daten in einen oder aus einem einzelnen Puffer zu verschieben, den der Miniporttreiber des Geräts zuordnet. Ein WaveCyclic-Miniporttreiber kann einen zyklischen Puffer zuordnen, der die eingeschränkten Funktionen des DMA-Kanals erfüllt. Beispielsweise kann der DMA-Kanal für ein typisches WaveCyclic-Gerät einen Puffer erfordern, der die folgenden Einschränkungen erfüllt:
Der Puffer befindet sich in einem bestimmten Bereich des physischen Adressraums.
Der Puffer ist sowohl im physischen als auch im virtuellen Adressraum zusammenhängend.
Der Puffer beginnt und endet auf sogar vier- oder acht-Byte-Grenzen.
Im Gegenzug für diese Einfachheit muss ein WaveCyclic-Gerät jedoch auf softwarebasiertes Kopieren von Daten in oder aus dem zyklischen Puffer angewiesen sein, während ein WavePci-Gerät auf die Scatter-/Gather-Funktionen seiner DMA-Hardware angewiesen ist, um ein solches Kopieren zu vermeiden. Die IRPs, die Wellenaudiodaten an ein Renderinggerät übermitteln oder Daten von einem Aufnahmegerät abrufen, werden von Datenpuffern begleitet, und jeder dieser Puffer enthält einen Teil des Audiodatenstroms, der gerendert oder erfasst wird. Ein WavePci-Gerät kann direkt über seine Scatter/Gather-DMA-Engine auf diese Puffer zugreifen, während ein WaveCyclic-Gerät erfordert, dass die Daten aus dem IRP in seinen zyklischen Puffer kopiert werden oder umgekehrt.
WavePci-Filter
Hinweis: WavePci-Informationen für frühere Versionen von Windows
Ein WavePci-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine WavePci-Filterfactory erstellt einen WavePci-Filter wie folgt:
Es instanziiert ein WavePci-Miniporttreiberobjekt.
Es instanziiert ein WavePci-Porttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortWavePci aufgerufen wird.
Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Vorgang. Die Port- und Miniporttreiber kommunizieren über ihre IPortWavePci - und IMiniportWavePci-Schnittstellen miteinander.
Weitere Informationen finden Sie unter Implementierungsprobleme für WavePci-Geräte.
WaveCyclic-Filter
Hinweis
Microsoft unterstützt eine vielfältige und inklusive Umgebung. Dieser Artikel enthält Verweise auf Terminologie, die im Microsoft-Stilleitfaden für voreingenommene Kommunikation als ausschlussfrei erkannt wird. Das Wort oder der Ausdruck wird in diesem Artikel aus Gründen der Konsistenz verwendet, da es derzeit in der Software angezeigt wird. Wenn die Software aktualisiert wird, um die Sprache zu entfernen, wird dieser Artikel aktualisiert, um in Übereinstimmung zu sein.
Hinweis: WaveCyclic-Informationen für frühere Versionen von Windows
Ein WaveCyclic-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine WaveCyclic-Filterfactory erstellt einen WaveCyclic-Filter wie folgt:
Es instanziiert ein WaveCyclic-Miniporttreiberobjekt.
Es instanziiert ein WaveCyclic-Porttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortWaveCyclic aufgerufen wird.
Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Vorgang. Die Port- und Miniporttreiber kommunizieren miteinander über ihre IPortWaveCyclic - und IMiniportWaveCyclic-Schnittstellen .
Der zyklische Puffer des WaveCyclic-Filters besteht immer aus einem zusammenhängenden Block des virtuellen Speichers. Die Implementierung der IDmaChannel::AllocateBuffer-Methode durch den Porttreiber weist immer einen Puffer zu, der sowohl im physischen als auch im virtuellen Speicheradressraum zusammenhängend ist. Wenn, wie bereits erwähnt, die DMA-Engine des WaveCyclic-Geräts zusätzliche Einschränkungen für den Pufferspeicher erzwingt, kann der Miniporttreiber seine eigene Pufferzuordnungsmethode implementieren, um diese Einschränkungen zu erfüllen.
Ein WaveCyclic-Miniporttreiber, der nach einem großen Puffer fragt (z. B. acht physisch zusammenhängende Speicherseiten), sollte vorbereitet sein, um sich mit einer kleineren Puffergröße zu begnügen, wenn das Betriebssystem die ursprüngliche Anforderung ablehnt. Ein Audiogerät kann gelegentlich entladen und erneut geladen werden, um Systemressourcen neu auszugleichen (siehe Beenden eines Geräts zum Ausgleich von Ressourcen).
Ein WaveCyclic-Gerät mit integrierter DMA-Hardware für die Busmasterung wird als master-Gerät bezeichnet. Alternativ kann ein WaveCyclic-Gerät ein untergeordnetes Gerät ohne integrierte DMA-Hardwarefunktionen sein. Ein untergeordnetes Gerät muss sich auf den DMA-Controller des Systems verlassen, um alle benötigten Datenübertragungen durchzuführen. Weitere Informationen zu master und untergeordneten Geräten finden Sie unter IDmaChannel und IDmaChannelSlave.
Ein WaveCyclic-Miniporttreiber kann sein eigenes DMA-Kanalobjekt implementieren, anstatt das Standard-DMA-Kanalobjekt zu verwenden, das von einer der neuenXxxDmaChannel-Methoden des Porttreibers erstellt wird:
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
Die benutzerdefinierte IDmaChannel-Implementierung des Adaptertreibers kann eine benutzerdefinierte Verarbeitung von Daten durchführen, um spezielle Hardwareeinschränkungen zu erfüllen. Beispielsweise verwenden die Windows Multimedia-Funktionen Wellenformate, bei denen 16-Bit-Beispiele immer signierte Werte sind, aber die Audiorenderinghardware kann stattdessen so konzipiert sein, dass sie nicht signierte 16-Bit-Werte verwendet. In diesem Fall kann die benutzerdefinierte IDmaChannel::CopyTo-Methode des Treibers geschrieben werden, um die signierten Quellwerte in die nicht signierten Zielwerte zu konvertieren, die von der Hardware benötigt werden. Obwohl diese Technik nützlich sein kann, um Fehler beim Hardwareentwurf zu umgehen, kann es auch zu erheblichen Kosten im Softwareaufwand führen.
Ein Beispiel für einen Treiber, der ein eigenes DMA-Kanalobjekt implementiert, finden Sie im Sb16-Beispielaudioadapter in früheren Versionen des WDK. Wenn die konstante OVERRIDE_DMA_CHANNEL als TRUE definiert ist, ermöglichen die Anweisungen für die bedingte Kompilierung im Quellcode die Implementierung eines proprietären IDmaChannel-Objekts , das der Treiber anstelle des IDmaChannel-Standardobjekts aus dem IPortWaveCyclic::NewXxxDmaChannel-Aufruf verwendet.