Поделиться через


Предоставление Hardware-Accelerated эффектов захвата

В Windows XP и более поздних версиях платформа WDM поддерживает аппаратное ускорение эффектов захвата звука, предоставляемых через DirectSound. К таким эффектам относятся подавление акустического эха (AEC) и подавление шума (NS). Сведения о том, как приложение DirectSoundCapture позволяет использовать AEC и NS с аппаратным ускорением, см. в документации по Microsoft Windows SDK.

Драйвер мини-порта может предоставлять аппаратное ускорение для любого подмножества этих эффектов в зависимости от возможностей базового устройства. Чтобы предоставить возможности оборудования для эффектов AEC и NS, каждое закрепление фильтра AEC, реализуемого драйвером, должно соответствовать следующим требованиям:

Ниже приведены конкретные требования для предоставления доступа к узлам AEC и NS с аппаратным ускорением.

Подавление акустического эха

Драйвер минипорта PCM предоставляет аппаратную поддержку AEC в виде топологии для потоков захвата и отрисовки, которые соответствуют этому дополнительному требованию:

  • Контакт должен содержать узел AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), который должен быть указан в правильном положении в цепочке упорядоченных узлов (см. ниже).

Подавление шума

Драйвер минипорта PCM предоставляет поддержку оборудования для NS в виде топологии для потока захвата, которая соответствует этому дополнительному требованию:

  • Контакт должен включать узел NS (KSNODETYPE_NOISE_SUPPRESS), который должен быть указан в правильном положении в цепочке упорядоченных узлов (см. ниже).

Упорядочение цепочки узлов

В настоящее время архитектура эффектов отслеживания DirectSound требует, чтобы узлы были указаны в порядке, в котором они запрашиваются приложением. В результате порядок, в котором драйвер минипорта указывает свои узлы, должен соответствовать порядку, используемому системным фильтром AEC (Aec.sys), который реализует алгоритмы AEC и NS в программном обеспечении.

Чтобы включить аппаратное ускорение, драйвер должен указать эффекты, реализованные оборудованием, в следующем порядке:

KSNODETYPE_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

Обратите внимание, что в этом списке можно пропустить любые неисполнеемые эффекты, пока сохраняется относительный порядок.

Назначения контактов узлов AEC

Драйвер адаптера использует массив PCCONNECTION_DESCRIPTOR структур для указания подключений в фильтре. Каждый элемент массива описывает одно соединение, которое может быть соединением типа "узел — узел", "узел —контакт" или "закрепление к контакту". Дополнительные сведения см. в разделе Узлы и подключения.

Чтобы использовать структуру PCCONNECTION_DESCRIPTOR, модуль записи драйверов назначает "логические" контакты узлам. Это "закрепления" на самих узлах и используются исключительно для указания подключений внутри фильтра. Это отличается от внешних контактов на фильтре, которые используются для подключения к другим фильтрам.

В следующей таблице показаны идентификаторы контактов, которые драйвер адаптера должен назначить четырем логическим контактам на узле AEC.

Имя параметра идентификатора закрепления Значение Значение

KSNODEPIN_AEC_RENDER_IN

1

Контакт приемника (входные данные узла) для потока отрисовки

KSNODEPIN_AEC_RENDER_OUT

0

Исходный контакт (выходные данные узла) для потока отрисовки

KSNODEPIN_AEC_CAPTURE_IN

2

Контакт приемника (входные данные узла) для потока записи

KSNODEPIN_AEC_CAPTURE_OUT

3

Исходный контакт (выходные данные узла) для потока записи

Идентификаторы контактов в предыдущей таблице определяются в файле заголовка Ksmedia.h.

В следующем примере кода показано, как драйвер адаптера может указать внутреннюю топологию фильтра AEC, содержащего как узел AEC, так и узел 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   }
    };

Массив AecConnections в предыдущем примере кода определяет топологию фильтра, показанную на следующем рисунке.

Схема, иллюстрирующая внутреннюю топологию фильтра AEC с узлами AEC и NS.

На предыдущем рисунке каждое соединение внутри фильтра представлено пунктирной стрелкой, указывающей на направление потока данных. На рисунке отображается в общей сложности пять подключений. Каждое соединение соответствует одному из пяти элементов в массиве AecConnections в примере кода.