Compartilhar 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 pacote (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 dos 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 KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200, indicando que o Pacote é o último pacote no fluxo e EosPacketLength é um comprimento válido em bytes para o pacote. Para obter mais informações, consulte OptionsFlags na estrutura de KSSTREAM_HEADER (ks.h).

EosPacketLength

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

Valor de retorno

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 de KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM.

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

Observações

Depois que o sistema operacional chamar essa rotina, o driver poderá, 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 de KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM for especificado, o driver poderá silenciar o preenchimento de 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 se traduzirá em uma chamada no AudioKSE que chamará a camada ACX, que chamará EvtAcxStreamSetRenderPacket no ACXSTREAM ativo. A propriedade incluirá o índice de pacote (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

Consulte também