PALLOCATE_DMA_BUFFER fonction de rappel (hdaudio.h)

La AllocateDmaBuffer routine alloue une mémoire tampon de données dans la mémoire système pour un moteur DMA.

Le type de pointeur de fonction pour une AllocateDmaBuffer routine est défini comme suit.

Syntaxe

PALLOCATE_DMA_BUFFER PallocateDmaBuffer;

NTSTATUS PallocateDmaBuffer(
  [in]  PVOID _context,
  [in]  HANDLE Handle,
  [in]  SIZE_T RequestedBufferSize,
  [out] PMDL *BufferMdl,
  [out] PSIZE_T AllocatedBufferSize,
  [out] PUCHAR StreamId,
  [out] PULONG FifoSize
)
{...}

Paramètres

[in] _context

Spécifie la valeur de contexte des membres de contexte des structures HDAUDIO_BUS_INTERFACE et HDAUDIO_BUS_INTERFACE_V2 .

[in] Handle

Gérer l’identification du moteur DMA. Cette valeur de handle a été obtenue à partir d’un appel précédent à AllocateCaptureDmaEngine ou AllocateRenderDmaEngine.

[in] RequestedBufferSize

Spécifie la taille de mémoire tampon demandée en octets.

[out] BufferMdl

Récupère les pages de mémoire physique qui contiennent la mémoire tampon allouée. Ce paramètre pointe vers une variable PMDL allouée par l’appelant dans laquelle la routine écrit un pointeur dans une liste mdL (descripteur de mémoire) qui décrit la mémoire tampon.

[out] AllocatedBufferSize

Récupère la taille de mémoire tampon allouée en octets. Ce paramètre pointe vers une variable SIZE_T allouée par l’appelant dans laquelle la routine écrit la taille de la mémoire tampon allouée.

[out] StreamId

Récupère l’identificateur de flux. Ce paramètre pointe vers une variable UCHAR allouée par l’appelant dans laquelle la routine écrit l’identificateur de flux qu’elle attribue au flux.

[out] FifoSize

Récupère la taille FIFO du moteur DMA en octets. Ce paramètre pointe vers une variable ULONG allouée par l’appelant dans laquelle la routine écrit la taille FIFO.

Valeur de retour

AllocateDmaBuffer retourne STATUS_SUCCESS si l’appel réussit. Sinon, la routine retourne un code d’erreur approprié. Le tableau suivant présente certains des codes d’état de retour possibles.

Code de retour Description
STATUS_UNSUCCESSFUL
Indique que l’appelant est en cours d’exécution à un irQL trop élevé.
STATUS_INSUFFICIENT_RESOURCES
Indique que l’allocation de mémoire tampon a échoué.
STATUS_INVALID_HANDLE
Indique que la valeur du paramètre de handle n’est pas valide.
STATUS_INVALID_PARAMETER
Indique qu’une des valeurs de paramètre est incorrecte (pointeur incorrect).
STATUS_DEVICE_NOT_READY
Indique que la programmation matérielle a expiré. Si cela se produit, le matériel peut être dans un état compromis.
STATUS_INVALID_DEVICE_REQUEST
Indique que le flux n’est pas dans l’état de réinitialisation ou qu’une mémoire tampon est déjà allouée pour le moteur DMA.

Remarques

La AllocateDmaBuffer routine est utilisée conjointement avec la routine FreeDmaBuffer . Ces deux routines sont disponibles uniquement dans les HDAUDIO_BUS_INTERFACE et les versions HDAUDIO_BUS_INTERFACE_V2 de la DDI audio HD. Cette DDI n’inclut pas les routines AllocateContiguousDmaBuffer, SetupDmaEngineWithBdl et FreeContiguousDmaBuffer , qui ne sont jamais utilisées conjointement avec AllocateDmaBufferFreeDmaBuffer. Contrairement à SetupDmaEngineWithBdl, qui configure le moteur DMA pour qu’il utilise une mémoire tampon DMA précédemment allouée, AllocateDmaBuffer les deux allouent une mémoire tampon DMA et configurent le moteur DMA pour utiliser la mémoire tampon.

Si le moteur DMA ne peut pas utiliser une mémoire tampon de la taille demandée dans le paramètre requestedBufferSize, la routine alloue une mémoire tampon aussi proche que possible de la taille demandée.

Le pilote de fonction pour un codec audio ou modem est chargé de programmer le codec pour gérer les transferts de données et reconnaître l’identificateur de flux.

La routine génère un MDL qui répertorie les pages de mémoire physique qui contiennent la mémoire tampon. L’adresse de base de mémoire tampon coïncide avec le début de la première page physique de la liste.

Pendant la durée de vie d’un handle de moteur DMA, AllocateDmaBuffer vous pouvez l’appeler successivement pour allouer de nouvelles mémoires tampons DMA. Toutefois, avant d’appeler AllocateDmaBuffer, toute mémoire tampon DMA précédemment allouée doit d’abord être libérée en appelant FreeDmaBuffer.

Pendant les appels vers AllocateDmaBuffer et FreeDmaBuffer, le moteur DMA doit être dans l’état du flux de réinitialisation. Le moteur DMA est à l’état de réinitialisation immédiatement après l’appel à AllocateXxxDmaEngine. Pour remplacer le moteur DMA par l’état d’exécution, appelez SetDmaEngineState.

La taille FIFO est le nombre maximal d’octets que le moteur DMA peut contenir dans sa mémoire tampon interne. Selon l’implémentation matérielle, la taille FIFO d’un moteur DMA peut être statique ou varier dynamiquement avec les modifications apportées au format de flux. Pour plus d’informations sur la taille FIFO, consultez la spécification intel high definition audio sur le site web Intel HD Audio .

Cette routine échoue et retourne le code d’erreur STATUS_INVALID_DEVICE_REQUEST dans l’une des circonstances suivantes :

  • Toute mémoire tampon DMA précédemment allouée n’a pas été libérée (en appelant FreeDmaBuffer).
  • Le flux est dans un état autre que la réinitialisation.
Dans Windows Server 2003, Windows XP, Windows 2000 et Windows Me/98, un pilote audio WDM appelle cette routine pendant l’exécution de sa méthode NewStream (au moment de la création du code confidentiel) ou setFormat (après avoir appelé l’une des routines AllocateXxxDmaEngine dans le DDI audio HD). Pour plus d’informations, consultez IMiniportWavePci::NewStream et IMiniportWavePciStream::SetFormat.

Configuration requise

   
Plateforme cible Desktop (Expérience utilisateur)
En-tête hdaudio.h (inclure Hdaudio.h)
IRQL PASSIVE_LEVEL

Voir aussi

AllocateCaptureDmaEngine

AllocateRenderDmaEngine

FreeDmaBuffer

FreeDmaEngine

HDAUDIO_BUS_INTERFACE

HDAUDIO_BUS_INTERFACE_V2

IMiniportWavePci::NewStream

IMiniportWavePciStream::SetFormat

SetDmaEngineState

SetupDmaEngineWithBdl