EVT_ACX_STREAM_SET_RENDER_PACKET fonction de rappel (acxstreams.h)
L’événement EvtAcxStreamSetRenderPacket indique au pilote quel paquet vient d’être libéré par le client.
S’il n’y a aucun problème, ce paquet doit être (CurrentRenderPacket + 1), où CurrentRenderPacket est le paquet à partir duquel le pilote est en cours de diffusion en continu. Le pilote doit continuer à augmenter le CurrentRenderPacket à mesure que les paquets sont rendus au lieu de modifier son CurrentRenderPacket pour qu’il corresponde à cette valeur. La propriété inclut l’index de paquet (basé sur 0) et, le cas échéant, un indicateur EOS avec le décalage d’octet de la fin du flux dans le paquet actif.
Syntaxe
EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;
NTSTATUS EvtAcxStreamSetRenderPacket(
ACXSTREAM Stream,
ULONG Packet,
ULONG Flags,
ULONG EosPacketLength
)
{...}
Paramètres
Stream
Un objet ACXSTREAM représente un flux audio créé par un circuit. Pour plus d’informations, consultez ACX - Résumé des objets ACX.
Packet
Numéro du paquet écrit par le système d’exploitation dans la mémoire tampon WaveRT. Selon les valeurs fournies par le pilote à AcxRtStreamNotifyPacketComplete, le numéro de paquet peut ignorer les valeurs.
Flags
Les indicateurs peuvent être 0 ou AcxStreamSetRenderPacketEndOfStream, indiquant que le paquet est le dernier paquet du flux.
EosPacketLength
Longueur du paquet EOS si AcxStreamSetRenderPacketEndOfStream est spécifiée dans Indicateurs. Zéro est une valeur valide. Si AcxStreamSetRenderPacketEndOfStream n’est pas spécifié dans Flags, ce paramètre doit être ignoré. L’eosPacketLength est mesuré en octets.
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.
STATUS_DATA_LATE_ERROR : le pilote retourne cette erreur si le système d’exploitation transmet un numéro de paquet qui a déjà été transféré ou est en cours de transfert. Dans ce cas, une condition de problème s’est produite. Le pilote peut éventuellement utiliser certaines des données du paquet ou continuer à lire les données précédemment écrites dans ce numéro de paquet.
STATUS_DATA_OVERRUN : le pilote retourne cette erreur si le système d’exploitation transmet un numéro de paquet supérieur à celui qui peut être stocké dans la mémoire tampon WaveRT. Dans ce cas, une condition de problème s’est produite. Le pilote peut éventuellement ignorer les données contenues dans le paquet.
STATUS_INVALID_DEVICE_STATE : le pilote retourne cette erreur si le système d’exploitation appelle cette routine après avoir précédemment défini l’indicateur AcxStreamSetRenderPacketEndOfStream.
STATUS_INVALID_PARAMETER : le pilote retourne cette erreur s’il trouve un autre paramètre non valide, à l’exception des cas spécifiques pour d’autres status d’erreur. Cela inclut toutes les valeurs d’indicateur qui ne sont pas spécifiquement définies ci-dessus.
Remarques
Une fois que le système d’exploitation a appelé cette routine, le pilote peut éventuellement utiliser les informations fournies pour optimiser le transfert matériel. Par exemple, le pilote peut optimiser les transferts DMA ou le matériel programme pour arrêter le transfert à la fin du paquet spécifié au cas où le système d’exploitation n’appelle pas à nouveau cette routine pour informer le pilote d’un autre paquet. Cela peut atténuer les effets audibles de la sous-circulation, par exemple en introduisant un espace audible plutôt que de répéter une mémoire tampon circulaire. Toutefois, le pilote est toujours obligé d’augmenter son compteur de paquets interne et les événements de notification de signal à un débit nominal en temps réel.
Selon les fonctionnalités matérielles, si l’indicateur AcxStreamSetRenderPacketEndOfStream est spécifié, le pilote peut réduire au silence-remplir une partie de la mémoire tampon WaveRT qui suit le paquet EOS au cas où le matériel transfère des données au-delà de la position EOS.
Le client commence par pré-déployer une mémoire tampon. Lorsque le client appelle ReleaseBuffer, cela se traduit par un appel dans AudioKSE qui appellera la couche ACX, qui appelleRa EvtAcxStreamSetRenderPacket sur l’ACXSTREAM actif. La propriété inclut l’index de paquet (basé sur 0) et, le cas échéant, un indicateur EOS avec le décalage d’octet de la fin du flux dans le paquet actif.
Exemple
L’exemple d’utilisation est illustré ci-dessous.
//
// Init RT streaming callbacks.
//
ACX_RT_STREAM_CALLBACKS rtCallbacks;
ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);
rtCallbacks.EvtAcxStreamSetRenderPacket = EvtStreamSetRenderPacket;
status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
EvtStreamSetRenderPacket(
_In_ ACXSTREAM Stream,
_In_ ULONG Packet,
_In_ ULONG Flags,
_In_ ULONG EosPacketLength
)
{
PSTREAM_CONTEXT ctx;
NTSTATUS status = STATUS_SUCCESS;
PAGED_CODE();
ctx = GetStreamContext(Stream);
currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->m_CurrentPacket, -1, -1);
if (Packet <= currentPacket)
{
status = STATUS_DATA_LATE_ERROR;
}
else if (Packet > currentPacket + 1)
{
status = STATUS_DATA_OVERRUN;
}
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour