Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
No Windows XP e versões posteriores, a estrutura de áudio WDM suporta aceleração de hardware de efeitos de captura de áudio expostos através do DirectSound. Estes efeitos incluem cancelamento de eco acústico (AEC) e supressão de ruído (NS). 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 miniporta 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 no gráfico. 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 suportar o conjunto de propriedades KSPROPSETID_General e fornecer informações sobre o fabricante quando consultados para a propriedade KSPROPERTY_GENERAL_COMPONENTID.
Os nós AEC e NS no pino devem suportar o conjunto de propriedades KSPROPSETID_TopologyNode e as suas duas propriedades:
KSPROPERTY_TOPOLOGYNODE_ENABLE permite um efeito.
KSPROPERTY_TOPOLOGYNODE_RESET redefine o efeito para seu estado padrão.
Os nós AEC e NS no pino devem suportar as seguintes propriedades do conjunto de propriedades KSPROPSETID_Audio : KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
O pino deve suportar as seguintes propriedades do conjunto de propriedades KSPROPSETID_Audio: KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
O pino deve expor as suas capacidades de intervalo de dados (consulte Pino 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 miniporta PCM expõe o suporte de hardware para AEC na forma de uma topologia para os fluxos de captura e renderização que atende a este requisito adicional:
- O pino deve incluir um nó AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), que deve ser especificado na sua posição apropriada na sequência de nós ordenada (veja abaixo).
Supressão de Ruído
Um driver de miniporta PCM expõe o suporte de hardware para NS na forma de uma topologia para o fluxo de captura que atende a este requisito adicional:
- O pino deve incluir um nó NS (KSNODETYPE_NOISE_SUPPRESS), que deve ser especificado em sua posição apropriada na cadeia de nós ordenados (veja abaixo).
Node-Chain Encomendar
Atualmente, a arquitetura de efeitos de captura DirectSound requer que os nós sejam especificados na ordem em que são solicitados pelo aplicativo. Como resultado, a ordem na qual o driver de miniporta 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 que são implementados pelo hardware na seguinte ordem:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
Observe que essa lista pode omitir quaisquer efeitos não implementados, desde que a ordem relativa seja preservada.
Atribuições de pinos de nó AEC
Um driver de adaptador usa uma matriz de estruturas PCCONNECTION_DESCRIPTOR para especificar as conexões dentro de um filtro. Cada elemento de matriz descreve uma conexão, que pode ser node-to-node, node-to-pin, 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" aos nós. Estes são "pinos" nos próprios nós 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 os IDs de pinos 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 do 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 fluxo de captura |
KSNODEPIN_AEC_CAPTURE_OUT |
3 |
Pino de origem (saída do nó) para fluxo de captura |
Os IDs dos pinos na tabela anterior são definidos no ficheiro 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 aparece na figura. Cada conexão corresponde a um dos cinco elementos na matriz AecConnections no exemplo de código.