Freigeben über


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:

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_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

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.

Diagramm, das die interne Topologie eines AEC-Filters mit AEC- und NS-Knoten veranschaulicht.

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.