Enumeração de dispositivo ACX

Este tópico discute a enumeração de dispositivo ACX, inicialização e desligamento e rebalanceamento de dispositivos. Para obter uma visão geral do ACX, consulte Visão geral das extensões de classe de áudio ACX. Para obter informações sobre gerenciamento de energia do ACX e PnP, consulte Gerenciamento de energia do ACX.

Enumeração e inicialização de dispositivos do ACX para dispositivos de áudio estáticos

Para saber mais sobre como a inicialização do ACX funciona, o cenário a seguir será descrito.

  • Um dispositivo de áudio é representado por um único circuito.
  • Uma vida útil de áudio/circuito está ligada à vida útil do dispositivo PnP.
  • Um único dispositivo pode criar vários circuitos para diferentes dispositivos de áudio.
  • Ambiente de modo kernel da KMDF.

A sequência de inicialização é:

Adição de fluxo do ACX

  • Adição de fluxo do ACX (instância) no circuito ACX (retorno de chamada do ACX em circuitos ACX) – invocada a qualquer momento depois que a inicialização ou reinicialização de E/S autogerenciada da WDF tiver sido invocada e o dispositivo estiver em D0. Escopo de circuito.
    • Entrada: contexto de AcxStreamInit, ACXCIRCUIT.
    • Adicione retornos de chamada.
    • Crie um AcxStream (instância).
    • Opcionalmente, faça qualquer pós-inicialização de instância de fluxo.
    • No retorno, o ACX ativa essa instância de fluxo e, como nesse cenário é a única no caminho de áudio, permite que as mensagens de fluxo passem.

Enumeração e inicialização de dispositivos do ACX para dispositivos de áudio dinâmicos

Neste cenário, o seguinte é suposto.

  • Suporte a áudio dinâmico (criar/excluir dispositivos de áudio em tempo de execução).
  • A vida útil do dispositivo não está vinculada à vida útil do circuito.
  • Um único dispositivo pode criar vários circuitos para diferentes dispositivos de áudio.
  • Acúmulos no padrão estático simples descrito acima adicionando apenas elementos específicos ao padrão dinâmico.
  • Faz uso de PDOs brutos filhos.
  • Ambiente de modo kernel da KMDF.

A sequência de inicialização para esse cenário é:

  • WDM DriverEntry. Escopo do driver.

    • Rastreamento de inicialização.
    • Opcionalmente, registre-se para descarregar.
    • Crie WDFDRIVER.
    • Chame o ACX para fazer qualquer pós-inicialização de driver.
    • Opcionalmente, faça qualquer pós-inicialização de driver.
  • WDF DeviceAdd. Escopo do dispositivo.

    • Chame o ACX para iniciar o contexto de inicialização do dispositivo.
    • Crie o dispositivo.
    • Chame o ACX para fazer qualquer pós-inicialização de dispositivo.
    • Opcionalmente, faça qualquer pós-inicialização de dispositivo.
  • WDF PrepareHardware. Escopo do dispositivo.

    • Criar e iniciar recursos de hardware (para interrupções e threads, registre-os com o ACX).
  • Retorno de chamada de entrada D0 do dispositivo da WDF. Escopo do dispositivo.

  • As filas da WDF são reiniciadas.

  • DeviceSelfManagedIoInit da WDF. Escopo do dispositivo.

  • DeviceSelfManagedIoRestart da WDF. Escopo do dispositivo.

    • Inicialização após cada inicialização de Dx.

Criação dinâmica de circuitos (a qualquer momento)

  • O driver aloca uma estrutura WDFDEVICE_INIT chamando WdfPdoInitAllocate. O driver é responsável por invocar o WdfDeviceInitFree se encontrar alguma falha antes de criar um dispositivo com êxito.
  • O driver especifica quaisquer retornos de chamada PnP/energia que deseja receber.
  • O driver cria um dispositivo.
  • O driver instancia o novo dispositivo/circuito chamando AcxDeviceAddCircuitDevice.
  • A WDF/PnP assume o controle e o padrão simples de enum/inicialização descrito na seção anterior ocorre.

AcxFactoryCircuit

Um driver do ACX também pode criar objetos AcxFactoryCircuit (provedores de circuito) durante a sequência de inicialização usando a função AcxFactoryCircuitCreate e a função AcxDeviceAddFactoryCircuit.

Como o driver do ACX se registrou no ACX como fábrica de circuitos, a estrutura do ACX usa a fábrica registrada para pedir ao driver para criar um novo circuito.

AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);

AcxDeviceAddFactoryCircuit(Device, factory);

Rebalanceamento de dispositivos do ACX

O rebalanceamento é feito quando o uso de recursos do sistema exige que o sistema operacional reequilibre recursos entre dispositivos. Para obter informações gerais sobre rebalanceamento, consulte Implementar reequilíbrio PnP para drivers de áudio PortCls.

O ACX suporta o rebalanceamento de dispositivos da seguinte maneira:

  • Na sequência de desligamento da WDF/ACX, o driver libera todos os recursos de streaming (EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), recursos de circuito (EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) e recursos de dispositivo (EvtDeviceReleaseHardware).

  • Todas as solicitações estão pendentes, e os identificadores são deixados em aberto.

  • Na sequência de inicialização da WDF/ACX, o driver garante que os novos recursos sejam compatíveis com os atuais e faz os ajustes permitidos em suas configurações. Se os recursos não forem compatíveis com a inicialização atual do dispositivo/circuito, o driver deve excluir os circuitos atuais e criar novos. Veja abaixo mais informações.

  • Na sequência de inicialização, a WDF invoca sua entrada EvtDevicePrepareHardware e EvtDeviceD0, e o ACX invoca os correspondentes EvtAcxCircuitPrepareHardware e EvtAcxCircuitPowerUp e move todos os fluxos para seus estados pré-existentes.

  • Assim que as filas forem movidas para o estado de inicialização/execução, a E/S fluirá novamente.

O ACX não permite que a remoção (falha na remoção da consulta) ou o rebalanceamento (falha na interrupção da consulta) ocorram se houver fluxos no estado ativo (RUN).

Os drivers também podem optar por sempre destruir e recriar dispositivos de áudio na redistribuição. Esse é o mesmo cenário acima, quando o dispositivo detecta que as novas configurações não são compatíveis com as antigas. A exclusão do circuito deve ser feita em retornos de chamada EvtDevicePrepareHardware/EvtDeviceReleaseHardware, e o novo circuito é recriado em EvtDevicePrepareHardware. O driver exclui um circuito cancelando o registro do circuito (usando AcxDeviceRemoveCircuit).

Identificadores de arquivo de modo de usuário

O ACX não espera que os identificadores de arquivo do modo de usuário sejam fechados antes de recriar novos circuitos. O tempo de vida dos identificadores do sistema de arquivos não está vinculado ao tempo de vida dos recursos de hardware usados pelo dispositivo/circuitos. É responsabilidade dos clientes ouvir a chegada/remoção da interface e fechar e reabrir os identificadores de arquivos.

Os identificadores de arquivo antigos são marcados como obsoletos, e o ACX falha em todas as solicitações de E/S associadas a eles.

Confira também

Visão geral de extensões de classe de áudio ACX

Documentação de referência da ACX

Sequências de retorno de chamada de gerenciamento de energia e PnP