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 de retour
Retourne STATUS_SUCCESS
si l’appel a réussi. Sinon, elle retourne un code d’erreur approprié. Pour plus d’informations, consultez Using NTSTATUS Values.
Remarques
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 n’est pas transmis et que le matériel audio n’est pas préparé (état STOP).
L’événement EvtAcxStreamPrepareHardware va passer de l’état Stop à l’état Pause. Le pilote doit allouer toutes les ressources matérielles nécessaires à la diffusion en continu dans cet événement, telles que les moteurs DMA.
Une fois que le flux est dans l’état pause, le pilote peut recevoir l’événement EvtAcxStreamRun pour passer à l’état d’exécution ou le pilote peut recevoir le EvtAcxStreamReleaseHardware événement 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 |
---|---|---|---|
ARRÊTER | ACQUÉRIR | PrepareHardware | Le pilote effectue des allocations et des préparations matérielles |
ACQUÉRIR | PAUSE | (Aucun appel) | |
PAUSE | COURIR | Courir | |
COURIR | PAUSE | Pause | |
PAUSE | ACQUÉRIR | (Aucun appel) | |
ACQUÉRIR | ARRÊTER | ReleaseHardware | Le pilote libère des allocations matérielles |
EvtAcxStreamAllocateRtPackets est appelée avant EvtAcxStreamPrepareHardware pour autoriser l’allocation de paquets RT à se produire avant EvtAcxStreamPrepareHardware.
Allocations de mémoires tampons et DMA
L’allocation de mémoire tampon implique généralement uniquement l’allocation de 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 diffusion en continu. La phase de préparation matérielle est utilisée comme pilote pour préparer 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 pour exécuter le flux. En règle générale, le code de préparation du matériel utilisera les mémoires tampons allouées pour préparer la DMA et les activités associées pour être prêtes à 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 version (EvtAcxStreamFreeRtPackets) est effectuée après EvtAcxStreamReleaseHardware. Ce modèle est un comportement hérité existant qui est incorporé dans le flux de configuration du flux audio des couches supérieures (ks alloue l’init de propriété de mémoire tampon).
L’élimination des ressources du flux peut être effectuée dans le nettoyage du contexte de flux du pilote (pas détruire). Ne mettez jamais à disposition tout ce qui est partagé dans le contexte d’un objet détruit le rappel. Cette aide s’applique à tous les objets ACX.
Le rappel de destruction est appelé après la dernière référence, lorsqu’il est inconnu.
Le rappel de nettoyage du flux est appelé lorsque le handle est fermé. L’une des exceptions est que 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 retourner à partir de l’opération de création de flux, le flux est annulé asynchrone et le thread actuel retourne une erreur au client create-stream. Le flux ne doit pas avoir d’allocations mem allouées à 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 pour ACX
version minimale d’ACX : 1.0
Pour plus d’informations sur les versions ACX, consultez vue d’ensemble de la version ACX.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | acxstreams.h |
IRQL | PASSIVE_LEVEL |