ACX-Geräteenumeration
In diesem Thema werden ACX-Geräteenumerationen, die Vorgänge zum Starten und Herunterfahren sowie der Geräteausgleich erläutert. Eine allgemeine Übersicht über ACX finden Sie in der Übersicht über ACX-Audioklassenerweiterungen. Informationen zur ACX-Energieverwaltung und zu PnP finden Sie unter ACX-Energieverwaltung.
ACX-Geräteenumeration und Starten statischer Audiogeräte
Im folgenden Szenario wird das Starten von ACX beschrieben.
- Ein Audiogerät wird durch einen einzelnen Schaltkreis dargestellt.
- Die Lebensdauer von Audio-/Schaltkreisen ist an die PnP-Gerätelebensdauer gebunden.
- Ein einzelnes Gerät kann mehrere Schaltkreise für verschiedene Audiogeräte erstellen.
- KMDF-Kernelmodusumgebung.
Die Abfolge des Startvorgangs:
WDM DriverEntry. Treiberbereich. DriverEntry für WDF-Treiberroutine
- Initialisierungsablaufverfolgung.
- Optionale Registrierung für das Entladen.
- Erstellen von WDFDRIVER.
- Aufrufen von ACX auf, um alle Post-Treiberinitialisierungen durchzuführen.
- Optional können Sie eine Post-Treiberinitialisierung ausführen.
WDF DeviceAdd. Gerätebereich. EVT_WDF_DRIVER_DEVICE_ADD-Rückruffunktion
- Aufrufen von ACX zum Initieren des Gerätekontexts –
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT-Funktion - WDF-PnP Power-Rückrufe registrieren -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Erstellen eines Geräts mithilfe von AcxDeviceInitialize
- Aufrufen von ACX auf, um alle Post-Geräteinitialisierungen durchzuführen.
- Optional können Sie eine Post-Geräteinitialisierung ausführen.
- Aufrufen von ACX zum Initieren des Gerätekontexts –
WDF PrepareHardware. Gerätebereich. EVT_WDF_DEVICE_PREPARE_HARDWARE-Rückruffunktion.
Erstellen und Initiieren von Hardwareressourcen (Registrieren von Unterbrechungen und Threads bei ACX).
Erstellen Sie einen oder mehrere Schaltkreise (einmalige Erstellung).
- Erstellen Sie einen AcxCircuitInit-Kontext.
- Fügen Sie Rückrufe hinzu.
- Erstellen Sie einen AcxCircuit.
- Optional können Sie eine Post-Schaltkreisinitialisierung ausführen.
- Registrieren Sie den Schaltkreis mit AcxDeviceAddCircuitDevice.
WDF Device D0 Entry-Rückruf. Gerätebereich. EVT_WDF_DEVICE_D0_ENTRY-Rückruffunktion.
ACX ruft den EvtAcxCircuitPowerUp-Rückruf auf allen Schaltkreisen auf. Schaltkreisbereich.
ACX verschiebt die Datenströme (falls vorhanden) in den vorherigen Zustand, bevor das Gerät heruntergefahren wurde. Datenstrominstanz-Bereich.
WDF-Warteschlangen werden neu gestartet.
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT-Rückruffunktion. Gerätebereich.
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART-Rückruffunktion. Gerätebereich. - Init nach jedem Einschalten von Dx.
ACX Stream Add
- ACX Stream Add (Instanz) auf ACX Circuit (ACX-Callback auf ACX Circuits): wird jederzeit aufgerufen, nachdem die selbstverwaltete E/A-Init oder Neustart des WDF aufgerufen wurde und das Gerät sich in D0 befindet. Schaltkreisbereich.
- Input: AcxStreamInit context, ACXCIRCUIT.
- Fügen Sie Rückrufe hinzu.
- Erstellen Sie einen AcxStream (Instanz).
- Optional können Sie eine beliebige Post-Datenstrominitialisierung ausführen.
- Bei der Rückkehr aktiviert ACX diese Stream-Instanz, und da sie in diesem Szenario die einzige auf dem Audiopfad ist, lässt sie Datenstromnachrichten durchlaufen.
ACX-Geräteenumeration und Starten dynamischer Audiogeräte
In diesem Szenario wird Folgendes angenommen:
- Dynamische Audiounterstützung (Erstellen/Löschen von Audiogeräten zur Laufzeit).
- Die Lebensdauer des Geräts ist nicht an die Lebensdauer des Schaltkreises gebunden.
- Ein einzelnes Gerät kann mehrere Schaltkreise für verschiedene Audiogeräte erstellen.
- Piggybacking mit dem oben beschriebenen einfachen statischen Muster, indem nur Elemente hinzugefügt werden, die für das dynamische Muster spezifisch sind.
- Verwendet untergeordnete unformatierte PDOs.
- KMDF-Kernelmodusumgebung.
Die Abfolge des Startvorgangs für dieses Szenario:
WDM DriverEntry. Treiberbereich.
- Initialisierungsablaufverfolgung.
- Optionale Registrierung für das Entladen.
- Erstellen von WDFDRIVER.
- Aufrufen von ACX auf, um alle Post-Treiberinitialisierungen durchzuführen.
- Optional können Sie eine Post-Treiberinitialisierung ausführen.
WDF DeviceAdd. Gerätebereich.
- ACX wird aufgerufen, um den Init-Kontext des Geräts einzugeben.
- Gerät wird erstellt.
- Aufrufen von ACX auf, um alle Post-Geräteinitialisierungen durchzuführen.
- Optional können Sie eine Post-Geräteinitialisierung ausführen.
WDF PrepareHardware. Gerätebereich.
- Erstellen und Initiieren von Hardwareressourcen (Registrieren von Unterbrechungen und Threads bei ACX).
WDF Device D0 Entry-Rückruf. Gerätebereich.
WDF-Warteschlangen werden neu gestartet.
WDF DeviceSelfManagedIoInit. Gerätebereich.
WDF DeviceSelfManagedIoRestart. Gerätebereich.
- Init nach jedem Einschalten von Dx.
Dynamische Erstellung des Schaltkreises (jederzeit)
- Der Treiber weist eine WDFDEVICE_INIT-Struktur zu, indem WdfPdoInitAllocate aufgerufen wird. Der Treiber ist für das Aufrufen von WdfDeviceInitFree zuständig, wenn vor dem erfolgreichen Erstellen eines Geräts Fehler auftreten.
- Der Treiber gibt alle PnP/Stromrückrufe an, die empfangen werden sollen.
- Der Treiber erstellt ein Gerät.
- Der Treiber instanziiert das neue Gerät/den neuen Schaltkreis durch Aufrufen von AcxDeviceAddCircuitDevice.
- WDF/PnP übernimmt und es erfolgt das einfache Enumerations-/Startmuster, das im vorherigen Abschnitt beschrieben wurde.
AcxFactoryCircuit
Ein ACX-Treiber kann auch AcxFactoryCircuit-Objekte (Schaltkreisanbieter) während des Hochfahrens mithilfe der AcxFactoryCircuitCreate-Funktion und der AcxDeviceAddFactoryCircuit-Funktion erstellen.
Da sich der ACX-Treiber bei ACX als Schaltkreis-Factory registriert hat, verwendet das ACX-Framework die registrierte Factory, um den Treiber aufzufordern, einen neuen Schaltkreis zu erstellen.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
ACX-Gerät neu ausbalancieren
Die Neuverteilung erfolgt, wenn die Systemressourcennutzung erfordert, dass das Betriebssystem Ressourcen zwischen Geräten neu verteilt. Allgemeine Informationen zur Neuverteilung finden Sie unter Implementieren des PnP-Ausgleichs für PortCls-Audiotreiber.
ACX unterstützt die Geräteumverteilung wie folgt:
In der WDF/ACX-Sequenz zum Herunterfahren gibt der Treiber alle Streamingressourcen (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), Schaltkreisressourcen (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) und Geräteressourcen (EvtDeviceReleaseHardware) frei.
Alle Anfragen werden zurückgestellt, und die Handles bleiben offen.
In der WDF/ACX-Sequenz zum Hochfahren stellt der Treiber sicher, dass die neuen Ressourcen mit den aktuellen kompatibel sind, und es werden alle zulässigen Anpassungen an den Einstellungen vorgenommen. Wenn die Ressourcen nicht mit der aktuellen Geräte-/Schaltkreisinitialisierung kompatibel sind, muss der Treiber die aktuellen Schaltkreise löschen und neue erstellen. Weitere Informationen finden Sie weiter unten.
In der Hochfahrsequenz ruft WDF die Einträge EvtDevicePrepareHardware und EvtDeviceD0 auf, und ACX ruft dementsprechend EvtAcxCircuitPrepareHardware und EvtAcxCircuitPowerUp auf und verschiebt alle Datenströme in ihre bereits vorhandenen Zustände.
Sobald die Warteschlangen zum Einschalten/Ausführen wechseln, wird der E/A-Fluss erneut ausgeführt.
ACX lässt nicht zu, dass ein Entfernen (Abfrage-Entfernen schlägt fehl) oder ein Neuabgleich (Abfrage-Stoppen schlägt fehl) stattfindet, wenn sich die Datenströme im aktiven (RUN) Zustand befinden.
Treiber können sich auch dafür entscheiden, die Audiogeräte bei einem Ausgleich immer zu zerstören und neu zu erstellen. Dies ist das gleiche Szenario oben, wenn das Gerät erkennt, dass die neuen Einstellungen nicht mit den alten kompatibel sind. Die Löschung des Schaltkreises muss in EvtDevicePrepareHardware/EvtDeviceReleaseHardware-Rückrufen erfolgen, und der neue Schaltkreis wird in EvtDevicePrepareHardware neu erstellt. Der Treiber löscht einen Schaltkreis durch Aufheben der Registrierung des Schaltkreises (mit AcxDeviceRemoveCircuit).
Benutzermodus-Dateihandles
ACX wartet nicht, bis die Benutzermodus-Dateihandles geschlossen werden, bevor neue Schaltkreise neu erstellt werden. Die Lebensdauer der Dateisystemhandles ist nicht an die Lebensdauer der hardwarebasierten Ressourcen gebunden, die von den Geräten/Schaltkreisen verwendet werden. Es liegt in der Verantwortung der Kunden, auf den Empfang/die Entfernung von Schnittstellen zu lauschen und Dateihandles zu schließen und erneut zu öffnen.
Alte Dateihandles sind als veraltet gekennzeichnet, und für ACX schlagen alle ihnen zugeordneten E/A-Anforderungen fehl.