Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Аудиодрайверы модели драйвера Microsoft Windows (WDM) представляют звуковое устройство как фильтр KS, а аппаратный буфер на устройстве — как штырь на фильтре. Когда клиент отправляет запрос параметра одному из этих объектов фильтрации или закрепления, драйвер порта получает его и направляет к соответствующему обработчику параметров в драйвере порта или драйвере минипорта.
Звуковые устройства поддерживают три типа свойств:
Свойства фильтра
Свойство фильтра — это свойство фильтра в целом, а не свойство определенного пин-кода или узла в фильтре. Запросы для свойств фильтра указывают дескриптор фильтра, но они не указывают идентификаторы узлов.
Свойства булавок
Свойство контакта — это свойство конкретного экземпляра контакта на фильтре. Запросы для этих свойств определяют маркеры закрепления, но не задают идентификаторы узлов.
Свойства узла
Свойство узла — это свойство узла топологии в фильтре. Запрос на свойство узла задает дескриптор фильтра или дескриптор вывода, а также идентификатор узла.
Указывает ли запрос свойства узла фильтр или дескриптор пина, зависит от того, является ли узел уникальным для фильтра. Дополнительные сведения см. в следующем разделе "Свойства узла".
На следующем рисунке показаны три типа запроса свойства: запрос пин-свойства, отправленный экземпляру пин-кода, запрос свойства узла, отправленный на узел (в экземпляре фильтра или пин-кода), а также запрос на свойство фильтра, отправленный экземпляру фильтра.
Как правило, драйвер порта обрабатывает большинство запросов на свойства фильтра и пинов, а драйвер минипорта обрабатывает запросы на свойства узла.
Драйвер порта предоставляет собственные встроенные обработчики для свойств фильтра и штырей, используемых системным драйвером SysAudio (см. KSPROPSETID_Sysaudio и KSPROPSETID_Sysaudio_Pin) и системным драйвером WDMAud. Мини-драйверу не нужно реализовывать обработчики для свойств, которые обрабатывает драйвер порта. Типичный минипорт-драйвер предоставляет мало, если вообще предоставляет, обработчиков для свойств фильтра и пинов. Драйвер минипорта предоставляет обработчики свойств узлов, представляющих аппаратные функции звукового устройства. Драйверы портов не предоставляют встроенную обработку свойств узла, за исключением KSPROPERTY_TOPOLOGY_NAME.
Когда драйвер порта и обработчики драйверов мини-порта предоставляют обработчики для одного и того же свойства, драйвер порта использует собственный обработчик и игнорирует обработчик драйвера минипорта.
Дескрипторы фильтров
Драйвер порта получает указатели на обработчики свойств мини-порта, вызвав метод IMiniport::GetDescription . В этом методе драйвер порта получает указатель на дескриптор фильтра драйвера минипорта, который является структурой типа PCFILTER_DESCRIPTOR. Эта структура задает обработчики свойств miniport driver для свойств фильтра, пина и узла.
Элемент automationTable структуры PCFILTER_DESCRIPTOR указывает на таблицу автоматизации для фильтра. В этой таблице указаны обработчики свойств драйвера miniport для свойств фильтра.
Элемент пинов структуры PCFILTER_DESCRIPTOR содержит таблицы автоматизации для пинов. Каждая таблица указывает обработчики свойств для свойств пинов определенного типа.
Член Nodes структуры PCFILTER_DESCRIPTOR содержит таблицы автоматизации для узлов топологии внутри фильтра. Каждая таблица определяет обработчики для свойств узла определенного типа.
Свойства фильтра
Драйвер портов обращается к обработчикам свойств фильтра для минипорта через элемент AutomationTable PCFILTER_DESCRIPTOR. Как правило, эта таблица автоматизации содержит малое количество обработчиков, так как драйвер портов предоставляет собственные встроенные обработчики для всех свойств фильтра, используемых SysAudio и WDMAud для настройки и запроса звуковых устройств.
Однако минипорт-драйвер может предоставлять обработчики для свойств фильтра, таких как KSPROPERTY_GENERAL_COMPONENTID , которые предоставляют сведения, зависящие от оборудования, недоступные драйверу порта. Два примера звуковых драйверов в комплекте драйверов Microsoft Windows (WDK) обрабатывают свойство KSPROPERTY_GENERAL_COMPONENTID. Для получения дополнительной информации просмотрите реализации драйверов минипорта в примере драйвера Sysvad, который обсуждается в Примере звуковых драйверов.
Все драйверы портов в Portcls.sys обеспечивают обработку наборов свойств KSPROPSETID_Pin и KSPROPSETID_Topology . Все свойства в этих наборах являются свойствами фильтра, за исключением KSPROPERTY_TOPOLOGY_NAME, который является свойством узла (которое использует дескриптор фильтра, а не дескриптор пина, чтобы указать цель для запроса). Драйверы портов поддерживают следующее подмножество свойств KSPROPSETID_Pin:
KSPROPERTY_PIN_CONSTRAINEDDATARANGES
KSPROPERTY_PIN_DATAINTERSECTION
KSPROPERTY_PIN_GLOBALCINSTANCES
KSPROPERTY_PIN_NECESSARYINSTANCES
KSPROPERTY_PIN_PHYSICALCONNECTION
KSPROPERTY_PIN_PROPOSEDATAFORMAT
KSPROPERTY_PIN_PROPOSEDATAFORMAT2
Эти свойства предоставляют информацию о фабриках штырей, связанных с фильтром. Как правило, клиенты запрашивают у фильтра эти свойства перед созданием экземпляров пинов. Драйверы портов поддерживают все четыре свойства KSPROPSETID_Topology, которые предоставляют сведения о внутренней топологии фильтра.
Кроме того, драйвер порта DMus предоставляет обработчик для свойства KSPROPERTY_SYNTH_MASTERCLOCK, которое является свойством DirectMusic только для чтения. KSPROPERTY_SYNTH_MASTERCLOCK является членом набора свойств KSPROPSETID_SynthClock .
Свойства пинов
Драйвер порта обращается к обработчикам свойств пина драйвера miniport через элемент PCFILTER_DESCRIPTOR Pins. Этот член указывает на массив дескрипторов пин-кода, а каждый дескриптор указывает на таблицу автоматизации для типа пин-кода (идентифицируется идентификатором пин-кода, который является просто индексом массива).
Как правило, эти таблицы автоматизации содержат немного записей, так как драйвер порта предоставляет свои собственные обработчики для всех свойств разъемов, используемых SysAudio и WDMAud. Минипорт-драйвер имеет возможность предоставлять обработчики для одного или нескольких свойств пин-кода, которые драйвер порта не обрабатывает, но только клиенты, которые знают об этих свойствах, могут отправлять запросы свойств для них.
За исключением драйвера порта Топология, все драйверы портов в Portcls.sys предоставляют встроенные обработчики для следующих свойств контактов:
KSPROPERTY_CONNECTION_DATAFORMAT
KSPROPERTY_CONNECTION_ALLOCATORFRAMING
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
Для некоторых свойств в этом списке требуются сведения, предоставляемые минипортом драйвера, зависящие от оборудования. Когда драйвер порта получает IRP, содержащий запрос для одного из этих свойств, он не передает IRP мини-драйверу. Вместо этого драйвер порта обрабатывает сам запрос, но его обработчик получает сведения, необходимые для вызова точки входа в мини-драйвере. Например, драйвер портов предоставляет собственный обработчик свойств для запросов KSPROPERTY_AUDIO_POSITION. Этот обработчик просто вызывает метод GetPosition потока драйвера miniport (например, IMiniportWavePciStream::GetPosition), чтобы получить текущую позицию.
Свойства узла
Драйвер портов обращается к обработчикам свойств узла минипорта через член Nodes PCFILTER_DESCRIPTOR. Этот член указывает на массив дескрипторов узлов, а каждый дескриптор указывает на таблицу автоматизации для типа узла (идентифицируется идентификатором узла, который является просто индексом массива). Как правило, все или большинство обработчиков свойств, принадлежащих драйверу мини-порта, находятся в массиве Nodes . Звуковой драйвер представляет аппаратные элементы управления в звуковом устройстве в качестве узлов топологии, и он использует механизм свойств для предоставления клиентам доступа к параметрам управления, зависящим от оборудования.
Как описано ранее, клиент отправляет запрос свойства фильтра в дескриптор фильтра и запрос свойства пина в дескриптор пина. В отличие от экземпляра фильтра или закрепления узел не является объектом ядра и не имеет дескриптора. Клиент отправляет запрос свойства узла в дескриптор пин-кода или дескриптор фильтра, но запрос также указывает идентификатор узла, указывающий, что запрос предназначен для свойства узла, а не для свойства пин-кода или фильтра.
Ниже приведены общие правила определения того, должно ли свойство узла использовать дескриптор фильтра или дескриптор штыря:
Если фильтр содержит несколько экземпляров определенного типа пин-кода, а каждый пин-код этого типа содержит узел с определенным идентификатором узла, каждый экземпляр пин-кода содержит экземпляр узла. В этом случае запрос свойства узла должен указывать дескриптор пина (а не только дескриптор фильтра), чтобы различать несколько экземпляров одного и того же типа узла. Сочетание дескриптора пин-кода и идентификатора узла однозначно определяет конкретный экземпляр узла как целевой объект для запроса.
Если фильтр содержит только один экземпляр определенного узла, запрос свойства узла указывает дескриптор фильтра. Сочетание дескриптора фильтра и идентификатора узла достаточно, чтобы однозначно определить узел, который является целевым для запроса.
Прежде чем реализовать обработчик для определенного свойства узла, разработчику драйверов следует обратиться к наборам свойств аудиодрайверов , чтобы проверить, следует ли указывать целевой объект свойства в качестве дескриптора фильтра или маркера пина.
Драйверы портов в Portcls.sys в настоящее время не предоставляют встроенную обработку свойств узла, за исключением KSPROPERTY_TOPOLOGY_NAME.
Переопределенные и недоопределенные запросы свойств
Водители должны быть готовы к обработке запросов на имущество от клиентов, которые не соответствуют вышеуказанным правилам. Запросы могут быть сверхопределены или недоопределены:
Чрезмерно детализированные запросы
Если для запроса свойства требуется только дескриптор фильтра, но клиент отправляет запрос в дескриптор пин-кода, целевой объект запроса переопределен. Однако драйверы обычно рассматривают запрос как допустимый; То есть они обрабатывают запрос так, как будто он был отправлен в фильтр, содержащий пин-код.
Недоопределенные запросы
Если для запроса свойства требуется пин-дескриптор, а клиент направляет запрос в дескриптор фильтра, целевой объект для запроса недостаточно определён. Например, если фильтр содержит несколько экземпляров пин-кода с одинаковым типом узла, а клиент отправляет запрос на свойство этого типа узла в дескриптор фильтра, а не дескриптор пин-кода, драйвер не может определить, какой экземпляр узла должен получить запрос. В этом случае поведение зависит от драйвера. Вместо автоматического сбоя всех недоопределенных запросов некоторые драйверы обрабатывают недоопределенный запрос set-property допустимым. В этом случае интерпретация заключается в том, что запрос задает значение по умолчанию для указанного идентификатора узла. Когда фабрика пинов создает новый экземпляр узла, свойство, принадлежащее новому узлу, инициализируется значением по умолчанию. Запрос, который изменяет значение по умолчанию, не влияет на экземпляры узлов, созданные перед запросом. Кроме того, драйверы всегда не могут обработать запросы "get-property", так как обработчик не может определить, экземпляр какого узла запрашивать для получения свойства.
исключения правил
По историческим причинам, некоторые свойства звука имеют поведенческие причуды, которые нарушают эти общие правила. Ниже приведены примеры:
Как описано в разделе "Применение параметров Speaker-Configuration", клиент может изменить конфигурацию динамиков звукового устройства, задав свойство KSPROPERTY_AUDIO_CHANNEL_CONFIG 3-D узла (KSNODETYPE_3D_EFFECTS). Параметр конфигурации говорящего является глобальным, так как он изменяет конфигурацию говорящего для всех потоков, которые являются частью смеси, которую устройство воспроизводит через динамики. Согласно общему правилу, запрос свойства узла, который влияет на фильтр в целом, должен указывать дескриптор фильтра (плюс идентификатор узла). Однако для этого конкретного свойства требуется дескриптор штифта вместо дескриптора фильтра. Держатель пина обозначает экземпляр пина, содержащий 3-D-узел, который является целью запроса.
KSPROPERTY_SYNTH_VOLUME и KSPROPERTY_SYNTH_MASTERCLOCK являются свойствами узла синтезатора (KSNODETYPE_SYNTHESIZER). Хотя оба являются свойствами узла, запросы для этих свойств не включают идентификаторы узлов. (Обратите внимание, что дескриптор свойства для запроса является структурой типа KSPROPERTY, а не KSNODEPROPERTY.) Это поведение нарушает общее правило, для свойства узла требуется идентификатор узла. Несмотря на это несоответствие, минипорт-драйвер, поддерживающий любое свойство, должен предоставить обработчик свойств через элемент Nodes PCFILTER_DESCRIPTOR (вместо элемента Pins ).