Enumerazione del dispositivo ACX
Questo argomento illustra l'enumerazione del dispositivo ACX, l'avvio e l'arresto e il ribilanciamento del dispositivo. Per una panoramica generale di ACX, vedere panoramica delle estensioni della classe audio ACX . Per informazioni sul risparmio energia ACX e PnP, vedere risparmio energia ACX.
Enumerazione e avvio di dispositivi ACX per dispositivi audio statici
Per informazioni sul funzionamento dell'avvio di ACX, verrà descritto lo scenario seguente.
- Un dispositivo audio è rappresentato da un singolo circuito.
- La durata di un circuito audio è legata alla durata del dispositivo PnP.
- Un singolo dispositivo può creare più circuiti per dispositivi audio diversi.
- Ambiente in modalità kernel kmDF.
La sequenza di avvio è:
DriverEntry WDM. Ambito driver. Routine DriverEntry per i driver WDF
- Avvio del tracciamento.
- Facoltativamente, eseguire la registrazione per scaricare.
- Creare WDFDRIVER.
- Chiama ACX per eseguire qualsiasi inserimento del driver.
- Facoltativamente, eseguire qualsiasi post driver init.
Dispositivo WDFAggiungi. Ambito del dispositivo. Funzione di callback EVT_WDF_DRIVER_DEVICE_ADD del driver
- Chiamare ACX per inizializzare il contesto del dispositivo:
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
funzione ACX_DEVICEINIT_CONFIG_INIT - Registrare i callback di Power PnP di WDF -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Creare un dispositivo usando AcxDeviceInitialize
- Chiama ACX per qualsiasi post-inizializzazione del dispositivo.
- Facoltativamente, eseguire eventuali operazioni successive all'inizializzazione del dispositivo.
- Chiamare ACX per inizializzare il contesto del dispositivo:
WDF PrepareHardware. Ambito dispositivo. Funzione di callback EVT_WDF_DEVICE_PREPARE_HARDWARE.
Creare e inizializzare le risorse hardware (per gli interrupt e i thread, registrandole con ACX).
Creare uno o più circuiti (una sola volta).
- Creare il contesto AcxCircuitInit.
- Aggiungere callback.
- Creare un AcxCircuit.
- Eseguire facoltativamente qualsiasi inizializzazione successiva al circuito.
- Registrare il circuito con AcxDeviceAddCircuitDevice.
Callback di ingresso D0 del dispositivo WDF. Ambito dispositivo. EVT_WDF_DEVICE_D0_ENTRY la funzione di callback.
ACX richiama il callback EvtAcxCircuitPowerUp su tutti i circuiti. Ambito del circuito.
ACX Sposta i flussi (se presenti) sullo stato precedente prima che il dispositivo fosse spento. Stream con ambito di istanza.
Le code WDF vengono riavviate.
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT funzione di callback. Ambito dispositivo.
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART funzione di callback. Ambito del dispositivo. - Inizializza dopo ogni riavvio da Dx.
Aggiungi flusso ACX
- AcX Stream Add (istanza) su ACX Circuit (richiamata ACX sui circuiti ACX) – in qualsiasi momento dopo che il WDF self-managed I/O Init o Restart è stato invocato e il dispositivo è in D0. Ambito del circuito.
- Input: contesto AcxStreamInit, ACXCIRCUIT.
- Aggiungere callback.
- Creare un oggetto AcxStream (istanza).
- Facoltativamente, eseguire qualsiasi init dell'istanza di post-stream.
- Al ritorno, ACX attiva questa istanza di flusso e, poiché in questo scenario è l'unica sul percorso audio, consente il passaggio dei messaggi in streaming.
Enumerazione e avvio di dispositivi ACX per dispositivi audio dinamici
In questo scenario si presuppone quanto segue.
- Supporto audio dinamico (creazione/eliminazione di dispositivi audio in fase di esecuzione).
- La durata del dispositivo non è associata alla durata del circuito.
- Un singolo dispositivo può creare più circuiti per dispositivi audio diversi.
- Si appoggia sul semplice modello statico descritto sopra aggiungendo solo elementi specifici del modello dinamico.
- Utilizza i PDO grezzi figli.
- Ambiente KMDF in modalità kernel.
La sequenza di avvio per questo scenario è:
DriverEntry WDM. Ambito driver.
- Inizializzazione della traccia.
- Facoltativamente, eseguire la registrazione per scaricare.
- Creare WDFDRIVER.
- Chiama ACX per eseguire qualsiasi inizializzazione del driver.
- Eseguire eventualmente il processo di inizializzazione del driver ("post driver init").
Aggiungi Dispositivo WDF Ambito dispositivo.
- Chiamare ACX per inizializzare il contesto di inizializzazione del dispositivo.
- Creare un dispositivo.
- Chiama ACX per eseguire qualsiasi operazione post-inizializzazione del dispositivo.
- Facoltativamente, eseguire qualsiasi operazione successiva all'inizializzazione del dispositivo.
WDF PrepareHardware. Ambito del dispositivo.
- Creare e inizializzare le risorse hardware (per interruzioni e thread, e registrare le risorse con ACX).
Callback all'ingresso dello stato D0 del dispositivo WDF. Ambito dispositivo.
Le code WDF vengono riavviate.
WDF DeviceSelfManagedIoInit. Ambito dispositivo.
Dispositivo WDFSelfManagedIoRestart. Ambito del dispositivo.
- Inizializzazione dopo ogni accensione da Dx.
Creazione dinamica del circuito (in qualsiasi momento)
- Il driver alloca una struttura di WDFDEVICE_INIT chiamando WdfPdoInitAllocate. Il driver è responsabile di invocare WdfDeviceInitFree in caso si verifichino errori prima di creare con successo un dispositivo.
- Il driver specifica i callback PnP/power che desidera ricevere.
- Il driver crea un dispositivo.
- Il driver crea un'istanza del nuovo dispositivo/circuito chiamando AcxDeviceAddCircuitDevice.
- WDF/PnP assume il controllo e viene eseguito il semplice modello di enumerazione/avvio descritto nella sezione precedente.
AcxFactoryCircuit
Un driver ACX può anche creare oggetti AcxFactoryCircuit (provider di circuiti) durante la sequenza di accensione utilizzando le funzioni AcxFactoryCircuitCreate e AcxDeviceAddFactoryCircuit.
Poiché il driver ACX si è registrato con ACX come fabbrica di circuiti, il framework ACX utilizza la fabbrica registrata per chiedere al driver di creare un nuovo circuito.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
Ribilanciamento del dispositivo ACX
Il ribilanciamento viene eseguito quando l'utilizzo delle risorse di sistema richiede al sistema operativo di ribilanciare le risorse tra i dispositivi. Per informazioni generali sul ribilanciamento, vedere Implementare il ribilanciamento PnP per i driver audio PortCls.
ACX supporta il ribilanciamento del dispositivo come indicato di seguito:
Nella sequenza WDF/ACX di risparmio energia, il driver rilascia tutte le risorse di streaming (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), le risorse del circuito (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) e le risorse del dispositivo (EvtDeviceReleaseHardware).
Tutte le richieste vengono sospese e le maniglie vengono lasciate aperte.
Nella sequenza di alimentazione WDF/ACX, il driver verifica che le nuove risorse siano compatibili con quelle correnti e apporta eventuali modifiche consentite alle relative impostazioni. Se le risorse non sono compatibili con l'inizializzazione corrente del dispositivo/circuito, il driver deve eliminare i circuiti correnti e crearne di nuovi. Vedere di seguito altre informazioni.
Nella sequenza di risparmio energia WDF richiama il proprio EvtDevicePrepareHardware e EvtDeviceD0 voce e ACX richiama il corrispondente EvtAcxCircuitPrepareHardware e EvtAcxCircuitPowerUp e sposta tutti i flussi negli stati preesistenti.
Non appena le code passano allo stato di accensione/esecuzione, il flusso di I/O viene nuovamente eseguito.
ACX non consente la rimozione (non riesce a rimuovere query) o il ribilanciamento (non riesce a eseguire query-stop) se sono presenti flussi in stato attivo (RUN).
I driver possono anche scegliere di distruggere i dispositivi audio per poi ricrearli ad ogni riequilibrio. Questo è lo stesso scenario precedente quando il dispositivo rileva che le nuove impostazioni non sono compatibili con quelle precedenti. L'eliminazione del circuito deve essere eseguita in EvtDevicePrepareHardware/EvtDeviceReleaseHardware callback e il nuovo circuito viene ricreato in EvtDevicePrepareHardware. Il driver elimina un circuito annullando la registrazione del circuito (usando AcxDeviceRemoveCircuit). I circuiti di fabbrica normalmente non devono essere rimossi durante il ribilanciamento.
Handle di file in modalità utente
ACX non attende che gli handle di file in modalità utente vengano chiusi prima di creare nuovamente nuovi circuiti. La durata degli handle del sistema di file non è legata alla durata delle risorse hardware usate dal dispositivo o dai circuiti. È responsabilità dei client monitorare l'arrivo e la rimozione delle interfacce e chiudere e riaprire gli handle di file.
Gli handle di file precedenti sono contrassegnati come obsoleti e ACX ha esito negativo per tutte le richieste di I/O associate.
Vedere anche
Panoramica delle estensioni della classe audio ACX