Implementación del reequilibrio de PnP para los controladores de audio de PortCls
El reequilibrio PnP se usa en determinados casos de PCI en los que es necesario reasignar los recursos de memoria.
El reequilibrio se puede activar en dos situaciones principales:
- Conexión en caliente de PCI: un usuario conecta un dispositivo y el bus PCI no tiene suficientes recursos para cargar el controlador en el nuevo dispositivo. Algunos ejemplos de dispositivos que se encuentran en esta categoría son Thunderbolt, USB-C y almacenamiento NVME. En este escenario, los recursos de memoria deben reorganizarse y consolidarse (reequilibrado) para admitir los dispositivos adicionales que se van a agregar.
- BAR redimensionable de PCI: después de cargar correctamente un controlador en un dispositivo en la memoria, se solicitan recursos adicionales. Algunos ejemplos de dispositivos son tarjetas gráficas de gama alta y dispositivos de almacenamiento. Para obtener más información sobre la compatibilidad de controladores de vídeo, consulte Compatibilidad con BAR redimensionable. En este tema se describe lo que se debe hacer para implementar el reequilibrio de PnP en los controladores de audio de PortCls.
El reequilibrio de PnP está disponible en Windows 10, versión 1511 y versiones posteriores de Windows.
Requisitos de reequilibrio
Los controladores de audio de Portcls pueden integrar la función de reequilibrio si se cumplen las condiciones siguientes:
- El minipuerto debe registrar la interfaz IAdapterPnpManagement con Portcls.
- El minipuerto debe devolver PcRebalanceRemoveSubdevices de IAdapterPnpManagement::GetSupportedRebalanceType.
- Topology y WaveRT son los dos tipos de puerto admitidos.
Para usar el reequilibrio cuando haya transmisiones de audio activas, los controladores de audio de Portcls deben cumplir uno de estos dos requisitos adicionales.
- El controlador admite las interfaces de paquetes IMiniportWaveRTInputStream::GetReadPacket y IMiniportWaveRTOutputStream para la transmisión de audio. Ésta es la opción recomendada.
O BIEN
- Si el controlador no incluye la opción de obtener o escribir IMiniportWaveRT para las transmisiones, el controlador no debe incluir KSPROPERTY_RTAUDIO_POSITIONREGISTER ni KSPROPERTY_RTAUDIO_CLOCKREGISTER. El motor de audio usará IMiniportWaveRTStream::GetPosition en este caso.
Qué pasa con la transmisión de audio cuando se aplica el reequilibrio
Si se activa el reequilibrio, cuando hay transmisiones de audio activas y el controlador es compatible con la función de reequilibrar las transmisiones de audio activas, se detendrán todas las transmisiones de audio activas y no se reiniciarán automáticamente.
Interfaz COM de IPortClsPnp
IPortClsPnp
es la interfaz de administración de PnP que expone el controlador de clase de puerto (PortCls) al adaptador.
IPortClsPnp
procede de IUnknown y también admite los métodos siguientes:
Los controladores de audio minipuerto pueden registrar una interfaz de notificación PNP mediante exportaciones de Portcls o a través de la interfaz COM IPortClsPnp expuesta en el objeto del puerto WaveRT. Use IPortClsPnp::RegisterAdapterPnpManagement y IPortClsPnp::UnregisterAdapterPnpManagement para activar el registro o eliminarlo.
DDI de exportación de PortCls necesarias
IAdapterPnpManagement es una interfaz que los adaptadores deben implementar y registrar si quieren recibir mensajes de administración de PnP. Registre esta interfaz con PortCls mediante PcRegisterAdapterPnpManagement. Elimine el registro de esta interfaz con PortCls mediante PcUnregisterAdapterPnpManagement.
DDI de controlador necesarias
Las siguientes DDI IAdapterPnpManagement deben implementarse para integrar la función de reequilibrio.
Portcls llama a IAdapterPnpManagement::GetSupportedRebalanceType mientras procesa QueryStop. El minipuerto devuelve el tipo de reequilibrio aceptado, tal como se define en la enumeración PC_REBALANCE_TYPE.
Nota Portcls accede al bloqueo global del dispositivo antes de realizar esta llamada, por lo que el minipuerto debe ejecutar esta llamada lo más rápido posible.
Portcl invoca IAdapterPnpManagement::PnpQueryStop antes de procesar correctamente el IRP de QueryStop. Esto es solo una notificación y la llamada no devuelve ningún valor.
Nota Portcls accede al bloqueo global del dispositivo antes de realizar esta llamada, por lo que el minipuerto debe ejecutar esta llamada lo más rápido posible. Mientras haya un Stop pendiente, Portcls bloqueará (almacenará) las nuevas solicitudes de creación.
Portcl invoca IAdapterPnpManagement::PnpCancelStop mientras se procesa el IRP de CanceStop. Esto es solo una notificación. Es posible que el minipuerto reciba PnpCancelStop aunque no reciba previamente una notificación de PnpQueryStop. El minipuerto debe escribirse para asimilar esta respuesta. Por ejemplo, esto pasa cuando la lógica QueryStop genera un error en el IRP antes de que Portcls tenga la oportunidad de reenviar esta notificación al minipuerto. En este caso, el administrador de PnP sigue invocando un Cancel Stop de PnP.
Nota Portcls accede al bloqueo global del dispositivo antes de realizar esta llamada, por lo que el minipuerto debe ejecutar esta llamada lo más rápido posible. Mientras haya un Stop pendiente, Portcls bloqueará (almacenará) las nuevas solicitudes de creación. PortCls reinicia las solicitudes de creación pendientes cuando se cancela un Stop pendiente.
Portcls invoca IAdapterPnpManagement::PnpStop después de detener todas las operaciones de Ioctl y mover las transmisiones activas del estado [run|pause|acquire] al estado [stop]. Esta llamada no se realiza mientras se mantiene el bloqueo global del dispositivo. Por lo tanto, el minipuerto tiene la oportunidad de contener sus operaciones asincrónicas (elementos de trabajo, dpc, subprocesos asincrónicos) y anular el registro de los subdispositivos de audio. Antes de devolver nada a partir de esta llamada, el minipuerto debe asegurarse de que se han liberado todos los recursos de hardware.
Nota El minipuerto no debe esperar a que se eliminen los objetos de minipuerto/transmisiones actuales, ya que no está claro cuando los clientes de audio existentes liberarán los identificadores actuales. El subproceso PnpStop no puede bloquearse para siempre sin bloquear el sistema, es decir, se trata de un subproceso de PnP/consumo de energía.
IMiniportPnpNotify
IMiniportPnpNotify es una interfaz opcional para permitir que los objetos de minipuerto (subdispositivos de audio) reciban notificaciones de cambio de estado de PnP.
Los minipuertos tienen la opción de recibir una notificación de Stop de PnP en cada subdispositivo de audio que hayan registrado. Para recibir esta notificación, el subdispositivo debe admitir IMiniportPnpNotify. en esta interfaz solo se define la notificación IMiniportPnpNotify::PnpStop.
La interfaz IMiniportPnpNotify disponible se puede usar tanto en WaveRT como en Topology.
Nota Dado que Portcls accede al bloqueo global del dispositivo antes de realizar esta llamada, el minipuerto debe ejecutar esta llamada lo más rápido posible. El minipuerto no debe esperar a otra actividad mientras procesa esta llamada para evitar interbloqueos cuando otros subprocesos o elementos de trabajo están esperando el bloqueo global del dispositivo. Si es necesario, el minipuerto puede esperar en la llamada de IAdapterPnpManagement::PnpStop.