Share via


EVT_ACX_STREAM_SET_RENDER_PACKET função de retorno de chamada (acxstreams.h)

O evento EvtAcxStreamSetRenderPacket informa ao driver qual pacote foi liberado pelo cliente.

Se não houver falhas, esse pacote deverá ser (CurrentRenderPacket + 1), em que CurrentRenderPacket é o pacote do qual o driver está transmitindo no momento. O driver deve continuar a aumentar o CurrentRenderPacket à medida que os pacotes são renderizados em vez de alterar seu CurrentRenderPacket para corresponder a esse valor. A propriedade incluirá o índice de pacotes (baseado em 0) e, se apropriado, um sinalizador EOS com o deslocamento de bytes do final do fluxo no pacote atual.

Sintaxe

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

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

Parâmetros

Stream

Um objeto ACXSTREAM representa um fluxo de áudio criado por um circuito. Para obter mais informações, consulte ACX – Resumo de objetos ACX.

Packet

O número do pacote gravado pelo sistema operacional no buffer WaveRT. Dependendo dos valores fornecidos pelo driver para AcxRtStreamNotifyPacketComplete, o número do pacote pode ignorar valores.

Flags

Os sinalizadores podem ser 0 ou AcxStreamSetRenderPacketEndOfStream, indicando que o Pacote é o último pacote no fluxo.

EosPacketLength

O comprimento do pacote EOS se AcxStreamSetRenderPacketEndOfStream for especificado em Flags. Zero é um valor válido. Se AcxStreamSetRenderPacketEndOfStream não for especificado em Flags, esse parâmetro deverá ser ignorado. O EosPacketLength é medido em bytes.

Retornar valor

Retorna STATUS_SUCCESS se a chamada foi bem-sucedida. Caso contrário, ele retornará um código de erro apropriado. Para obter mais informações, consulte Usando valores NTSTATUS.

STATUS_DATA_LATE_ERROR – o driver retornará esse erro se o sistema operacional passar um número de pacote que já foi transferido ou está sendo transferido no momento. Nesse caso, ocorreu uma condição de falha. Opcionalmente, o driver pode usar alguns dos dados do pacote ou continuar reproduzindo os dados gravados anteriormente nesse número de pacote.

STATUS_DATA_OVERRUN – o driver retornará esse erro se o sistema operacional passar um número de pacote maior do que pode ser armazenado no buffer WaveRT. Nesse caso, ocorreu uma condição de falha. Opcionalmente, o driver pode ignorar os dados no pacote.

STATUS_INVALID_DEVICE_STATE – o driver retornará esse erro se o sistema operacional chamar essa rotina depois de definir anteriormente o sinalizador AcxStreamSetRenderPacketEndOfStream.

STATUS_INVALID_PARAMETER – o driver retornará esse erro se encontrar qualquer outro parâmetro inválido, além dos casos específicos para outros status de erro. Isso inclui quaisquer valores de sinalizador não definidos especificamente acima.

Comentários

Depois que o sistema operacional chama essa rotina, o driver pode, opcionalmente, usar as informações fornecidas para otimizar a transferência de hardware. Por exemplo, o driver pode otimizar transferências de DMA ou o hardware do programa para interromper a transferência no final do pacote especificado caso o sistema operacional não chame essa rotina novamente para informar o driver de outro pacote. Isso pode atenuar os efeitos audíveis do fluxo inferior, por exemplo, introduzindo uma lacuna audível em vez de repetir um buffer circular. No entanto, o driver ainda é obrigado a aumentar seu contador de pacotes interno e sinalizar eventos de notificação a uma taxa nominal em tempo real.

Dependendo dos recursos de hardware, se o sinalizador AcxStreamSetRenderPacketEndOfStream for especificado, o driver poderá silenciar e preencher uma parte do buffer WaveRT que segue o pacote EOS caso o hardware transfira dados além da posição do EOS.

O cliente começa pré-rolando um buffer. Quando o cliente chamar ReleaseBuffer, isso será convertido em uma chamada no AudioKSE que chamará para a camada ACX, que chamará EvtAcxStreamSetRenderPacket no ACXSTREAM ativo. A propriedade incluirá o índice de pacotes (baseado em 0) e, se apropriado, um sinalizador EOS com o deslocamento de bytes do final do fluxo no pacote atual.   

Exemplo

O uso de exemplo é mostrado abaixo.

    //
    // 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 do ACX

Versão mínima do ACX: 1.0

Para obter mais informações sobre versões do ACX, consulte Visão geral da versão do ACX.

Requisitos

Requisito Valor
Cabeçalho acxstreams.h
IRQL PASSIVE_LEVEL

Confira também