Partilhar via


Expor os efeitos de captura Hardware-Accelerated

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:

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_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

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.

Diagrama ilustrando a topologia interna de um filtro AEC com nós AEC e NS.

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.