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