EVT_ACX_STREAM_PREPARE_HARDWARE Rückruffunktion (acxstreams.h)
Das EvtAcxStreamPrepareHardware-Ereignis weist den Treiber an, die Hardware für das Streaming vorzubereiten.
Syntax
EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;
NTSTATUS EvtAcxStreamPrepareHardware(
ACXSTREAM Stream
)
{...}
Parameter
Stream
Ein ACXSTREAM-Objekt stellt einen audiostream dar, der von einer Verbindung erstellt wird. Der Stream besteht aus einer Liste von Elementen, die basierend auf den Elementen der übergeordneten Leitung erstellt wurden. Weitere Informationen finden Sie unter ACX – Zusammenfassung von ACX-Objekten.
Rückgabewert
Gibt zurück STATUS_SUCCESS
, wenn der Aufruf erfolgreich war. Andernfalls wird ein entsprechender Fehlercode zurückgegeben. Weitere Informationen finden Sie unter Verwenden von NTSTATUS-Werten.
Hinweise
Ein AcxStream unterstützt verschiedene Zustände. Diese Zustände geben an, wann Audio fließt (RUN-Zustand), Audio nicht fließt, aber die Audiohardware vorbereitet ist (PAUSE-Zustand), oder Audio fließt nicht und die Audiohardware ist nicht vorbereitet (STOP-Zustand).
Das EvtAcxStreamPrepareHardware-Ereignis wechselt den Streamzustand vom Status Beenden in den Zustand Anhalten. Der Treiber sollte alle Hardwareressourcen zuordnen, die für das Streaming in diesem Ereignis benötigt werden, z. B. DMA-Engines.
Sobald sich der Stream im Zustand Pause befindet, empfängt der Treiber möglicherweise das EvtAcxStreamRun-Ereignis , um in den Ausführungszustand zu wechseln, oder der Treiber empfängt das EvtAcxStreamReleaseHardware-Ereignis , um in den Status Stop zu wechseln.
ACX-Ereignisse entsprechen KS-Zuständen, wie in dieser Tabelle beschrieben.
Startzustand | Endzustand | ACX-Treiberereignis namens | Hinweise |
---|---|---|---|
STOP | ERWERBEN | VorbereitenHardware | Der Treiber führt Hardwarezuordnungen und Vorbereitungen aus. |
ERWERBEN | PAUSE | (Kein Anruf) | |
PAUSE | AUSFÜHREN | Ausführen | |
AUSFÜHREN | PAUSE | Anhalten | |
PAUSE | ERWERBEN | (Kein Anruf) | |
ERWERBEN | STOP | ReleaseHardware | Treiber gibt Hardwarezuordnungen frei |
EvtAcxStreamAllocateRtPackets wird vor EvtAcxStreamPrepareHardware aufgerufen, um die RT-Paketzuordnung vor EvtAcxStreamPrepareHardware zuzulassen.
Pufferzuordnungen und DMA
Bei der Pufferzuordnung wird in der Regel nur der Systemspeicher so zugewiesen, dass er mit der DMA-Hardware verwendet werden kann. In der Regel hat die Pufferzuweisung keine Auswirkungen auf die Streaminghardware. Die Vorbereitungsphase der Hardware wird verwendet, wenn der Treiber den Stream zur Ausführung bereit macht, indem Aufgaben wie das Reservieren von Bandbreite, das Programmieren von DMA und die Vorbereitung für die Anforderung zum Ausführen des Datenstroms abgeschlossen werden. In der Regel verwendet der Hardwarevorbereitungscode die zugewiesenen Puffer, um den DMA und die zugehörigen Aktivitäten vorzubereiten, damit der Stream gestartet werden kann.
Speicherbereinigung
Die Paketzuordnungen (physischer Arbeitsspeicher auf dem System) erfolgen vor der EvtAcxStreamPrepareHardware, und ihre Freigabe (EvtAcxStreamFreeRtPackets) erfolgt nach EvtAcxStreamReleaseHardware. Dieses Muster ist ein vorhandenes Legacyverhalten, das in den Setupflow der oberen Ebenen des Audiostreams eingebettet ist (ks pufferprop init zuordnen).
Die Entsorgung der Ressourcen des Streams kann in der Streamkontextbereinigung des Treibers erfolgen (nicht zerstören). Setzen Sie niemals die Entsorgung von etwas, das im Kontext eines Objekts freigegeben ist, rückruflöschen. Diese Anleitung gilt für alle ACX-Objekte.
Der Rückruf zur Zerstörung wird aufgerufen, nachdem die letzte Ref nicht mehr vorhanden ist.
Der Rückruf zum Bereinigen des Datenstroms wird aufgerufen, wenn das Handle geschlossen wird. Eine Ausnahme ist, wenn der Treiber den Stream in seinem Rückruf erstellt hat. Wenn ACX diesen Stream seiner Streambrücke nicht hinzufügen konnte, bevor er vom Vorgang zum Erstellen von Datenstrom zurückgegeben wird, wird der Stream asynchron abgebrochen, und der aktuelle Thread gibt einen Fehler an den create-stream-Client zurück. Für den Stream sollten zu diesem Zeitpunkt keine Mem-Zuordnungen zugewiesen sein.
Beispiel
Die Verwendungsbeispiele finden Sie unten.
ACX_STREAM_CALLBACKS streamCallbacks;
ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
streamCallbacks.EvtAcxStreamPrepareHardware = Codec_EvtStreamPrepareHardware;
...
status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
_In_ ACXSTREAM Stream
)
{
PSTREAM_CONTEXT ctx;
NTSTATUS status;
PAGED_CODE();
ctx = GetStreamContext(Stream);
status = AllocateStreamHardware(Stream);
if (NT_SUCCESS(status))
{
ctx->StreamState = AcxStreamStatePause;
}
return status;
}
ACX-Anforderungen
AcX-Mindestversion: 1.0
Weitere Informationen zu ACX-Versionen finden Sie unter ACX-Versionsübersicht.
Anforderungen
Anforderung | Wert |
---|---|
Header | acxstreams.h |
IRQL | PASSIVE_LEVEL |