某些音频设备提供硬件音量控制旋钮、静音开关或其他类型的手动控制。 应用程序可以通过调整音量或更改音频流播放的方式来响应这些控件中的更改。 当用户调整硬件控件时,微型端口驱动程序使用 IPortEvents 接口通知端口驱动程序硬件事件已发生。 端口驱动程序反过来会通知事件的应用程序,以便它可以从设备读取新的控制设置。
微型端口驱动程序可以在处理来自端口驱动程序的 Init 调用时,查询其上的 IPortEvents 接口(请参阅 IMiniportWavePci::Init 作为示例)。 在Microsoft Windows 98 SE、Windows Me 和 Windows 2000 及更高版本上,该查询成功。 有关代码示例,请参阅早期版本的 Windows 驱动程序工具包(WDK)中的 Sb16 示例音频适配器。
当端口驱动程序调用您的驱动程序的 IMiniport::GetDescription 方法时,该方法将输出 PCFILTER_DESCRIPTOR 结构,其中包括设备支持的事件等信息。 可以在自动化表中为 PCFILTER_DESCRIPTOR 的 Pins 和 Nodes 成员,以及指向过滤器本身的自动化表的 AutomationTable 成员指定事件。 每个事件都由 PCEVENT_ITEM 结构指定。 驱动程序应将PCEVENT_ITEM结构的 Set 和 Id 成员设置为 KSEVENTSETID_AudioControlChange 和 KSEVENT_CONTROL_CHANGE,并将指向驱动程序 EventHandler 例程的指针加载到 处理程序 成员中。 驱动程序还应在 Flags 成员中设置PCEVENT_ITEM_FLAG_BASICSUPPORT位,以指示对控制更改事件的基本支持,并且应设置PCEVENT_ITEM_FLAG_ONESHOT和/或PCEVENT_ITEM_FLAG_ENABLE位,以指示它支持一次性和/或定期通知。
当应用程序稍后调用 mixerOpen 函数(Microsoft Windows SDK 文档中所述)以请求特定事件的通知时,端口驱动程序随后使用指向PCEVENT_REQUEST结构的指针调用驱动程序的 EventHandler 例程。 此结构的 Verb 成员设置为 PCEVENT_VERB_ADD,其 EventItem 成员指定要启用的事件。 PCEVENT_REQUEST结构还包含指向驱动程序应视为不透明系统数据的 KSEVENT_ENTRY 结构的指针。 启用事件后,处理程序应使用相同的KSEVENT_ENTRY指针调用 IPortEvents::AddEventToEventList 。 通过此调用,处理程序确认已启用该事件。
当硬件事件发生并且驱动程序的中断服务例程检测到静音或音量更改时,驱动程序通过调用 IPortEvents::GenerateEventList 并传递描述事件的一组参数,向端口驱动程序发送信号。 例如,以下调用描述了线路输出音量节点中的控制更改:
pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
FALSE, ULONG(-1), TRUE, LINEOUT_VOL);
在此调用期间,端口驱动程序在其事件列表中搜索与调用参数匹配的所有事件,并向监视这些事件的客户端发送通知。 在此示例中,pPE 是指向 IPortEvents 对象的指针,LINEOUT_VOL是微型端口驱动程序分配给线出卷节点的节点 ID。 未指定的参数(如前面的示例中的事件集 GUID 和引脚 ID)被视为通配符,并且始终与列表中的相应参数匹配。