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.
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 waveOutXxx und waveInXxx-Funktionen 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 Wave-Rendering-Filter 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 Eingabe entweder ein analoges Audiosignal (von einem Mikrofon oder einer Eingangsbuchse) oder einen digitalen Datenstrom (z. B. von einem S/PDIF-Verbinder). Derselbe Filter gibt einen Wellenstrom aus, der digital-audio-Daten enthält.
Ein einzelner Wellenfilter kann sowohl rendern als auch gleichzeitig erfassen. Dieser Filtertyp kann z. B. ein Audiogerät darstellen, das Audio über eine Reihe von Lautsprechern wiedergeben und Audio gleichzeitig über ein Mikrofon aufzeichnen kann. Alternativ können die Wellenrendering- und Wave-Capture-Hardware wie in dynamic Audio Subdevices beschrieben als separate Wellenfilter dargestellt werden.
Ein Audioadaptertreiber bildet einen Wellenfilter, indem er einen Wave Miniport-Treiber bindet, den der Hardwareanbieter als Teil des Adaptertreibers implementiert, mit einem Wave-Port-Treiber, 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 Wellenanschlusstreiber: WaveRT, WavePci und WaveCyclic.
Die drei Arten von Wellenfiltern funktionieren wie folgt:
Ein WaveRT-Filter weist einen Puffer für Wellendaten zu und macht diesen Puffer direkt für den Benutzermodusclient 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 auf den Puffer als zusammenhängenden Block des virtuellen Speichers zu. Der Puffer ist zyklisch, d. h., wenn der Lesezeiger des Geräts (zum Rendern) oder der Schreibzeiger (für die Aufnahme) das Ende des Puffers erreicht, springt er automatisch an den Anfang zurück.
Ein WavePci-Filter greift direkt auf den Puffer des Clients zu. Obwohl der Client auf den Puffer als einen einzigen zusammenhängenden Speicherblock zugreift, muss der WavePci-Filter auf den Puffer als eine Reihe von möglicherweise nicht zusammenhängenden Speicherblöcken zugreifen. Blöcke, die aufeinander folgende Teile des Rendering- oder Aufnahmedatenstroms enthalten, werden auf dem Gerät in die Warteschlange gestellt. 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 weist einen Puffer zu, der aus einem einzelnen zusammenhängenden Speicherblock besteht, der als Ausgabe (zum Rendern) oder als Eingabepuffer (für die Aufnahme) verwendet werden kann. Dieser Puffer ist zyklisch. Da der Puffer nicht direkt auf den Client zugreifen kann, 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 auf 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 einem Benutzermodusclient ermöglicht, Audiodaten direkt mit der Audiohardware auszutauschen. Im Gegensatz dazu erfordern WaveCyclic- und WavePci-Filter regelmäßige Softwareeingriffe durch den Treiber, wodurch die Latenz des Audiodatenstroms erhöht wird. Darüber hinaus können Audiogeräte sowohl mit als auch ohne Scatter/Gather-DMA-Fähigkeiten als WaveRT-Filter dargestellt werden. Weitere Informationen finden Sie im White Paper "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 wie folgt einen WaveRT-Filter:
Es instanziiert ein WaveRT Miniport-Treiberobjekt.
Es instanziiert ein WaveRT-Porttreiberobjekt, indem pcNewPort mit GUID-Wert CLSID_PortWaveRT aufgerufen wird.
Sie ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in subdevice Creation veranschaulicht diesen Prozess. Die Port- und Miniporttreiber kommunizieren über ihre IPortWaveRT - und IMiniportWaveRT-Schnittstellen miteinander.
Für weitere Informationen lesen Sie das White Paper "A Wave Port Driver für Real-Time-Audio-Streaming".
Informationen zu früheren Versionen von Windows
WaveCyclic Information 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" impliziert, 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 mit einem ISA-Bus verbunden werden kann, z. B.. Im Gegensatz zu den einfacheren Geräten, die von WaveCyclic unterstützt werden, muss ein Gerät, das von WavePci unterstützt wird, über Scatter/Gather-DMA-Funktionen verfügen. Ein Audiogerät, das sich auf dem PCI-Bus befindet, aber kein Scatter/Gather-DMA besitzt, kann als WaveCyclic-Filter dargestellt werden, aber nicht als WavePci-Filter.
WavePci Information für frühere Versionen von Windows
Ein WavePci-Gerät kann Scatter/Gather-DMA-Übertragungen an oder von Puffern ausfü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 oder aus einem einzelnen Puffer zu verschieben, den der Miniporttreiber des Geräts zuweist. Ein WaveCyclic Miniport-Treiber kann einen zyklischen Puffer zuordnen, der den begrenzten Funktionen seines DMA-Kanals entspricht. Beispielsweise erfordert der DMA-Kanal für ein typisches WaveCyclic-Gerät möglicherweise einen Puffer, 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 mit geraden Vier- oder Acht-Byte-Grenzen.
Im Gegenzug für diese Einfachheit muss sich ein WaveCyclic-Gerät jedoch auf das Softwarekopieren von Daten in oder aus dem zyklischen Puffer verlassen, 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 das Scatter/Gather-DMA-Modul auf diese Puffer zugreifen, während ein WaveCyclic-Gerät erfordert, dass die Daten aus dem IRP in den zyklischen Puffer kopiert werden oder umgekehrt.
WavePci-Filter
Hinweis: WavePci Information für frühere Versionen von Windows
Ein WavePci-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine WavePci-Filterfabrik erstellt wie folgt einen WavePci-Filter:
Es instanziiert ein WavePci Miniport-Treiberobjekt.
Es instanziiert ein WavePci-Porttreiberobjekt, indem pcNewPort mit GUID-Wert CLSID_PortWavePci aufgerufen wird.
Sie ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in subdevice Creation veranschaulicht diesen Prozess. Die Port- und Miniporttreiber kommunizieren über ihre IPortWavePci - und IMiniportWavePci-Schnittstellen miteinander.
Weitere Informationen finden Sie unter Implementierungsprobleme für WavePci-Geräte.
WaveCyclic Filters
Hinweis
Microsoft unterstützt eine vielfältige und inklusive Umgebung. Dieser Artikel enthält Verweise auf die Terminologie, die vom Microsoft-Stilleitfaden für die biasfreie Kommunikation als Ausschluss erkannt wird. Das Wort oder der Ausdruck wird in diesem Artikel zur Konsistenz verwendet, da es derzeit in der Software angezeigt wird. Wenn die Software aktualisiert wird, um die Sprache zu entfernen, wird dieser Artikel so aktualisiert, dass er in Übereinstimmung steht.
Hinweis: WaveCyclic-Informationen zu älteren Versionen von Windows
Ein WaveCyclic-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine WaveCyclic-Filterfabrik erstellt wie folgt einen WaveCyclic-Filter:
Es instanziiert ein WaveCyclic Miniport-Treiberobjekt.
Es instanziiert ein WaveCyclic-Porttreiberobjekt, indem pcNewPort mit GUID-Wert CLSID_PortWaveCyclic aufgerufen wird.
Sie ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.
Das Codebeispiel in subdevice Creation veranschaulicht diesen Prozess. Die Port- und Miniporttreiber kommunizieren über ihre IPortWaveCyclic - und IMiniportWaveCyclic-Schnittstellen miteinander.
Der zyklische Puffer des WaveCyclic-Filters besteht immer aus einem zusammenhängenden Block des virtuellen Speichers. Die Implementierung des Porttreibers für die IDmaChannel::AllocateBuffer-Methode weist immer einen Puffer zu, der sowohl im physischen als auch im virtuellen Speicher adressraum zusammenhängend ist. Wenn, wie bereits erwähnt, das DMA-Modul des WaveCyclic-Geräts zusätzliche Einschränkungen für den Pufferspeicher angibt, kann der Miniporttreiber seine eigene Pufferzuordnungsmethode implementieren, um diese Einschränkungen zu erfüllen.
Ein WaveCyclic-Miniporttreiber, der einen großen Puffer anfordert (z. B. acht physisch zusammenhängende Speicherseiten), sollte darauf vorbereitet sein, sich für eine kleinere Puffergröße zu entscheiden, wenn das Betriebssystem die ursprüngliche Anforderung verweigert. Ein Audiogerät kann gelegentlich entladen und neu geladen werden, um Systemressourcen neu auszubalancieren (siehe Beenden eines Geräts zum Neuausgleich von Ressourcen).
Ein WaveCyclic-Gerät mit integrierter DMA-Hardware wird als Mastergerät bezeichnet. Alternativ kann ein WaveCyclic-Gerät ein untergeordnetes Gerät ohne integrierte DMA-Hardware-Funktionen sein. Ein untergeordnetes Gerät muss sich auf den DMA-Systemcontroller verlassen, um alle erforderlichen Datenübertragungen durchzuführen. Weitere Informationen zu Master- und untergeordneten Geräten finden Sie unter IDmaChannel und IDmaChannelSlave.
Ein WaveCyclic Miniport-Treiber kann ein eigenes DMA-Channel-Objekt implementieren, anstatt das standardmäßige 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, in denen 16-Bit-Beispiele immer signierte Werte sind, die Audiorenderinghardware kann jedoch für die Verwendung nicht signierter 16-Bit-Werte ausgelegt sein. 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 die Hardware benötigt. Obwohl diese Technik nützlich sein kann, um Hardwaredesignfehler zu umgehen, kann es auch zu erheblichen Kosten für den 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, aktivieren die Anweisungen der bedingten Kompilierung im Quellcode die Implementierung eines proprietären IDmaChannel-Objekts , das der Treiber anstelle des Standardobjekts IDmaChannel aus dem IPortWaveCyclic::NewXxxDmaChannel-Aufruf verwendet.