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 di valori NTSTATUS.
Osservazioni
AcxStream supporta stati diversi. 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 eseguirà la transizione dello 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.
Quando il flusso è nello stato Pause, il driver potrebbe ricevere l'evento evtAcxStreamRun per passare allo stato Run oppure il driver potrebbe ricevere l'evento EvtAcxStreamReleaseHardware per la transizione allo stato Stop.
Gli eventi ACX sono analoghi agli stati KS descritti in questa tabella.
Stato iniziale | Stato finale | Evento del driver ACX denominato | Note |
---|---|---|---|
FERMARSI | ACQUISTARE | PrepareHardware | Il driver esegue allocazioni e preparativi hardware |
ACQUISTARE | PAUSA | (Nessuna chiamata) | |
PAUSA | CORRERE | Correre | |
CORRERE | PAUSA | Pausa | |
PAUSA | ACQUISTARE | (Nessuna chiamata) | |
ACQUISTARE | FERMARSI | ReleaseHardware | Il driver rilascia le allocazioni hardware |
EvtAcxStreamAllocateRtPackets viene chiamato prima che EvtAcxStreamPrepareHardware consenta l'allocazione di pacchetti RT prima di EvtAcxStreamPrepareHardware.
Allocazioni di buffer e DMA
L'allocazione del buffer comporta in genere solo 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 preparare l'esecuzione del flusso, completando attività come la prenotazione della larghezza di banda, la programmazione DMA e il completamento della preparazione per l'esecuzione del flusso da parte della richiesta. In genere, il codice hardware di preparazione userà i buffer allocati per preparare DMA e le attività correlate per essere pronti per avviare il flusso.
Pulizia della memoria
Le allocazioni di 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 alloca prop buffer init).
L'eliminazione delle risorse del flusso può essere eseguita nella pulizia del contesto del flusso del driver (non distruggere). Non inserire mai l'eliminazione di qualsiasi elemento condiviso nel contesto di un oggetto distrugga il callback. Queste linee guida si applicano 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 ad aggiungere questo flusso al bridge di flusso appena prima di tornare dall'operazione di creazione del flusso, il flusso viene annullato asincrono e il thread corrente restituisce un errore al client create-stream. Il flusso non deve avere allocazioni mem allocate a questo punto.
Esempio
Di seguito è riportato un 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 di ACX, vedere panoramica della versione ACX.
Fabbisogno
Requisito | Valore |
---|---|
intestazione | acxstreams.h |
IRQL | PASSIVE_LEVEL |