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 é:
WDM DriverEntry. Escopo do driver. DriverEntry para rotina de drivers da WDF
- 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. Função de retorno de chamada EVT_WDF_DRIVER_DEVICE_ADD
- Chamar o ACX para inicializar o contexto de inicialização do dispositivo -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
função ACX_DEVICEINIT_CONFIG_INIT - Registrar retornos de chamada de energia PnP da WDF -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- Criar dispositivo usando AcxDeviceInitialize
- Chame o ACX para fazer qualquer pós-inicialização de dispositivo.
- Opcionalmente, faça qualquer pós-inicialização de dispositivo.
- Chamar o ACX para inicializar o contexto de inicialização do dispositivo -
WDF PrepareHardware. Escopo do dispositivo. Função de retorno de chamada EVT_WDF_DEVICE_PREPARE_HARDWARE.
Criar e iniciar recursos de hardware (para interrupções e threads, registre-os com o ACX).
Crie um ou mais circuitos (criação única).
- Crie um contexto de AcxCircuitInit.
- Adicione retornos de chamada.
- Crie um AcxCircuit.
- Opcionalmente, faça qualquer pós-inicialização de circuito.
- Registre o circuito com AcxDeviceAddCircuitDevice.
Retorno de chamada de entrada D0 do dispositivo da WDF. Escopo do dispositivo. Função de retorno de chamada EVT_WDF_DEVICE_D0_ENTRY.
O ACX invoca o retorno de chamada EvtAcxCircuitPowerUp em todos os circuitos. Escopo de circuito.
O ACX move os fluxos (se houver) para o estado anterior antes de o dispositivo ser desligado. Escopo de instância de fluxo.
As filas da WDF são reiniciadas.
Função de retorno de chamada EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT. Escopo do dispositivo.
Função de retorno de chamada EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART. Escopo do dispositivo. - Inicialização após cada inicialização de Dx.
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