Предоставление Hardware-Accelerated эффектов захвата
В Windows XP и более поздних версиях платформа WDM поддерживает аппаратное ускорение эффектов захвата звука, предоставляемых через DirectSound. К таким эффектам относятся подавление акустического эха (AEC) и подавление шума (NS). Сведения о том, как приложение DirectSoundCapture позволяет использовать AEC и NS с аппаратным ускорением, см. в документации по Microsoft Windows SDK.
Драйвер мини-порта может предоставлять аппаратное ускорение для любого подмножества этих эффектов в зависимости от возможностей базового устройства. Чтобы предоставить возможности оборудования для эффектов AEC и NS, каждое закрепление фильтра AEC, реализуемого драйвером, должно соответствовать следующим требованиям:
Контакт должен включать отдельный узел в цепочку узлов, чтобы представлять каждый эффект оборудования, который должен быть включен в граф. Типы узлов KS для эффектов AEC и NS задаются следующими guid: KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOISE_SUPPRESS
Узлы AEC и NS на контакте должны поддерживать набор свойств KSPROPSETID_General и предоставлять сведения о производителе при запросе свойства KSPROPERTY_GENERAL_COMPONENTID .
Узлы AEC и NS на контакте должны поддерживать набор свойств KSPROPSETID_TopologyNode и два его свойства:
KSPROPERTY_TOPOLOGYNODE_ENABLE включает эффект.
KSPROPERTY_TOPOLOGYNODE_RESET сбрасывает эффект в состояние по умолчанию.
Узлы AEC и NS на контакте должны поддерживать следующие свойства набора свойств KSPROPSETID_Audio : KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
Закрепление должно поддерживать следующие свойства набора свойств KSPROPSETID_Audio: KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
Закрепление должно предоставлять возможности диапазона данных (см. раздел Свойства Data-Range и пересечения).
Ниже приведены конкретные требования для предоставления доступа к узлам AEC и NS с аппаратным ускорением.
Подавление акустического эха
Драйвер минипорта PCM предоставляет аппаратную поддержку AEC в виде топологии для потоков захвата и отрисовки, которые соответствуют этому дополнительному требованию:
- Контакт должен содержать узел AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), который должен быть указан в правильном положении в цепочке упорядоченных узлов (см. ниже).
Подавление шума
Драйвер минипорта PCM предоставляет поддержку оборудования для NS в виде топологии для потока захвата, которая соответствует этому дополнительному требованию:
- Контакт должен включать узел NS (KSNODETYPE_NOISE_SUPPRESS), который должен быть указан в правильном положении в цепочке упорядоченных узлов (см. ниже).
Упорядочение цепочки узлов
В настоящее время архитектура эффектов отслеживания DirectSound требует, чтобы узлы были указаны в порядке, в котором они запрашиваются приложением. В результате порядок, в котором драйвер минипорта указывает свои узлы, должен соответствовать порядку, используемому системным фильтром AEC (Aec.sys), который реализует алгоритмы AEC и NS в программном обеспечении.
Чтобы включить аппаратное ускорение, драйвер должен указать эффекты, реализованные оборудованием, в следующем порядке:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
Обратите внимание, что в этом списке можно пропустить любые неисполнеемые эффекты, пока сохраняется относительный порядок.
Назначения контактов узлов 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 в предыдущем примере кода определяет топологию фильтра, показанную на следующем рисунке.
На предыдущем рисунке каждое соединение внутри фильтра представлено пунктирной стрелкой, указывающей на направление потока данных. На рисунке отображается в общей сложности пять подключений. Каждое соединение соответствует одному из пяти элементов в массиве AecConnections в примере кода.