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 :
La broche doit inclure un nœud individuel dans sa chaîne de nœuds pour représenter chaque effet matériel à incorporer dans le graphique. Les types de nœuds KS pour les effets AEC et NS sont spécifiés par les GUID suivants : KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOISE_SUPPRESS
Les nœuds AEC et NS sur la broche doivent prendre en charge l’ensemble de propriétés KSPROPSETID_General et fournir des informations sur le fabricant lorsqu’ils sont interrogés pour la propriété KSPROPERTY_GENERAL_COMPONENTID .
Les nœuds AEC et NS de la broche doivent prendre en charge le jeu de propriétés KSPROPSETID_TopologyNode et ses deux propriétés :
KSPROPERTY_TOPOLOGYNODE_ENABLE active un effet.
KSPROPERTY_TOPOLOGYNODE_RESET rétablit l’effet à son état par défaut.
Les nœuds AEC et NS de la broche doivent prendre en charge les propriétés suivantes du jeu de propriétés KSPROPSETID_Audio : KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
Le code pin doit prendre en charge les propriétés suivantes du jeu de propriétés KSPROPSETID_Audio : KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
La broche doit exposer ses fonctionnalités de plage de données (voir Propriétés de Data-Range et d’intersection).
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_ACOUSTIC_ECHO_CANCEL
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.
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.