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:

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_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

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.

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 aparecem na figura. Cada conexão corresponde a um dos cinco elementos na matriz AecConnections no exemplo de código.