Condividi tramite


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 è:

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

documentazione di riferimento di ACX

Sequenze di callback PnP e gestione dell'energia