Share via


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

O evento EvtAcxStreamPrepareHardware informa ao driver para preparar o hardware para streaming.

Sintaxe

EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;

NTSTATUS EvtAcxStreamPrepareHardware(
  ACXSTREAM Stream
)
{...}

Parâmetros

Stream

Um objeto ACXSTREAM representa um fluxo de áudio criado por um circuito. O fluxo é composto por uma lista de elementos criados com base nos elementos do circuito pai. Para obter mais informações, consulte ACX – Resumo de objetos ACX.

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.

Comentários

Um AcxStream dá suporte a estados diferentes. Esses estados indicam que quando o áudio está fluindo (estado RUN), o áudio não está fluindo, mas o hardware de áudio está preparado (estado PAUSE) ou o áudio não está fluindo e o hardware de áudio não está preparado (estado STOP).

O evento EvtAcxStreamPrepareHardware fará a transição do estado do fluxo do estado Stop para o estado Pause. O driver deve alocar todos os recursos de hardware necessários para streaming nesse evento, como mecanismos de DMA.

Depois que o fluxo estiver no estado Pausar, o driver poderá receber o evento EvtAcxStreamRun para fazer a transição para o estado Executar ou o driver poderá receber o evento EvtAcxStreamReleaseHardware para fazer a transição para o estado Stop.

Os Eventos ACX são análogos aos estados KS, conforme descrito nesta tabela.

Estado de Início Estado final Evento do driver ACX chamado Observações
STOP ADQUIRIR PrepareHardware O driver executa alocações e preparações de hardware
ADQUIRIR PAUSE (Sem chamada)
PAUSE EXECUTAR Executar
EXECUTAR PAUSE Pausar
PAUSE ADQUIRIR (Sem chamada)
ADQUIRIR STOP ReleaseHardware O driver libera alocações de hardware

EvtAcxStreamAllocateRtPackets é chamado antes de EvtAcxStreamPrepareHardware para permitir que a alocação de pacotes RT ocorra antes de EvtAcxStreamPrepareHardware.

Alocações de buffer e DMA

Normalmente, a alocação de buffer envolve apenas a alocação de memória do sistema de forma que possa ser usada com o hardware de DMA. Normalmente, a alocação de buffer não terá nenhum efeito no hardware de streaming. A fase de preparação do hardware é usada porque o driver está preparando o fluxo para execução, concluindo tarefas como reservar largura de banda, programar DMA e concluir a preparação para a solicitação executar o fluxo. Normalmente, o código de hardware de preparação usará os buffers alocados para preparar o DMA e as atividades relacionadas para estar pronto para iniciar o fluxo.

Limpeza de Memória

As alocações de pacote (memória física no sistema) são feitas antes do EvtAcxStreamPrepareHardware e sua versão (EvtAcxStreamFreeRtPackets) é feita após EvtAcxStreamReleaseHardware. Esse padrão é um comportamento herdado existente que é inserido no fluxo de configuração de fluxo de áudio das camadas superiores (ks allocate buffer prop init).

O descarte dos recursos do fluxo pode ser feito na limpeza de contexto de fluxo do driver (não destruir). Nunca coloque o descarte de nada que seja compartilhado no contexto de um objeto destruir o retorno de chamada. Essa orientação se aplica a todos os objetos ACX.

O retorno de chamada de destruição é invocado depois que o último ref se foi, quando é desconhecido.

O retorno de chamada de limpeza do fluxo é chamado quando o identificador é fechado. Uma exceção a isso é quando o driver criou o fluxo em seu retorno de chamada. Se o ACX não tiver adicionado esse fluxo à ponte de fluxo pouco antes de retornar da operação de criação de fluxo, o fluxo será cancelado como assíncrono e o thread atual retornará um erro para o cliente create-stream. O fluxo não deve ter nenhuma alocação de mem alocada neste momento.

Exemplo

O uso de exemplo é mostrado abaixo.

    ACX_STREAM_CALLBACKS streamCallbacks;
    ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
    streamCallbacks.EvtAcxStreamPrepareHardware     = Codec_EvtStreamPrepareHardware;
    ...
    status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
    _In_ ACXSTREAM Stream
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    status = AllocateStreamHardware(Stream);

    if (NT_SUCCESS(status))
    {
        ctx->StreamState = AcxStreamStatePause;
    }

    return status;
}

Requisitos do ACX

Versão mínima do ACX: 1.0

Para obter mais informações sobre as 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