Partager via


fonction de rappel EVT_ACX_STREAM_SET_RENDER_PACKET (acxstreams.h)

L’événement EvtAcxStreamSetRenderPacket indique au pilote quel paquet vient d’être libéré par le client.

S’il n’y a pas de problèmes, ce paquet doit être (CurrentRenderPacket + 1), où CurrentRenderPacket est le paquet à partir duquel le pilote est en streaming. Le pilote doit continuer à augmenter le CurrentRenderPacket en tant que paquets affichés 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

Nombre de paquets écrits par le système d’exploitation dans la mémoire tampon WaveRT. Selon les valeurs fournies par le pilote pour AcxRtStreamNotifyPacketComplete, le numéro de paquet peut ignorer les valeurs.

Flags

Les indicateurs peuvent être 0 ou KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200, indiquant que le paquet est le dernier paquet du flux, et EosPacketLength est une longueur valide en octets pour le paquet. Pour plus d’informations, consultez OptionsFlags dans KSSTREAM_HEADER structure (ks.h).

EosPacketLength

Longueur du paquet EOS si KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200 est spécifiée dans les indicateurs. Zéro est une valeur valide. Si KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM n’est pas spécifié dans les indicateurs, ce paramètre doit être ignoré. Le EosPacketLength est mesuré en octets.

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.

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 glitch 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 nombre de paquets supérieur à celui pouvant être stocké dans la mémoire tampon WaveRT. Dans ce cas, une condition de glitch s’est produite. Le pilote peut éventuellement ignorer les données 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 de KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM.

STATUS_INVALID_PARAMETER : le pilote retourne cette erreur s’il trouve un autre paramètre non valide, en dehors des cas spécifiques pour un autre état d’erreur. Cela inclut les valeurs d’indicateur non spécifiquement définies ci-dessus.

Remarques

Une fois que le système d’exploitation appelle 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 du programme pour arrêter le transfert à la fin du paquet spécifié au cas où le système d’exploitation n’appelait pas cette routine pour informer le pilote d’un autre paquet. Cela peut atténuer les effets audibles de sous-flux, par exemple en introduisant un écart 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 taux de temps réel nominal.

Selon les fonctionnalités matérielles, si l’indicateur de KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM est spécifié, le pilote peut réduire le silence d’une partie de la mémoire tampon WaveRT qui suit le paquet EOS au cas où le matériel transfère les données au-delà de la position EOS.

Le client commence par le pré-déploiement d’une mémoire tampon. Lorsque le client appelle ReleaseBuffer, cela se traduit par un appel dans AudioKSE qui appelle la couche ACX, qui appelle EvtAcxStreamSetRenderPacket sur 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 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

Voir aussi