Énumération d’appareils ACX
Cette rubrique traite de l'énumération, du démarrage et de l'arrêt des appareils ACX, ainsi que du rééquilibrage des appareils. Pour une vue d’ensemble générale d’ACX, veuillez consulter la section vue d’ensemble des extensions audio de classe ACX. Pour plus d'informations sur la gestion de l'alimentation ACX et le PnP, reportez-vous à la section Gestion de l'alimentation ACX.
Enumération et démarrage des appareils ACX pour les appareils audio statiques
Pour apprendre comment fonctionne le démarrage de l'ACX, nous allons décrire le scénario suivant.
- Un appareil audio est représenté par un seul circuit.
- La durée de vie d'un circuit audio est liée à la durée de vie de l'appareil PnP.
- Un seul appareil peut créer plusieurs circuits pour différents appareils audio.
- Environnement KMDF en mode noyau.
La séquence de démarrage est la suivante :
WDM DriverEntry. Portée du pilote. DriverEntry pour la routine des pilotes WDF.
- Init tracing.
- Enregistrement facultatif pour le déchargement.
- Créez WDFDRIVER.
- Appelez ACX pour effectuer toute opération d'initialisation postérieure à la création du pilote.
- Optionnellement, effectuez une post-initialisation du pilote.
WDF DeviceAdd. À l'échelle de l'appareil. Fonction de rappel EVT_WDF_DRIVER_DEVICE_ADD
- Appeler ACX pour init le contexte d’init de l’appareil -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
fonction ACX_DEVICEINIT_CONFIG_INIT - Enregistrer les fonctions de rappel de l'alimentation PnP de la WDF -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Créez l'appareil à l'aide de la fonction AcxDeviceInitialize
- Appelez l'ACX pour effectuer toute opération de post-initialisation de l'appareil.
- Optionnellement, effectuez n'importe quelle initialisation après l'appareil.
- Appeler ACX pour init le contexte d’init de l’appareil -
WDF PrepareHardware. À l'échelle de l'appareil. Fonction de rappel EVT_WDF_DEVICE_PREPARE_HARDWARE.
Créez et initialisez les ressources matérielles (pour les interruptions et les threads, enregistrez-les auprès de l'ACX).
Créez un ou plusieurs circuits (création unique).
- Créez un contexte AcxCircuitInit.
- Ajouter des callbacks.
- Créez un AcxCircuit.
- Effectuez éventuellement un init post-circuit.
- Enregistrez le circuit avec AcxDeviceAddCircuitDevice.
Rappel d'entrée de l'appareil WDF D0. À l'échelle de l'appareil. Fonction de rappel EVT_WDF_DEVICE_D0_ENTRY.
ACX invoque la fonction de rappel EvtAcxCircuitPowerUp sur tous les circuits. Circuit-scoped.
ACX déplace les flux (le cas échéant) dans l'état où ils se trouvaient avant la mise hors tension de l'appareil. Étendue de l'instance de flux.
Les files d'attente WDF sont redémarrées.
Fonction de rappel EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT. À l'échelle de l'appareil.
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART callback function. À l'échelle de l'appareil. - Init après chaque mise sous tension à partir de Dx.
Ajout de flux ACX
- Ajout de flux ACX (instance) sur circuit ACX (rappel ACX sur circuits ACX) - invoqué à tout moment après que la fonction WDF Self-managed I/O Init ou Restart a été invoquée et que l'appareil est en D0. Circuit-scoped.
- Entrée : Contexte AcxStreamInit, ACXCIRCUIT.
- Ajouter des callbacks.
- Créez un AcxStream (instance).
- Il est possible d'effectuer un init de l'instance après la création du flux.
- En retour, l'ACX active cette instance de flux, et puisque dans ce scénario c'est la seule sur le chemin audio, elle permet aux messages de flux de passer.
Enumération et démarrage des appareils ACX pour les appareils audio dynamiques
Dans ce scénario, les éléments suivants sont pris en compte.
- Prise en charge de l'audio dynamique (création/suppression d'appareils audio au moment de l'exécution).
- La durée de vie de l'appareil n'est pas liée à celle du circuit.
- Un seul appareil peut créer plusieurs circuits pour différents appareils audio.
- Le modèle statique simple décrit ci-dessus est repris en n'ajoutant que des éléments spécifiques au modèle dynamique.
- Utilise les PDO bruts de l'enfant.
- Environnement KMDF en mode noyau.
La séquence de démarrage pour ce scénario est la suivante :
WDM DriverEntry. Portée du pilote.
- Init tracing.
- Enregistrement facultatif pour le déchargement.
- Créez WDFDRIVER.
- Appelez ACX pour effectuer toute opération d'initialisation postérieure à la création du pilote.
- Optionnellement, effectuez une post-initialisation du pilote.
WDF DeviceAdd. À l'échelle de l'appareil.
- Appeler l'ACX pour initier le contexte d'initialisation de l'appareil.
- Création de l'appareil.
- Appelez l'ACX pour effectuer toute opération de post-initialisation de l'appareil.
- Optionnellement, effectuez n'importe quelle initialisation après l'appareil.
WDF PrepareHardware. À l'échelle de l'appareil.
- Créez et initialisez les ressources matérielles (pour les interruptions et les threads, enregistrez-les auprès de l'ACX).
Rappel d'entrée de l'appareil WDF D0. À l'échelle de l'appareil.
Les files d'attente WDF sont redémarrées.
WDF DeviceSelfManagedIoInit. À l'échelle de l'appareil.
WDF DeviceSelfManagedIoRestart. À l'échelle de l'appareil.
- Init après chaque mise sous tension à partir de Dx.
Création dynamique du circuit (à tout moment)
- Le pilote alloue une structure WDFDEVICE_INIT en appelant WdfPdoInitAllocate. Le pilote est responsable de l'appel à WdfDeviceInitFree s'il rencontre des échecs avant la création réussie d'un appareil.
- Le pilote spécifie les rappels PnP/alimentation qu'il souhaite recevoir.
- Le pilote crée un appareil.
- Le pilote instancie le nouvel appareil/circuit en appelant AcxDeviceAddCircuitDevice.
- WDF/PnP prend le relais et le modèle simple d'enums/démarrage décrit dans la section précédente se met en place.
AcxFactoryCircuit
Un pilote ACX peut également créer des objets AcxFactoryCircuit (fournisseurs de circuits) pendant la séquence de mise sous tension à l'aide de la fonction AcxFactoryCircuitCreate et de la fonction AcxDeviceAddFactoryCircuit.
Étant donné que le pilote ACX s'est enregistré auprès de l'ACX en tant que fabrique de circuits, le cadre ACX utilise la fabrique enregistrée pour demander au pilote de créer un nouveau circuit.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
Rééquilibrage des appareils ACX
Le rééquilibrage est effectué lorsque l'utilisation des ressources du système exige que le système d'exploitation rééquilibre les ressources entre les appareils. Pour des informations générales sur le rééquilibrage, voir Implémenter le rééquilibrage PnP pour les pilotes audio PortCls.
ACX prend en charge le rééquilibrage des appareils de la manière suivante :
Dans la séquence WDF/ACX de mise hors tension, le pilote libère toutes les ressources de streaming (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), les ressources de circuit (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) et les ressources d'appareil (EvtDeviceReleaseHardware).
Toutes les requêtes sont suspendues et les handles restent ouverts.
Dans la séquence WDF/ACX de mise sous tension, le pilote s'assure que les nouvelles ressources sont compatibles avec les ressources actuelles et procède aux ajustements autorisés de ses paramètres. Si les ressources ne sont pas compatibles avec l'initialisation actuelle de l'appareil/du circuit, le pilote doit supprimer les circuits actuels et en créer de nouveaux. Voir ci-dessous pour plus d'informations.
Dans la séquence de mise sous tension, WDF invoque ses entrées EvtDevicePrepareHardware et EvtDeviceD0, et ACX invoque les entrées EvtAcxCircuitPrepareHardware et EvtAcxCircuitPowerUp correspondantes, et déplace tous les flux dans leurs états préexistants.
Dès que les files d'attente passent à l'état de mise sous tension/exploitation, le flux d'E/S reprend.
ACX n'autorise pas la suppression (échec query-remove) ou le rééquilibrage (échec query-stop) s'il y a des flux dans l'état actif (RUN).
Les pilotes peuvent également choisir de toujours détruire et recréer les appareils audio lors du rééquilibrage. Il s'agit du même scénario que ci-dessus lorsque l'appareil détecte que les nouveaux paramètres ne sont pas compatibles avec les anciens. La suppression du circuit doit être effectuée dans les rappels EvtDevicePrepareHardware/EvtDeviceReleaseHardware, et le nouveau circuit est recréé dans EvtDevicePrepareHardware. Le pilote supprime un circuit en le désenregistrant (à l'aide de AcxDeviceRemoveCircuit).
Manipulations de fichiers en mode utilisateur
ACX n'attend pas que les handles de fichiers en mode utilisateur soient fermés avant de recréer de nouveaux circuits. La durée de vie des handles du système de fichiers n'est pas liée à la durée de vie des ressources matérielles utilisées par les appareils/circuits. Il incombe aux clients d'écouter l'arrivée/le retrait de l'interface et de fermer et rouvrir les poignées de fichiers.
Les anciens handles de fichiers sont marqués comme obsolètes et ACX fait échouer toutes les requêtes d'E/S qui leur sont associées.
Voir aussi
Vue d’ensemble des extensions de classe audio ACX