Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В Windows XP и более поздних версиях звуковая платформа WDM поддерживает аппаратное ускорение эффектов захвата звука, предоставляемых через DirectSound. Эти эффекты включают акустическую эхо-компенсацию (AEC) и подавление шума (NS). Сведения о том, как приложение DirectSoundCapture позволяет использовать аппаратное ускорение AEC и NS, см. в документации по пакету SDK для Microsoft Windows.
Минипорт-драйвер может предоставлять аппаратное ускорение для любого подмножества этих эффектов в зависимости от возможностей базового устройства. Чтобы предоставить возможности оборудования для эффектов AEC и NS, каждый вывод фильтра AEC, реализуемого драйвером, должен соответствовать следующим требованиям.
Пин-код должен включать отдельный узел в цепочку узлов, чтобы представить каждый аппаратный эффект, который должен быть включен в граф. Типы узлов KS для эффектов AEC и NS задаются следующими идентификаторами GUID: KSNODETYPE_ACOUSTIC_ECHO_CANCEL, KSNODETYPE_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_RESOURCES и KSPROPERTY_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), который должен быть указан в правильном положении в упорядоченной цепочке узлов (см. ниже).
заказNode-Chain
В настоящее время архитектура эффектов захвата 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 в примере кода.