Partager via


Exposition des effets de capture Hardware-Accelerated

Dans Windows XP et versions ultérieures, l’infrastructure audio WDM prend en charge l’accélération matérielle des effets de capture audio qui sont exposés via DirectSound. Ces effets incluent l’annulation d’écho acoustique (AEC) et la suppression du bruit (NS). Pour plus d’informations sur la façon dont une application DirectSoundCapture permet l’utilisation d’AEC et de NS à accélération matérielle, consultez la documentation Microsoft Windows SDK.

Un pilote miniport peut exposer l’accélération matérielle pour n’importe quel sous-ensemble de ces effets, en fonction des capacités de l’appareil sous-jacent. Pour exposer les fonctionnalités du matériel pour les effets AEC et NS, chaque broche sur le filtre AEC que le pilote implémente doit répondre aux exigences suivantes :

Les exigences spécifiques pour l’exposition des nœuds AEC et NS accélérés par le matériel sont présentées ci-dessous.

Annulation de l’écho acoustique

Un pilote PCM miniport expose la prise en charge matérielle d’AEC sous la forme d’une topologie pour les flux de capture et de rendu qui répondent à cette exigence supplémentaire :

  • La broche doit inclure un nœud AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), qui doit être spécifié dans sa position appropriée dans la chaîne de nœuds ordonnée (voir ci-dessous).

Suppression du bruit

Un pilote PCM miniport expose la prise en charge matérielle de NS sous la forme d’une topologie pour le flux de capture qui répond à cette exigence supplémentaire :

  • La broche doit inclure un nœud NS (KSNODETYPE_NOISE_SUPPRESS), qui doit être spécifié dans sa position appropriée dans la chaîne de nœuds ordonnée (voir ci-dessous).

Ordre des chaînes de nœuds

Actuellement, l’architecture des effets de capture DirectSound exige que les nœuds soient spécifiés dans l’ordre dans lequel ils sont demandés par l’application. Par conséquent, l’ordre dans lequel le pilote miniport spécifie ses nœuds doit correspondre à l’ordre utilisé par le filtre système AEC (Aec.sys), qui implémente les algorithmes AEC et NS dans les logiciels.

Pour activer l’accélération matérielle, le pilote doit spécifier les effets implémentés par le matériel dans l’ordre suivant :

KSNODETYPE_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

Notez que cette liste peut omettre tous les effets non implémentés tant que l’ordre relatif est conservé.

Attributions de broches de nœud AEC

Un pilote d’adaptateur utilise un tableau de structures PCCONNECTION_DESCRIPTOR pour spécifier les connexions au sein d’un filtre. Chaque élément de tableau décrit une connexion, qui peut être nœud à nœud, nœud à épingle ou épingle à épingle. Pour plus d’informations, consultez Nœuds et connexions.

Pour utiliser la structure PCCONNECTION_DESCRIPTOR, l’enregistreur de pilotes affecte des broches « logiques » aux nœuds. Il s’agit de « broches » sur les nœuds eux-mêmes et sont utilisées uniquement pour spécifier les connexions à l’intérieur du filtre. Cela contraste avec les broches externes sur le filtre, qui sont utilisées pour se connecter à d’autres filtres.

Le tableau suivant montre les ID de broche que le pilote d’adaptateur doit affecter aux quatre broches logiques du nœud AEC.

Nom du paramètre d’ID de code pin Valeur Signification

KSNODEPIN_AEC_RENDER_IN

1

Broche récepteur (entrée de nœud) pour le flux de rendu

KSNODEPIN_AEC_RENDER_OUT

0

Code source (sortie de nœud) pour le flux de rendu

KSNODEPIN_AEC_CAPTURE_IN

2

Broche récepteur (entrée de nœud) pour le flux de capture

KSNODEPIN_AEC_CAPTURE_OUT

3

Code pin source (sortie de nœud) pour le flux de capture

Les ID de broche dans le tableau précédent sont définis dans le fichier d’en-tête Ksmedia.h.

L’exemple de code suivant montre comment un pilote d’adaptateur peut spécifier la topologie interne d’un filtre AEC qui contient à la fois un nœud AEC et un nœud NS :

    // 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   }
    };

Le tableau AecConnections dans l’exemple de code précédent définit la topologie de filtre illustrée dans la figure suivante.

Diagramme illustrant la topologie interne d’un filtre AEC avec des nœuds AEC et NS.

La figure précédente représente chaque connexion à l’intérieur du filtre avec une flèche pointée qui pointe dans la direction du flux de données. Au total, cinq connexions apparaissent dans la figure. Chaque connexion correspond à l’un des cinq éléments du tableau AecConnections dans l’exemple de code.