Compartir a través de


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. Dependiendo de los valores proporcionados por el controlador para AcxRtStreamNotifyPacketComplete, el número de paquete puede omitir los valores.

Flags

Las marcas pueden ser 0 o KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200, lo que indica que El paquete es el último paquete de la secuencia y EosPacketLength es una longitud válida en bytes para el paquete. Para obtener más información, vea OptionsFlags en KSSTREAM_HEADER structure (ks.h).

EosPacketLength

Longitud del paquete EOS si KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200 se especifica en Marcas. Cero es un valor válido. Si no se especifica KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM en Flags, se debe omitir este parámetro. 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 Using NTSTATUS Values.

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. El controlador puede usar opcionalmente 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 de 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 KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM.

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.

Observaciones

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 el hardware del programa para detener la transferencia al final del paquete especificado en caso de que el sistema operativo no vuelva a llamar a esta rutina para informar al controlador de otro paquete. Esto puede mitigar los efectos audibles del flujo, por ejemplo, introducir una brecha audible en lugar de repetir un búfer circular. Sin embargo, el conductor sigue obligado a aumentar su contador interno de paquetes y eventos de notificación de señal a una velocidad nominal en tiempo real.

Dependiendo de las funcionalidades de hardware, si se especifica la marca KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM, el controlador puede silenciar una parte del búfer de 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 el uso de ejemplo.

    //
    // 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
encabezado de acxstreams.h
irQL PASSIVE_LEVEL

Consulte también