Partager via


EVT_ACX_STREAM_PREPARE_HARDWARE fonction de rappel (acxstreams.h)

L’événement EvtAcxStreamPrepareHardware indique au pilote de préparer le matériel pour la diffusion en continu.

Syntaxe

EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;

NTSTATUS EvtAcxStreamPrepareHardware(
  ACXSTREAM Stream
)
{...}

Paramètres

Stream

Un objet ACXSTREAM représente un flux audio créé par un circuit. Le flux est composé d’une liste d’éléments créés en fonction des éléments du circuit parent. Pour plus d’informations, consultez ACX - Résumé des objets ACX.

Valeur retournée

Retourne STATUS_SUCCESS si l’appel a réussi. Sinon, il retourne un code d’erreur approprié. Pour plus d’informations, consultez Utilisation de valeurs NTSTATUS.

Remarques

Un AcxStream prend en charge différents états. Ces états indiquent quand l’audio circule (état RUN), que l’audio ne circule pas mais que le matériel audio est préparé (état PAUSE), ou que l’audio ne circule pas et que le matériel audio n’est pas préparé (état STOP).

L’événement EvtAcxStreamPrepareHardware fait passer l’état de flux de l’état Arrêter à l’état Pause. Le pilote doit allouer toutes les ressources matérielles nécessaires à la diffusion en continu dans cet événement, comme les moteurs DMA.

Une fois que le flux est à l’état Pause, le pilote peut recevoir l’événement EvtAcxStreamRun pour passer à l’état Exécuter ou le pilote peut recevoir l’événement EvtAcxStreamReleaseHardware pour passer à l’état Stop.

Les événements ACX sont analogues aux états KS, comme décrit dans ce tableau.

État de début État final Événement du pilote ACX appelé Notes
STOP ACQUÉRIR PrepareHardware Le pilote effectue des allocations et des préparations matérielles
ACQUÉRIR PAUSE (Aucun appel)
PAUSE EXÉCUTER Exécuter
EXÉCUTER PAUSE Suspendre
PAUSE ACQUÉRIR (Aucun appel)
ACQUÉRIR STOP ReleaseHardware Le pilote libère les allocations matérielles

EvtAcxStreamAllocateRtPackets est appelé avant EvtAcxStreamPrepareHardware pour permettre à l’allocation de paquets RT de se produire avant EvtAcxStreamPrepareHardware.

Allocations de mémoire tampon et DMA

L’allocation de mémoire tampon implique généralement uniquement l’allocation de la mémoire système de telle sorte qu’elle puisse être utilisée avec le matériel DMA. En règle générale, l’allocation de mémoire tampon n’aura aucun effet sur le matériel de streaming. La phase de préparation du matériel est utilisée lorsque le pilote prépare l’exécution du flux, en effectuant des tâches telles que la réservation de bande passante, la programmation DMA et la préparation de la demande d’exécution du flux. En règle générale, le code matériel de préparation utilise les mémoires tampons allouées pour préparer la DMA et les activités associées afin d’être prêt à démarrer le flux.

Nettoyage de la mémoire

Les allocations de paquets (mémoire physique sur le système) sont effectuées avant EvtAcxStreamPrepareHardware, et leur publication (EvtAcxStreamFreeRtPackets) est effectuée après EvtAcxStreamReleaseHardware. Ce modèle est un comportement hérité existant qui est incorporé dans le flux de configuration de flux audio des couches supérieures (ks allouer la propriété de la mémoire tampon).

La suppression des ressources du flux peut être effectuée dans le cadre du nettoyage du contexte de flux du pilote (et non de la destruction). Ne mettez jamais la disposition de tout ce qui est partagé dans le contexte d’un objet détruire le rappel. Ces instructions s’appliquent à tous les objets ACX.

Le rappel de destruction est appelé une fois que la dernière référence a disparu, lorsqu’elle est inconnue.

Le rappel de nettoyage du flux est appelé lorsque le handle est fermé. Une exception à cela est lorsque le pilote a créé le flux dans son rappel. Si ACX n’a pas pu ajouter ce flux à son pont de flux juste avant de revenir de l’opération de création de flux, le flux est annulé de manière asynchrone et le thread actuel retourne une erreur au client create-stream. Aucune allocation mem ne doit être allouée au flux à ce stade.

Exemple

L’exemple d’utilisation est illustré ci-dessous.

    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;
}

Configuration requise d’ACX

Version minimale d’ACX : 1.0

Pour plus d’informations sur les versions d’ACX, consultez Vue d’ensemble des versions d’ACX.

Configuration requise

Condition requise Valeur
En-tête acxstreams.h
IRQL PASSIVE_LEVEL

Voir aussi