Expondo efeitos de captura de Hardware-Accelerated
No Windows XP e posterior, a estrutura de áudio do WDM dá suporte à aceleração de hardware de efeitos de captura de áudio expostos por meio do DirectSound. Esses efeitos incluem cancelamento de eco acústico (AEC) e NS (supressão de ruído). Para obter informações sobre como um aplicativo DirectSoundCapture permite o uso de AEC e NS acelerados por hardware, consulte a documentação do SDK do Microsoft Windows.
Um driver de miniporte pode expor a aceleração de hardware para qualquer subconjunto desses efeitos, dependendo dos recursos do dispositivo subjacente. Para expor os recursos do hardware para efeitos AEC e NS, cada pino no filtro AEC que o driver implementa deve atender a estes requisitos:
O pino deve incluir um nó individual em sua cadeia de nós para representar cada efeito de hardware que deve ser incorporado ao grafo. Os tipos de nó KS para efeitos AEC e NS são especificados pelos seguintes GUIDs: KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOISE_SUPPRESS
Os nós AEC e NS no pino devem dar suporte ao conjunto de propriedades KSPROPSETID_General e devem fornecer informações sobre o fabricante quando consultados para a propriedade KSPROPERTY_GENERAL_COMPONENTID .
Os nós AEC e NS no pino devem dar suporte ao conjunto de propriedades KSPROPSETID_TopologyNode e suas duas propriedades:
KSPROPERTY_TOPOLOGYNODE_ENABLE habilita um efeito.
KSPROPERTY_TOPOLOGYNODE_RESET redefine o efeito para seu estado padrão.
Os nós AEC e NS no pino devem dar suporte às seguintes propriedades do conjunto de propriedades KSPROPSETID_Audio : KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
O pin deve dar suporte às seguintes propriedades do conjunto de propriedades KSPROPSETID_Audio: KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
O pino deve expor seus recursos de intervalo de dados (consulte Fixar Data-Range e Propriedades de Interseção).
Os requisitos específicos para expor nós AEC e NS acelerados por hardware são apresentados abaixo.
Cancelamento de eco acústico
Um driver de miniporto PCM expõe o suporte de hardware para a AEC na forma de uma topologia para os fluxos de captura e renderização que atendem a esse requisito adicional:
- O pino deve incluir um nó AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), que deve ser especificado em sua posição adequada na cadeia de nós ordenada (veja abaixo).
Supressão de ruído
Um driver de miniporto PCM expõe o suporte de hardware para NS na forma de uma topologia para o fluxo de captura que atende a esse requisito adicional:
- O pino deve incluir um nó NS (KSNODETYPE_NOISE_SUPPRESS), que deve ser especificado em sua posição adequada na cadeia de nós ordenada (veja abaixo).
Ordenação de cadeia de nós
Atualmente, a arquitetura de efeitos de captura do DirectSound exige que os nós sejam especificados na ordem em que são solicitados pelo aplicativo. Como resultado, a ordem na qual o driver de miniporto especifica seus nós deve corresponder à ordem usada pelo filtro do sistema AEC (Aec.sys), que implementa os algoritmos AEC e NS no software.
Para habilitar a aceleração de hardware, o driver deve especificar os efeitos implementados pelo hardware na seguinte ordem:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
Observe que essa lista pode omitir quaisquer efeitos não simplificados, desde que a ordenação relativa seja preservada.
Atribuições de pino de nó do AEC
Um driver de adaptador usa uma matriz de estruturas de PCCONNECTION_DESCRIPTOR para especificar as conexões dentro de um filtro. Cada elemento de matriz descreve uma conexão, que pode ser nó a nó, nó a pino ou pin-to-pin. Para obter detalhes, consulte Nós e Conexões.
Para usar a estrutura PCCONNECTION_DESCRIPTOR, o gravador de driver atribui pinos "lógicos" a nós. Esses são "pinos" nos nós em si e são usados apenas para especificar as conexões dentro do filtro. Isso contrasta com os pinos externos no filtro, que são usados para se conectar a outros filtros.
A tabela a seguir mostra as IDs de pino que o driver do adaptador deve atribuir aos quatro pinos lógicos no nó AEC.
Nome do parâmetro de ID do pin | Valor | Significado |
---|---|---|
KSNODEPIN_AEC_RENDER_IN |
1 |
Pino do coletor (entrada de nó) para fluxo de renderização |
KSNODEPIN_AEC_RENDER_OUT |
0 |
Pino de origem (saída do nó) para fluxo de renderização |
KSNODEPIN_AEC_CAPTURE_IN |
2 |
Pino do coletor (entrada do nó) para o fluxo de captura |
KSNODEPIN_AEC_CAPTURE_OUT |
3 |
Pino de origem (saída do nó) para fluxo de captura |
As IDs de pin na tabela anterior são definidas no arquivo de cabeçalho Ksmedia.h.
O exemplo de código a seguir mostra como um driver de adaptador pode especificar a topologia interna de um filtro AEC que contém um nó AEC e um nó 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 }
};
A matriz AecConnections no exemplo de código anterior define a topologia de filtro mostrada na figura a seguir.
A figura anterior representa cada conexão dentro do filtro com uma seta tracejada que aponta na direção do fluxo de dados. Um total de cinco conexões aparecem na figura. Cada conexão corresponde a um dos cinco elementos na matriz AecConnections no exemplo de código.