Condividi tramite


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

Vedi anche