Share via


EVT_ACX_STREAM_SET_RENDER_PACKET función de devolución de llamada (acxstreams.h)

El evento EvtAcxStreamSetRenderPacket indica al controlador qué paquete acaba de liberar el cliente.

Si no hay problemas, este paquete debe ser (CurrentRenderPacket + 1), donde CurrentRenderPacket es el paquete desde el que el controlador está transmitiendo actualmente. El controlador debe seguir aumentando currentRenderPacket a medida que se representan los paquetes en lugar de cambiar su currentRenderPacket para que coincida con este valor. La propiedad incluirá el índice de paquetes (basado en 0) y, si procede, una marca EOS con el desplazamiento de bytes del final de la secuencia en el paquete actual.

Sintaxis

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

NTSTATUS EvtAcxStreamSetRenderPacket(
  ACXSTREAM Stream,
  ULONG Packet,
  ULONG Flags,
  ULONG EosPacketLength
)
{...}

Parámetros

Stream

Un objeto ACXSTREAM representa una secuencia de audio creada por un circuito. Para obtener más información, vea ACX : resumen de objetos ACX.

Packet

Número del paquete escrito por el sistema operativo en el búfer de WaveRT. Según los valores proporcionados por el controlador a AcxRtStreamNotifyPacketComplete, el número de paquete puede omitir los valores.

Flags

Las marcas pueden ser 0 o AcxStreamSetRenderPacketEndOfStream, lo que indica que Packet es el último paquete de la secuencia.

EosPacketLength

Longitud del paquete EOS si AcxStreamSetRenderPacketEndOfStream se especifica en Flags. Cero es un valor válido. Si AcxStreamSetRenderPacketEndOfStream no se especifica en Flags, este parámetro debe omitirse. EosPacketLength se mide en bytes.

Valor devuelto

Devuelve STATUS_SUCCESS si la llamada se realizó correctamente. De lo contrario, devuelve un código de error adecuado. Para obtener más información, vea Uso de valores NTSTATUS.

STATUS_DATA_LATE_ERROR: el controlador devuelve este error si el sistema operativo pasa un número de paquete que ya se ha transferido o está transfiriendo actualmente. En este caso, se ha producido una condición de error. Opcionalmente, el controlador puede usar algunos de los datos del paquete o seguir reproduciendo los datos escritos anteriormente en este número de paquete.

STATUS_DATA_OVERRUN: el controlador devuelve este error si el sistema operativo pasa un número de paquete superior al que se puede almacenar en el búfer waveRT. En este caso, se ha producido una condición de error. El controlador puede omitir opcionalmente los datos del paquete.

STATUS_INVALID_DEVICE_STATE: el controlador devuelve este error si el sistema operativo llama a esta rutina después de establecer previamente la marca AcxStreamSetRenderPacketEndOfStream.

STATUS_INVALID_PARAMETER: el controlador devuelve este error si encuentra algún otro parámetro no válido, aparte de los casos específicos para otro estado de error. Esto incluye los valores flag que no se han definido específicamente anteriormente.

Comentarios

Después de que el sistema operativo llame a esta rutina, el controlador puede usar opcionalmente la información proporcionada para optimizar la transferencia de hardware. Por ejemplo, el controlador podría optimizar las transferencias DMA o programar hardware para detener la transferencia al final del paquete especificado en caso de que el sistema operativo no llame a esta rutina de nuevo para informar al controlador de otro paquete. Esto puede mitigar los efectos audibles del subdesbordamiento, por ejemplo, introducir una brecha audible en lugar de repetir un búfer circular. Sin embargo, el conductor todavía está obligado a aumentar su contador de paquetes interno y los eventos de notificación de señal a una velocidad nominal en tiempo real.

Según las capacidades de hardware, si se especifica la marca AcxStreamSetRenderPacketEndOfStream, el controlador puede silenciar una parte del búfer waveRT que sigue al paquete EOS en caso de que el hardware transfiera datos más allá de la posición EOS.

El cliente se inicia mediante la puesta en marcha previa de un búfer. Cuando el cliente llama a ReleaseBuffer, esto se traducirá en una llamada en AudioKSE que llamará a la capa de ACX, que llamará a EvtAcxStreamSetRenderPacket en el ACXSTREAM activo. La propiedad incluirá el índice de paquetes (basado en 0) y, si procede, una marca EOS con el desplazamiento de bytes del final de la secuencia en el paquete actual.   

Ejemplo

A continuación se muestra un ejemplo de uso.

    //
    // 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;
}

Requisitos de ACX

Versión mínima de ACX: 1.0

Para obtener más información sobre las versiones de ACX, consulte Introducción a la versión de ACX.

Requisitos

Requisito Valor
Header acxstreams.h
IRQL PASSIVE_LEVEL

Consulte también