Enumeración de dispositivos de ACX
En este tema se describe la enumeración de dispositivos ACX, el inicio y el apagado y el reequilibrio del dispositivo. Para obtener información general sobre ACX, consulte Introducción a las extensiones de clase de audio ACX. Para obtener información sobre la administración de energía de ACX y PnP, consulte Administración de energía de ACX.
Enumeración e inicio de dispositivos ACX para dispositivos de audio estáticos
Para obtener información sobre cómo funciona el inicio de ACX, se describirá el siguiente escenario.
- Un dispositivo de audio se representa mediante un único circuito.
- Una duración de audio/circuito está vinculada a la duración del dispositivo PnP.
- Un único dispositivo puede crear varios circuitos para diferentes dispositivos de audio.
- Entorno en modo kernel de KMDF.
La secuencia de inicio es:
DriverEntry de WDM. Con ámbito de controlador. Rutina DriverEntry para controladores WDF
- Seguimiento de inicialización.
- Registro opcional para descargar.
- Crear WDFDRIVER.
- Llamar a ACX para realizar cualquier inicialización del controlador posterior.
- Realizar cualquier inicialización del controlador posterior.
DeviceAdd de WDF. Con ámbito de dispositivo. función de devolución de llamada EVT_WDF_DRIVER_DEVICE_ADD
- Llamada a ACX para inicialr el contexto de inicialización del dispositivo:
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT función - Registrar devoluciones de llamada de energía PnP de WDF:
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Crear un dispositivo mediante AcxDeviceInitialize
- Llamar a ACX para realizar cualquier inicialización del dispositivo posterior.
- Opcionalmente, realizar cualquier inicialización del dispositivo posterior.
- Llamada a ACX para inicialr el contexto de inicialización del dispositivo:
PrepareHardware de WDF. Con ámbito de dispositivo. Función de devolución de llamada EVT_WDF_DEVICE_PREPARE_HARDWARE.
Crear e inicializar recursos de hardware (para interrupciones y subprocesos, registrarlos con ACX).
Crear uno o varios circuitos (creación una sola vez).
- Crear un contexto AcxCircuitInit.
- Agregar devoluciones de llamada.
- Crear un AcxCircuit.
- Opcionalmente, realizar cualquier inicialización del circuito posterior.
- Registrar el circuito con AcxDeviceAddCircuitDevice.
Devolución de llamada de entrada de dispositivo D0 de WDF. Con ámbito de dispositivo. Función de devolución de llamada EVT_WDF_DEVICE_D0_ENTRY.
ACX invoca la devolución de llamada EvtAcxCircuitPowerUp en todos los circuitos. Con ámbito de circuito.
ACX mueve las secuencias (si las hay) a su estado anterior antes de que el dispositivo se apagara. Con ámbito de la instancia de la secuencia.
Se reinician las colas de WDF.
Función de devolución de llamada EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT. Con ámbito de dispositivo.
Función de devolución de llamada EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART. Con ámbito de dispositivo. - Inicializar después de cada encendido de Dx.
Adición de secuencias de ACX
- Adición de secuencias de AcX (instancia) en circuito de ACX (devolución de llamada de ACX en circuitos de ACX): se invoca en cualquier momento después de que se haya invocado la inicialización o el reinicio de E/S autoadministrada de WDF y el dispositivo esté en D0. Con ámbito de circuito.
- Entrada: contexto AacxStreamInit, ACXCIRCUIT.
- Agregar devoluciones de llamada.
- Crear una AcxStream (instancia).
- Opcionalmente, realizar cualquier inicialización de instancia de secuencia posterior.
- A su vez, ACX activa esta instancia de secuencia y, dado que en este escenario es la única en la ruta de audio, permite que los mensajes de transmisión se transfieran.
Enumeración e inicio de dispositivos ACX para dispositivos de audio dinámicos
En este escenario, se asume lo siguiente.
- Compatibilidad con audio dinámico (crear o eliminar dispositivos de audio en tiempo de ejecución).
- La duración del dispositivo no está vinculada a la duración del circuito.
- Un único dispositivo puede crear varios circuitos para diferentes dispositivos de audio.
- Piggybacks en el patrón estático simple descrito anteriormente mediante la adición de elementos específicos del patrón dinámico.
- Se usan PDO sin procesar secundarios.
- Entorno en modo kernel de KMDF.
La secuencia de inicio para este escenario es:
DriverEntry de WDM. Con ámbito de controlador.
- Seguimiento de inicialización.
- Registro opcional para descargar.
- Crear WDFDRIVER.
- Llamar a ACX para realizar cualquier inicialización del controlador posterior.
- Realizar cualquier inicialización del controlador posterior.
DeviceAdd de WDF. Con ámbito de dispositivo.
- Llamar a ACX para inicializar el contexto de inicialización del dispositivo.
- Crear un dispositivo.
- Llamar a ACX para realizar cualquier inicialización del dispositivo posterior.
- Opcionalmente, realizar cualquier inicialización del dispositivo posterior.
PrepareHardware de WDF. Con ámbito de dispositivo.
- Crear e inicializar recursos de hardware (para interrupciones y subprocesos, registrarlos con ACX).
Devolución de llamada de entrada de dispositivo D0 de WDF. Con ámbito de dispositivo.
Se reinician las colas de WDF.
DeviceSelfManagedIoInit de WDF. Con ámbito de dispositivo.
DeviceSelfManagedIoRestart de WDF. Con ámbito de dispositivo.
- Inicializar después de cada encendido de Dx.
Creación del circuito dinámico (en cualquier momento)
- El controlador asigna una estructura WDFDEVICE_INIT llamando a WdfPdoInitAllocate. El controlador se encarga de invocar WdfDeviceInitFree si encuentra errores antes de crear correctamente un dispositivo.
- El controlador especifica las devoluciones de llamada PnP/energía que desea recibir.
- El controlador crea un dispositivo.
- El controlador crea una instancia del nuevo dispositivo o circuito llamando a AcxDeviceAddCircuitDevice.
- WDF/PnP toma el control y tiene lugar el patrón simple de enumeración/inicio descrito en la sección anterior.
AcxFactoryCircuit
Un controlador ACX también puede crear objetos AcxFactoryCircuit (proveedores de circuitos) durante la secuencia de encendido mediante la función AcxFactoryCircuitCreate y la función AcxDeviceAddFactoryCircuit.
Dado que el controlador ACX se registró con ACX como generador de circuitos, el marco ACX usa la fábrica registrada para pedir al controlador que cree un circuito nuevo.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
Reequilibrio de dispositivos ACX
El reequilibrio se realiza cuando el uso de recursos del sistema requiere que el sistema operativo reequilibre los recursos entre dispositivos. Para obtener información general sobre el reequilibrio, consulte Implementación del reequilibrio PnP para controladores de audio PortCls.
ACX admite el reequilibrio de dispositivos de la manera siguiente:
En la secuencia WDF/ACX de apagado, el controlador libera todos los recursos de streaming (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), recursos de circuito (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) y recursos de dispositivo (EvtDeviceReleaseHardware).
Todas las solicitudes quedan en espera, y las gestiones se dejan abiertas.
En la secuencia de WDF/ACX de encendido, el controlador se asegura de que los nuevos recursos son compatibles con los actuales y realiza los ajustes permitidos en su configuración. Si los recursos no son compatibles con la inicialización actual del dispositivo o circuito, el controlador debe eliminar los circuitos actuales y crear otros nuevos. Para obtener más información, consulte lo siguiente.
En la secuencia de encendido, WDF invoca su entrada EvtDevicePrepareHardware y EvtDeviceD0, y ACX invoca la correspondiente entrada EvtAcxCircuitPrepareHardware y EvtAcxCircuitPowerUp, y mueve todas las secuencias a sus estados preexistentes.
En cuanto las colas se mueven al estado de encendido y ejecución, vuelve a fluir la E/S.
ACX no permite quitar (se produce un error en la eliminación de consultas) ni reequilibrar (se produce un error en la detención de la consulta) si hay flujos en estado activo (RUN).
Los controladores también pueden optar por destruir y volver a crear dispositivos de audio al reequilibrar. Este es el mismo escenario anterior cuando el dispositivo detecta que la nueva configuración no es compatible con las anteriores. La eliminación del circuito debe realizarse en las devoluciones de llamada EvtDevicePrepareHardware/EvtDeviceReleaseHardware y el nuevo circuito se vuelve a crear en EvtDevicePrepareHardware. El controlador elimina un circuito anulando el registro del circuito (mediante AcxDeviceRemoveCircuit).
Identificadores de archivo en modo usuario
ACX no espera a que los identificadores de archivo en modo usuario se cierren antes de volver a crear nuevos circuitos. La duración de los identificadores del sistema de archivos no está vinculada a la duración de los recursos de hardware utilizados por el dispositivo o los circuitos. Es responsabilidad de los clientes escuchar la llegada o eliminación de la interfaz y cerrar y volver a abrir los identificadores de archivo.
Los identificadores de archivo antiguos están marcados como obsoletos y ACX produce un error en todas las solicitudes de E/S asociadas.
Consulte también
Información general sobre las extensiones de clase de audio de ACX
Documentación de referencia de la ACX
Secuencias de devolución de llamada de PnP y administración de energía