ACX-Schaltkreise
In diesem Thema werden ACX-Schaltkreise erläutert. Eine allgemeine Übersicht über ACX und eine Liste mit ACX-Begriffen finden Sie unter Übersicht über ACX-Audioklassenerweiterungen.
Wie in der Zusammenfassung von ACX-Objekten beschrieben, stellt ein AcxCircuit-Objekt einen teilweisen oder vollständigen Audiopfad zu einem vom Benutzer wahrgenommenen Audiogerät (Lautsprecher, Mikrofon usw.) dar. Ein AcxCircuit verfügt über mindestens einen Eingabe-Pin und einen Ausgabe-Pin (ACXPIN), und er kann ein oder mehrere AcxElements-ähnliche Objekte aggregieren. Der Schaltkreis stellt einen vorhandenen Endpunkt und seine Funktionen dar.
Und ACX-Datenstrom ist eine Treiberkomponente, die einen Audiodatenstrom darstellt, der von einem Schaltkreis erstellt wird. Der Datenstrom besteht aus einer Liste von Elementen, die basierend auf den Elementen des übergeordneten Schaltkreises erstellt wurden. Ein Datenstromschaltkreis ist ein Schaltkreis in einer Multi-Stack-Architektur (partieller Audiopfad), der direkt mit dem oberen User-Mode-Streaming-Dienst verbunden ist. Ein Kernschaltkreis ist ein Schaltkreis in einer Multi-Stack-Architektur (partieller Audiopfad), der die Identität des Audioendpunktgeräts angibt.
ACX-Schaltkreisidentifikation
Jeder ACX-Schaltkreis verfügt über einen Schaltkreisbezeichner. ACX definiert Folgendes:
Name (str) identifiziert diesen Schaltkreis-Audiogerätetyp eindeutig. Es wird zum Ermitteln der INF-Einstellung verwendet und ist Teil der symbolischen Verbindung, die für den Zugriff auf diesen Schaltkreis von einem Remotegerät verwendet wird. Beispiel: Render0, Render1 oder Capture0.
Symbolische Verbindung. Eine symbolische Verbindung ist allen verfügbaren Schaltkreisen zugeordnet. Clients verwenden diese symbolische Verbindung, um einen Kommunikationspfad mit dem Gerät/Schaltkreis zu öffnen.
Komponenten-ID (GUID) des Schaltkreises. Identifiziert die Schaltkreisinstanz eindeutig (anbieterspezifisch). Sie kann nicht in den AcxCircuitTemplate-Bindungen verwendet werden, wenn der Circuit-URI angegeben wurde.
Komponenten-URI des Schaltkreises (str). Identifiziert die Schaltkreisinstanz eindeutig (anbieterspezifisch). Sie kann nicht in den AcxCircuitTemplate-Bindungen verwendet werden, wenn die Circuit-ID angegeben wurde.
Komponenten-ID (guid) der Schaltkreis-Factory. Identifiziert die Instanz der Schaltkreis-Factory eindeutig (anbieterspezifisch). Sie kann nicht in den AcxCircuitTemplate-Bindungen verwendet werden, wenn der URI der Schaltkreis-Factory angegeben wurde.
Komponenten-URI (str) der Schaltkreis-Factory. Identifiziert die Instanz der Schaltkreis-Factory eindeutig (anbieterspezifisch). Sie kann nicht in den AcxCircuitTemplate-Bindungen verwendet werden, wenn die ID der Schaltkreis-Factory angegeben wurde.
AcxCircuitCreate
Die AcxCircuitCreate-Funktion wird verwendet, um einen ACXCIRCUIT zu erstellen. Eine nicht transparente ACXCIRCUIT_INIT-Struktur, die von der AcxCircuitCreate-Funktion verwendet wird. AcxCircuitInitAllocate wird verwendet, um die ACXCIRCUIT_INIT-Struktur zu initialisieren.
AcxFactoryCircuit
Ein ACX-Treiber kann auch AcxFactoryCircuit-Objekte (Schaltkreisanbieter) während des Hochfahrens mithilfe der AcxFactoryCircuitCreate-Funktion und der AcxDeviceAddFactoryCircuit-Funktion erstellen.
ACX-Schaltkreisanordnung
ACX bündelt Verbindungen, bis sie einen vollständigen Audiopfad bilden. ACX verwendet Audiobindungen, um Audioschaltungen miteinander zu verbinden. Weitere Informationen finden Sie unter Anordnung aus mehreren ACX-Schaltkreisen.
Dynamische Erstellung des ACX-Schaltkreises (jederzeit)
ACX kann bei Bedarf eine dynamische Verbindung erstellen. Dazu weist der Treiber eine WDFDEVICE_INIT-Struktur zu, indem WdfPdoInitAllocate aufgerufen wird. Der Treiber gibt dann alle PnP-/Energierückrufe an, die er empfangen möchte, und erstellt das Gerät. Der Treiber instanziiert das neue Gerät/den neuen Schaltkreis durch Aufrufen von AcxDeviceAddCircuitDevice. Weitere Informationen finden Sie unter ACX-Geräteenumeration.
Dynamische Entfernung des ACX-Schaltkreises
Der Treiber ruft AcxDeviceRemoveCircuitDevice auf, um das Audiogerät aus der Geräteliste zu entfernen. Dadurch wird die Sequenz zum Herunterfahren auf dem ACX-Schaltkreisgerät/der Schaltkreisentität ausgelöst. Das Schaltkreisgerät/der Schaltkreis wird asynchron gelöscht. Weitere Informationen finden Sie unter ACX-Geräteenumeration.
AcxDeviceRemoveCircuit und AcxDeviceDetachCircuit
Es gibt zwei gängige Methoden zum Verwalten der Schaltkreisendung. AcxDeviceDetachCircuit oder AcxDeviceRemoveCircuit.
Wenn der Aufrufer den AcxDeviceDetachCircuit aufruft, darf AcxDeviceRemoveCircuit nicht aufgerufen werden. Wenn der aufrufende Treiber den Schaltkreis nach AcxDeviceDetachCircuit löschen möchte, muss er WdfObjectDelete verwenden.
Durch Aufrufen von AcxDeviceRemoveCircuit teilt der aufrufende Treiber ACX mit, diesen Schaltkreis vom Gerät zu entfernen/löschen. In diesem Fall ist es nicht erforderlich, WdfObjectDelete auf dem Schaltkreis aufzurufen.
Zusammenfassend bedeutet AcxDeviceDetachCircuit, dass der Treiber die Verwaltung der Schaltkreislebensdauer besitzt, AcxDeviceRemoveCircuit bedeutet, dass der Schaltkreis entfernt und gelöscht wird.
Allgemeine Informationen zur Verwaltung der WDF-Objektlebensdauer finden Sie unter Framework-Objektlebenszyklus.
AcxDeviceRemoveCircuitDevice
Abgesehen von der oben beschriebenen Schaltkreisendung wird AcxDeviceRemoveCircuitDevice vom Audiotreiber verwendet, um einen vorhandenen Audioendpunkt zu entfernen und kann während des Treiberlebenszyklus jederzeit aufgerufen werden.
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).
EvtAcxCircuitReleaseHardware (EVT_ACX_CIRCUIT_RELEASE_HARDWARE)-Rückruffunktion
Wenn ein Treiber eine EvtAcxCircuitReleaseHardware-Rückruffunktion registriert hat, ruft es das Framework während der folgenden Übergänge auf:
- Ressourcenausgleich
- Geordnetes Entfernen
- Überraschendes Entfernen
Das ACX-Framework ruft die EvtAcxCircuitReleaseHardware-Rückruffunktion auf, nachdem das WDF-Framework das Senden von E/A-Anforderungen an das Gerät beendet hat, alle dem Gerät zugewiesenen Unterbrechungen deaktiviert und getrennt und das Gerät selbst deaktiviert wurde.
Das ACX-Framework ruft die EvtAcxCircuitReleaseHardware-Rückruffunktion auf, bevor das WDF-Framework die EvtDeviceReleaseHardware-Rückruffunktion des Treibers aufruft.
Wenn das Framework EvtAcxCircuitReleaseHardware aufruft, ist der PDO für das Gerät noch vorhanden und kann nach Geräteinformationen abgefragt werden, die im ausgeschalteten Zustand verfügbar sind, z. B. PCI-Konfigurationszustand.
Darüber hinaus werden die übersetzten Hardwareressourcen, die das Framework für EvtDeviceReleaseHardware bereitstellt, weiterhin dem Gerät zugewiesen. Der Hauptzweck dieser Rückruffunktion besteht darin, diese Ressourcen freizugeben, und insbesondere die Zuordnung von Speicherressourcen, die der EvtAcxCircuitPrepareHardware-Rückruffunktion des Treibers zugeordnet ist. Der Treiber kann diesen Rückruf auch verwenden, um alle anderen ACXCIRCUIT-Verwaltungsaktivitäten auszuführen, die möglicherweise im heruntergeschalteten Zustand erforderlich sind. In der Regel sollten alle anderen Hardware-Herunterfahrvorgänge in der EvtDeviceD0Exit-Rückruffunktion des Treibers ausgeführt werden.
Das ACX-Framework ruft immer die EvtAcxCircuitReleaseHardware-Rückruffunktion des Treibers auf, wenn die EvtAcxCircuitPrepareHardware-Rückruffunktion des Treibers aufgerufen wurde, es sei denn, die EvtAcxCircuitPrepareHardware hat einen Fehlercode zurückgegeben.
Weitere Informationen zu Hardwareressourcen finden Sie in der Einführung in Hardwareressourcen.
EvtAcxFactoryCircuitReleaseHardware (EVT_ACX_FACTORY_CIRCUIT_RELEASE_HARDWARE)-Rückruffunktion
Wenn das Framework EvtAcxCircuitReleaseHardware aufruft, ist der PDO für das Gerät noch vorhanden und kann nach Geräteinformationen abgefragt werden, die im ausgeschalteten Zustand verfügbar sind, z. B. PCI-Konfigurationszustand.
Darüber hinaus werden die übersetzten Hardwareressourcen, die das Framework für EvtDeviceReleaseHardware bereitstellt, weiterhin dem Gerät zugewiesen. Der Hauptzweck dieser Rückruffunktion besteht darin, diese Ressourcen freizugeben, und insbesondere die Zuordnung von Speicherressourcen, die der EvtAcxCircuitPrepareHardware-Rückruffunktion des Treibers zugeordnet ist. Der Treiber kann diesen Rückruf auch verwenden, um alle anderen ACXCIRCUIT-Verwaltungsaktivitäten auszuführen, die möglicherweise im heruntergeschalteten Zustand erforderlich sind. In der Regel sollten alle anderen Hardware-Herunterfahrvorgänge in der EvtDeviceD0Exit-Rückruffunktion des Treibers ausgeführt werden.
Das ACX-Framework ruft immer die EvtAcxFactoryCircuitReleaseHardware-Rückruffunktion des Treibers auf, wenn die EvtAcxFactoryCircuitPrepareHardware-Rückruffunktion des Treibers aufgerufen wurde, es sei denn, die EvtAcxFactoryCircuitPrepareHardware hat einen Fehlercode zurückgegeben.
Weitere Informationen zum Verwalten von WDF- und Verbindungsobjekten finden Sie unter ACX WDF Driver Lifetime Management.
Weitere Informationen
Übersicht über ACX-Audioklassenerweiterungen
Treiberübergreifende ACX Multi-Stack-Kommunikationen