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


Раскрытие эффектов захвата Hardware-Accelerated

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

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

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

Акустическая эхокомпенсация

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

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

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

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

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

заказNode-Chain

В настоящее время архитектура эффектов захвата 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 в примере кода.