Share via


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

EvtAcxStreamGetCapturePacket indica al controlador que indique qué paquete (basado en 0) se llenó completamente recientemente, incluido el valor QPC en el momento en que el controlador comenzó a rellenar el paquete.

Sintaxis

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

NTSTATUS EvtAcxStreamGetCapturePacket(
  ACXSTREAM Stream,
  PULONG LastCapturePacket,
  PULONGLONG QPCPacketStart,
  PBOOLEAN MoreData
)
{...}

Parámetros

Stream

Un objeto ACXSTREAM representa una secuencia de audio creada por un circuito. La secuencia se compone de una lista de elementos creados en función de los elementos del circuito primario. Para obtener más información, vea ACX : resumen de objetos ACX.

LastCapturePacket

Valor que indica la posición del último paquete capturado. Se trata de un índice basado en 0 que indica cuántos paquetes completos de datos se han capturado.

QPCPacketStart

Valor que indica la hora de inicio del último paquete capturado.

MoreData

Devuelve TRUE si hay más datos listos inmediatamente. Opcionalmente, el sistema operativo puede llamar inmediatamente a esta rutina después de procesar el paquete para obtener la siguiente información del paquete. Si el controlador devuelve FALSE, la captura funciona en tiempo real.

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.

Comentarios

Antes de leer los datos de audio capturados del búfer de audio, el sistema operativo llama a esta rutina para obtener información sobre los datos disponibles.

El número de paquete identifica un paquete dentro de la secuencia. Esto restablece a cero cuando se ha llamado a EVT_ACX_STREAM_RELEASEHARDWARE para la secuencia. El número avanza con cada búfer capturado. Desde el número de paquete, el sistema operativo puede derivar la ubicación del paquete dentro del búfer de audio y también puede derivar la posición de la secuencia del paquete en relación con el inicio de la secuencia.

El sistema operativo puede llamar a esta rutina en cualquier momento. En funcionamiento normal, el sistema operativo llama a esta rutina después de que el controlador llame a AcxRtStreamNotifyPacketComplete o después de que una llamada anterior devuelva true para MoreData. Cuando el sistema operativo llama a esta rutina, el controlador puede suponer que el sistema operativo ha terminado de leer todos los paquetes anteriores. Si el hardware ha capturado suficientes datos, el controlador puede expandir inmediatamente el siguiente paquete completo al búfer de audio y llamar a AcxRtStreamNotifyPacketComplete de nuevo. En el caso de desbordamiento de captura (cuando el sistema operativo no lee los datos rápidamente) el controlador de audio puede quitar o sobrescribir algunos datos de audio. El controlador de audio quita o sobrescribe primero los datos más antiguos. Es posible que el controlador de audio continúe avanzando en su contador de paquetes interno aunque el sistema operativo no haya leído los datos.

Ejemplo

A continuación se muestra el uso de ejemplo.

#pragma code_seg("PAGE")
NTSTATUS
CodecC_EvtStreamGetCapturePacket(
    _In_ ACXSTREAM          Stream,
    _Out_ ULONG           * LastCapturePacket,
    _Out_ ULONGLONG       * QPCPacketStart,
    _Out_ BOOLEAN         * MoreData
)
{
    PCODEC_STREAM_CONTEXT ctx;
    CCaptureStreamEngine* streamEngine = nullptr;
    ULONG currentPacket;
    LONGLONG qpcPacketStart;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);
    // Retrieve the current packet that is being written to by the audio hardware
    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->CurrentPacket, -1, -1);
    qpcPacketStart = InterlockedCompareExchange64(&ctx->LastPacketStart.QuadPart, -1, -1);

    // The Last capture packet is the packet before the current packet.
    *LastCapturePacket = currentPacket - 1;
    *QPCPacketStart = (ULONGLONG)qpcPacketStart;
    *MoreData = FALSE;

    return STATUS_SUCCESS;
}

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