Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Некоторые звуковые устройства предоставляют аппаратные ручки управления громкостью, переключатели выключения или другие типы элементов управления вручную. Приложения могут реагировать на изменения в этих элементах управления, изменяя громкость или изменяя способ воспроизведения звукового потока. Когда пользователь настраивает аппаратный элемент управления, драйвер минипорта использует интерфейс IPortEvents для информирования драйвера порта о том, что произошло событие оборудования. Драйвер порта, в свою очередь, уведомляет приложение события, чтобы он смог считывать новый параметр управления с устройства.
Драйвер минипорта может запрашивать драйвер порта для интерфейса IPortEvents в то время, когда он обслуживает вызов Init (см. IMiniportWavePci::Init), от драйвера порта. В Microsoft Windows 98 SE, Windows Me и Windows 2000 и более поздних версий запрос завершается успешно. Пример кода см. в примере аудиоадаптера Sb16 в более ранних версиях комплекта драйверов Windows (WDK).
Когда драйвер порта вызывает метод IMiniport::GetDescription , метод выводит структуру PCFILTER_DESCRIPTOR , указывающую, помимо прочего, события, поддерживаемые устройством. События можно указать в таблицах автоматизации для членов PCFILTER_DESCRIPTOR пинов и узлов, а также в члене AutomationTable, который указывает на таблицу автоматизации для самого фильтра. Каждое событие определяется структурой PCEVENT_ITEM . Драйвер должен установить члены структуры PCEVENT_ITEM Set и Id в значения KSEVENTSETID_AudioControlChange и KSEVENT_CONTROL_CHANGE, и загрузить указатель на подпрограмму EventHandler драйвера в член Handler. Драйвер также должен задать бит PCEVENT_ITEM_FLAG_BASICSUPPORT в члене Flags, чтобы указать базовую поддержку событий изменения управления, и он должен задать биты PCEVENT_ITEM_FLAG_ONESHOT и/или PCEVENT_ITEM_FLAG_ENABLE, чтобы указать, что он поддерживает однократное и/или повторяющееся уведомление.
Когда приложение позже вызывает функцию mixerOpen (описанную в документации по пакету SDK для Microsoft Windows), чтобы запросить уведомление о конкретном событии, драйвер порта затем вызывает подпрограмму EventHandler драйвера с указателем на структуру PCEVENT_REQUEST . Для члена Verb этой структуры задано значение PCEVENT_VERB_ADD, а элемент EventItem указывает на событие, которое необходимо активировать. Структура PCEVENT_REQUEST также содержит указатель на структуру KSEVENT_ENTRY , которую драйвер должен рассматривать как непрозрачные системные данные. После включения события обработчик должен вызвать IPortEvents::AddEventToEventList с тем же указателем KSEVENT_ENTRY. При этом вызове обработчик признает, что событие включено.
При возникновении аппаратного события и подпрограмма обслуживания прерываний драйвера обнаруживает отключение звука или изменение громкости, драйвер сигнализирует о событии драйверу порта, вызывая IPortEvents::GenerateEventList с набором параметров, описывающих событие. Например, следующий вызов описывает изменение регулятора в узле выходной громкости.
pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
FALSE, ULONG(-1), TRUE, LINEOUT_VOL);
Во время этого вызова драйвер портов выполняет поиск в списке событий для всех событий, соответствующих параметрам вызова, и отправляет уведомления клиентам, которые отслеживают эти события. В этом примере pPE — это указатель на объект IPortEvents, а LINEOUT_VOL — это идентификатор узла, который драйвер минипорта назначает узлу регулировки громкости линии. Неуказанные параметры (такие как идентификатор GUID набора событий и идентификатор пин в предыдущем примере) обрабатываются как подстановочные знаки и всегда соответствуют соответствующим параметрам в списке.