动态子设备注册和注销

支持某种形式的插孔状态检测的设备称为动态设备,其插孔必须支持 KSPROPERTY_JACK_DESCRIPTION 属性。 以下步骤显示了动态设备的驱动程序用于创建、注册或注销这些动态设备的关联子设备的算法。 子设备以筛选器形式创建。

以下步骤显示了当加载音频设备驱动程序时有音频设备插入插孔中时会发生的情况:

  1. 驱动程序使用插孔状态检测来确定有插入到插孔中的设备。 驱动程序会调用 PcRegisterSubdevice 以向 Portcls 注册拓扑筛选器。 KSCATEGORY_AUDIO 接口是注册拓扑筛选器时创建的。

  2. 在以下情况下,音频堆栈会收到通知:创建 KSCATEGORY_AUDIO 接口时,以及 AudioEndpoint Builder 创建并初始化关联的终结点,然后将其状态设置为活动状态时。

  3. 驱动程序会向 Portcls 注册波形筛选器,并通知音频堆栈。

  4. 驱动程序会调用 PcRegisterPhysicalConnection 以将波形筛选器与拓扑筛选器连接。 然后,此物理连接将注册到 Portcls。

  5. 驱动程序会将 KSJACK_DESCRIPTION 结构的 IsConnected 成员设置为 TRUE,以指示有设备插入到插孔中。

注意如果音频设备缺少插孔状态检测,IsConnected 成员必须始终为 TRUE。 若要确认设备是否支持插孔状态检测,客户端应用程序可以调用 IKsJackDescription2::GetJackDescription2 来读取 KSJACK_DESCRIPTION2 结构的 JackCapabilities 标志。 如果此标志设置了 JACKDESC2_PRESENCE_DETECT_CAPABILITY 位,则表示终结点支持插孔状态检测。 在这种情况下,IsConnected 成员的返回值可以解释为对插孔插入状态的准确反映。

以下步骤说明了加载驱动程序时没有插入到插孔中的音频设备会发生的情况:

  1. 驱动程序使用插孔状态检测来确定没有插入到插孔中的设备。 但是,它会向 Portcls 注册一个用于插孔的拓扑筛选器,并创建了一个 KSCATEGORY_AUDIO 接口。

  2. 创建好 KSCATEGORY_AUDIO 接口时,将通知音频堆栈。 AudioEndpointBuilder 会查询微型端口驱动程序,以便根据 KSJACK_DESCRIPTION 属性确定是否将终结点的状态设置为已拔出。

  3. 驱动程序会将 KSJACK_DESCRIPTION 结构的 IsConnected 成员设置为 FALSE,以指示没有设备插入到插孔中。

有关音频终结点的不同状态的详细信息,请参阅音频终结点生成器算法

为了符合上述有关子设备注册和注销过程的说明,支持插孔状态检测的设备驱动程序必须以下列方式做出响应,以响应插头插拔:

设备驱动程序对插头插入的响应

  1. 驱动程序必须调用 PcRegisterSubdevice 才能向 Portcls 注册波形筛选器。 注意驱动程序已在拓扑筛选器上调用 PcRegisterSubdevice,当驱动程序加载完毕时,没有设备插入到插孔中。

  2. 驱动程序必须调用 PcRegisterPhysicalConnection,以便向 Portcls 注册“波形到拓扑筛选器”连接。

  3. 驱动程序必须将 KSJACK_DESCRIPTION 结构的 IsConnected 成员设置为 TRUE

设备驱动程序对插头拔出的响应

  1. 驱动程序必须调用 IUnregisterPhysicalConnection::UnregisterPhysicalConnection 以注销波筛选器和拓扑筛选器之间的物理连接。

  2. 驱动程序必须调用 IUnregisterSubdevice::UnregisterSubdevice 以注销波形筛选器。

  3. 驱动程序必须将 KSJACK_DESCRIPTION 结构的 IsConnected 成员设置为 FALSE