Verfügbarmachen von Hardware-Accelerated Erfassungseffekten
In Windows XP und höher unterstützt das WDM-Audioframework die Hardwarebeschleunigung von Audioaufnahmeeffekten, die über DirectSound verfügbar gemacht werden. Diese Effekte umfassen akustische Echounterdrückung (AEC) und Rauschunterdrückung (NS). Informationen dazu, wie eine DirectSoundCapture-Anwendung die Verwendung von hardwarebeschleunigtem AEC und NS ermöglicht, finden Sie in der Microsoft Windows SDK-Dokumentation.
Ein Miniporttreiber kann die Hardwarebeschleunigung für jede Teilmenge dieser Auswirkungen verfügbar machen, abhängig von den Funktionen des zugrunde liegenden Geräts. Um die Hardwarefunktionen für AEC- und NS-Effekte verfügbar zu machen, sollte jeder Pin am AEC-Filter, den der Treiber implementiert, die folgenden Anforderungen erfüllen:
Der Pin sollte einen einzelnen Knoten in seiner Knotenkette enthalten, um jeden Hardwareeffekt darzustellen, der in das Diagramm integriert werden soll. Die KS-Knotentypen für AEC- und NS-Effekte werden durch die folgenden GUIDs angegeben: KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOISE_SUPPRESS
Die AEC- und NS-Knoten auf dem Pin sollten den KSPROPSETID_General-Eigenschaftssatz unterstützen und Informationen zum Hersteller bereitstellen, wenn sie nach der KSPROPERTY_GENERAL_COMPONENTID-Eigenschaft abgefragt werden.
Die AEC- und NS-Knoten auf dem Pin sollten den KSPROPSETID_TopologyNode-Eigenschaftssatz und die beiden zugehörigen Eigenschaften unterstützen:
KSPROPERTY_TOPOLOGYNODE_ENABLE ermöglicht einen Effekt.
KSPROPERTY_TOPOLOGYNODE_RESET setzt den Effekt auf den Standardzustand zurück.
Die AEC- und NS-Knoten auf dem Pin sollten die folgenden Eigenschaften des KSPROPSETID_Audio Eigenschaftensatzes unterstützen: KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
Der Pin sollte die folgenden Eigenschaften des KSPROPSETID_Audio-Eigenschaftssatzes unterstützen: KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
Der Pin sollte seine Datenbereichsfunktionen verfügbar machen (siehe Anheften Data-Range- und Kreuzungseigenschaften).
Die spezifischen Anforderungen für das Verfügbarmachen hardwarebeschleunigter AEC- und NS-Knoten sind unten dargestellt.
Akustische Echounterdrückung
Ein PCM-Miniporttreiber macht die Hardwareunterstützung für AEC in Form einer Topologie für die Aufzeichnungs- und Renderdatenströme verfügbar, die diese zusätzliche Anforderung erfüllt:
- Der Pin muss einen AEC-Knoten (KSNODETYPE_ACOUSTIC_ECHO_CANCEL) enthalten, der an seiner richtigen Position in der geordneten Knotenkette angegeben werden muss (siehe unten).
Rauschunterdrückung
Ein PCM-Miniporttreiber macht die Hardwareunterstützung für NS in Form einer Topologie für den Erfassungsdatenstrom verfügbar, die diese zusätzliche Anforderung erfüllt:
- Der Pin muss einen NS-Knoten (KSNODETYPE_NOISE_SUPPRESS) enthalten, der an seiner richtigen Position in der geordneten Knotenkette angegeben werden muss (siehe unten).
Knotenkettenreihenfolge
Derzeit erfordert die DirectSound-Capture-Effects-Architektur, dass die Knoten in der Reihenfolge angegeben werden, in der sie von der Anwendung angefordert werden. Daher muss die Reihenfolge, in der der Miniporttreiber seine Knoten angibt, mit der Reihenfolge übereinstimmen, die vom AEC-Systemfilter (Aec.sys) verwendet wird, der die AEC- und NS-Algorithmen in software implementiert.
Um die Hardwarebeschleunigung zu aktivieren, muss der Treiber die Auswirkungen angeben, die von der Hardware in der folgenden Reihenfolge implementiert werden:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
Beachten Sie, dass diese Liste alle nicht implementierten Effekte auslassen kann, solange die relative Reihenfolge beibehalten wird.
AEC-Knotenheftzuweisungen
Ein Adaptertreiber verwendet ein Array von PCCONNECTION_DESCRIPTOR Strukturen, um die Verbindungen innerhalb eines Filters anzugeben. Jedes Arrayelement beschreibt eine Verbindung, die knoten-zu-knoten, node-to-pin oder Pin-to-Pin sein kann. Ausführliche Informationen finden Sie unter Knoten und Verbindungen.
Um die PCCONNECTION_DESCRIPTOR-Struktur zu verwenden, weist der Treiberschreiber Knoten "logische" Pins zu. Dies sind "Pins" auf den Knoten selbst und werden ausschließlich verwendet, um die Verbindungen innerhalb des Filters anzugeben. Dies steht im Gegensatz zu den externen Pins am Filter, die zum Herstellen einer Verbindung mit anderen Filtern verwendet werden.
Die folgende Tabelle zeigt die Pin-IDs, die der Adaptertreiber den vier logischen Pins auf dem AEC-Knoten zuweisen soll.
Name des Pin-ID-Parameters | Wert | Bedeutung |
---|---|---|
KSNODEPIN_AEC_RENDER_IN |
1 |
Senkennadel (Knoteneingabe) für Renderdatenstrom |
KSNODEPIN_AEC_RENDER_OUT |
0 |
Quellnadel (Knotenausgabe) für Renderstream |
KSNODEPIN_AEC_CAPTURE_IN |
2 |
Senkennadel (Knoteneingabe) für den Erfassungsstream |
KSNODEPIN_AEC_CAPTURE_OUT |
3 |
Quellnadel (Knotenausgabe) für den Erfassungsstream |
Die Pin-IDs in der vorherigen Tabelle sind in der Headerdatei Ksmedia.h definiert.
Das folgende Codebeispiel zeigt, wie ein Adaptertreiber die interne Topologie eines AEC-Filters angeben kann, der sowohl einen AEC-Knoten als auch einen NS-Knoten enthält:
// AEC Filter Topology
// Pin IDs for external pins on AEC filter
#define ID_CaptureOutPin 0 // microphone stream
#define ID_CaptureInPin 1
#define ID_RenderOutPin 2 // speaker stream
#define ID_RenderInPin 3
// Generic pin IDs for simple node with one input and one output
#define NODE_INPUT_PIN 1
#define NODE_OUTPUT_PIN 0
// Node IDs
#define NODE_ID_AEC 0 // acoustic echo cancellation
#define NODE_ID_NS 1 // noise suppression
// The array below defines the internal topology of an
// AEC filter that contains an AEC node and an NS node.
const PCCONNECTION_DESCRIPTOR AecConnections[] = {
{ PCFILTER_NODE, ID_RenderInPin, NODE_ID_AEC, KSNODEPIN_AEC_RENDER_IN },
{ NODE_ID_AEC, KSNODEPIN_AEC_RENDER_OUT, PCFILTER_NODE, ID_RenderOutPin },
{ PCFILTER_NODE, ID_CaptureInPin, NODE_ID_AEC, KSNODEPIN_AEC_CAPTURE_IN },
{ NODE_ID_AEC, KSNODEPIN_AEC_CAPTURE_OUT, NODE_ID_NS, NODE_INPUT_PIN },
{ NODE_ID_NS, NODE_OUTPUT_PIN, PCFILTER_NODE, ID_CaptureOutPin }
};
Das Array AecConnections im vorherigen Codebeispiel definiert die Filtertopologie, die in der folgenden Abbildung dargestellt ist.
Die obige Abbildung stellt jede Verbindung innerhalb des Filters mit einem gestrichelten Pfeil dar, der in Die Richtung des Datenflusses zeigt. Insgesamt werden fünf Verbindungen in der Abbildung angezeigt. Jede Verbindung entspricht einem der fünf Elemente im AecConnections-Array im Codebeispiel.