硬件事件
某些音频设备提供硬件音量控制旋钮、静音开关或其他类型的手动控制。 应用程序可以通过调整音量或更改音频流播放方式来响应这些控件中的更改。 当用户调整硬件控件时,微型端口驱动程序使用 IPortEvents 接口通知端口驱动程序已发生硬件事件。 端口驱动程序反过来会通知事件的应用程序,以便它可以从设备读取新的控制设置。
微型端口驱动程序可以在从端口驱动程序为 Init 调用(例如,请参阅 IMiniportWavePci::Init)提供服务时查询 IPortEvents 接口的端口驱动程序。 在 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 例程的指针加载到 Handler 成员中。 驱动程序还应在 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)被视为通配符,并始终与列表中的相应参数匹配。