EVT_ACX_STREAM_PREPARE_HARDWARE funzione di callback (acxstreams.h)
L'evento EvtAcxStreamPrepareHardware indica al driver di preparare l'hardware per lo streaming.
Sintassi
EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;
NTSTATUS EvtAcxStreamPrepareHardware(
ACXSTREAM Stream
)
{...}
Parametri
Stream
Un oggetto ACXSTREAM rappresenta un flusso audio creato da un circuito. Il flusso è costituito da un elenco di elementi creati in base agli elementi del circuito padre. Per altre informazioni, vedere ACX - Riepilogo degli oggetti ACX.
Valore restituito
Restituisce STATUS_SUCCESS
se la chiamata ha avuto esito positivo. In caso contrario, restituisce un codice di errore appropriato. Per altre informazioni, vedere Uso dei valori NTSTATUS.
Commenti
AcxStream supporta diversi stati. Questi stati indicano quando l'audio scorre (stato RUN), l'audio non scorre ma l'hardware audio è preparato (stato PAUSE) o l'audio non scorre e l'hardware audio non è preparato (stato STOP).
L'evento EvtAcxStreamPrepareHardware passerà lo stato del flusso dallo stato Stop allo stato Pause. Il driver deve allocare tutte le risorse hardware necessarie per lo streaming in questo evento, ad esempio motori DMA.
Una volta che il flusso si trova nello stato Pause, il driver può ricevere l'evento EvtAcxStreamRun per passare allo stato Run o il driver può ricevere l'evento EvtAcxStreamReleaseHardware per passare allo stato Stop.
Gli eventi ACX sono simili agli stati KS, come descritto in questa tabella.
Stato iniziale | Stato finale | Evento ACX Driver denominato | Note |
---|---|---|---|
STOP | ACQUISIRE | PrepareHardware | Il driver esegue allocazioni e preparazione hardware |
ACQUISIRE | PAUSE | (Nessuna chiamata) | |
PAUSE | ESEGUI | Esegui | |
ESEGUI | PAUSE | Sospendi | |
PAUSE | ACQUISIRE | (Nessuna chiamata) | |
ACQUISIRE | STOP | ReleaseHardware | I driver rilasciano allocazioni hardware |
EvtAcxStreamAllocateRtPackets viene chiamato prima di EvtAcxStreamPrepareHardware per consentire l'allocazione dei pacchetti RT prima di EvtAcxStreamPrepareHardware.
Allocazioni di buffer e DMA
L'allocazione del buffer comporta in genere l'allocazione della memoria di sistema in modo che possa essere usata con l'hardware DMA. In genere, l'allocazione del buffer non avrà alcun effetto sull'hardware di streaming. La fase di preparazione dell'hardware viene usata come driver per l'esecuzione del flusso, completando attività come la prenotazione della larghezza di banda, la programmazione DMA e il completamento della preparazione della richiesta per l'esecuzione del flusso. In genere, il codice hardware di preparazione userà i buffer allocati per preparare la DMA e le attività correlate per essere pronti per avviare il flusso.
Pulizia della memoria
Le allocazioni dei pacchetti (memoria fisica nel sistema) vengono eseguite prima che evtAcxStreamPrepareHardware e la relativa versione (EvtAcxStreamFreeRtPackets) venga eseguita dopo EvtAcxStreamReleaseHardware. Questo modello è un comportamento legacy esistente incorporato nel flusso di installazione del flusso audio dei livelli superiore (ks allocare il prop buffer init).
Lo smaltimento delle risorse del flusso può essere eseguito nella pulizia del contesto di flusso del driver (non eliminare). Non inserire mai lo smaltimento di qualsiasi elemento condiviso nel contesto di un oggetto eliminano il callback. Questa guida si applica a tutti gli oggetti ACX.
Il callback di eliminazione viene richiamato dopo che l'ultimo riferimento è andato, quando è sconosciuto.
Il callback di pulizia del flusso viene chiamato quando l'handle viene chiuso. Un'eccezione è quando il driver ha creato il flusso nel callback. Se ACX non è riuscito a aggiungere questo flusso al relativo bridge di flusso appena prima di tornare dall'operazione di creazione di flusso, il flusso viene annullato asincrono e il thread corrente restituisce un errore al client di flusso di creazione. Il flusso non deve avere allocazioni di mem allocati a questo punto.
Esempio
Di seguito è riportato l'esempio di utilizzo.
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;
}
Requisiti ACX
Versione minima DI ACX: 1.0
Per altre informazioni sulle versioni ACX, vedere Panoramica della versione di ACX.
Requisiti
Requisito | Valore |
---|---|
Intestazione | acxstreams.h |
IRQL | PASSIVE_LEVEL |