Compartilhar via


Gerenciamento de energia ACX

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

ACX aproveita o comportamento de energia PnP do WDF KMDF. Para obter mais informações sobre sequências de gerenciamento de energia do KMDF, consulte Sequências de Callback de PnP e Gerenciamento de Energia.

É recomendável que os drivers ACX implementem completamente o Gerenciamento de Energia do WDF, por exemplo, através da implementação da estrutura WDF_PNPPOWER_EVENT_CALLBACKS. Para obter mais informações, consulte Suporte para PnP e gerenciamento de energia no seu driver.

Remoção surpresa do dispositivo ACX

A estrutura do WDF pode chamar o EvtDeviceSurpriseRemoval a qualquer momento, ou seja, esse retorno de chamada não é serializado com a sequência de desligamento. O driver do WDF não deve tomar nenhuma ação ao receber esse callback, exceto por observar que o dispositivo foi removido inesperadamente.

A sequência de retorno de chamada para a remoção surpresa durante o desligamento é idêntica à sequência para os casos de desligamento Dx e remoção. O WDF não invoca os seguintes retornos de chamada no caminho de remoção surpresa:

Para obter mais informações, consulte Sequências de Retorno de Chamada de Gerenciamento de Energia e PnP e Usando Filas de E/S Power-Managed.

Ativação e inicialização do circuito ACX

Um AcxCircuit "dinâmico" pode ser adicionado a qualquer momento. O driver cria um novo dispositivo PDO filial e associa o novo AcxCircuit ao lidar com o callback WDF PrepareHardware para este dispositivo PDO. O tempo de vida de um circuito "dinâmico" não está associado ao tempo de vida do FDO.

Um AcxCircuit "estático" só pode ser adicionado quando o driver está processando o callback PrepareHardware do WDF para o seu dispositivo FDO. O tempo de vida de um circuito "estático" está associado ao tempo de vida do FDO.

Um driver ACX também pode criar objetos AcxFactoryCircuit (provedores de circuito) durante a sequência de inicialização usando a função AcxFactoryCircuitCreate. Um objeto AcxFactoryCircuit usa a criação de circuito dinâmico para adicionar ACXCIRCUITS quando solicitado pelo ACX. Esse recurso é muito útil ao criar pontos de extremidade compostos, ou seja, ponto de extremidade de áudio composto por dois ou mais ACXCIRCUITs vinculados juntos.

O AcxCircuit define os seguintes callbacks que são invocados durante a inicialização do AcxCircuit/Audio Endpoint:

  • EvtAcxCircuitPrepareHardware: o ACX invoca esse retorno de chamada logo após o WDF acionar seu retorno de chamada de preparação de hardware. Ele oferece uma oportunidade para o controlador realizar quaisquer preparações de hardware específicas para o circuito. Essa chamada é serializada pelo ACX. O dispositivo não está em D0 quando essa chamada é invocada.

  • EvtAcxCircuitPowerUp: ACX invoca esse retorno de chamada logo após voltar do Dx. Essa chamada é serializada pelo ACX. O dispositivo está em D0.

Para endpoints compostos, os AcxCircuits podem, opcionalmente, registrar-se para esses callbacks.

  • EvtAcxCircuitCompositeCircuitInitialize, invocado pela primeira vez que o ACX detecta que este ACXCIRCUIT está visível, ou seja, quando o dispositivo associado entra no estado D0 e torna este circuito visível para entidades externas à sua própria stack. As interfaces de áudio do circuito ainda estão no estado OFF.

  • EvtAcxCircuitCompositeInitialize, invocado sempre que o ACX está concluindo a inicialização de um ponto de extremidade composto. Depois que o ACX deste retorno de chamada ativa as interfaces de áudio deste circuito.

  • EvtAcxCircuitCompositeDeinitialize, invocado sempre que o ACX está desativando um endpoint composto. Os drivers podem não receber esse retorno de chamada se sua própria pilha tiver sido removida de surpresa ou não puder processar E/S.

Se estiverem presentes, as instâncias de stream serão restauradas para seus estados antes do desligamento.

Desligamento e remoção do circuito ACX

Um AcxCircuit "dinâmico" pode ser removido a qualquer momento invalidando e removendo o objeto de dispositivo associado ao circuito. O circuito associado pode ser removido/desanexado do dispositivo removido quando o driver gerencia os callbacks WDF PrepareHardware/ReleaseHardware para este dispositivo PDO. Conforme mencionado acima, o tempo de vida de um circuito "dinâmico" não está associado ao tempo de vida do FDO.

Um AcxCircuit "estático" só pode ser removido quando o driver está tratando os callbacks do WDF PrepareHardware/ReleaseHardware para seu dispositivo FDO. O tempo de vida de um circuito "estático" está associado ao tempo de vida do FDO.

O driver pode remover um AcxFactoryCircuit (provedor de circuito) em suas rotinas de retorno de chamada PrepareHardware/ReleaseHardware do WDF. Remover um AcxFactoryCircuit tem o efeito de remover todos os AcxCircuit(s) "dinâmicos" associados. AcxCircuit(s) também podem ser removidos quando o administrador ACX instrui uma fábrica de circuitos a remover um circuito específico ou quando o administrador ACX fecha seus identificadores AcxFactoryCircuit – nesse cenário, o ACX fecha todos os circuitos associados a esse identificador.

A estrutura ACX_CIRCUIT_PNPPOWER_CALLBACKS descreve os retornos de chamada a seguir que podem ser usados por um driver ACX.

  • EvtAcxCircuitPowerDown: ACX invoca esse callback pouco antes de entrar em Sx/Dx/Stop/Removal/SurpriseRemoval e quando o driver remove o circuito. Essa chamada é serializada pelo ACX. O dispositivo está em D0, embora lembre-se de que o dispositivo pode ser removido inesperadamente a qualquer momento (o que significa que o hardware associado se foi).

  • EvtAcxCircuitReleaseHardware: ACX invoca esse retorno de chamada pouco antes do WDF acionar seu retorno de chamada de liberação de hardware do WDF. Ele dá uma oportunidade para o operador fazer qualquer limpeza enquanto o circuito ainda está ativo. Essa chamada é serializada pelo ACX. O dispositivo não está em D0 quando essa chamada é invocada.

  • EvtWdfObjectContextCleanup: o WDF invoca esse retorno de chamada quando o objeto WDF/ACX é excluído. Essa chamada é síncrona com a exclusão da chamada de objeto WDF. O dispositivo pode não estar em D0 quando essa chamada é invocada. O retorno de chamada está em execução no nível passivo.

  • EvtWdfObjectContextDestory: O WDF invoca esse retorno de chamada depois que a última referência nesse objeto é removida. Essa chamada é assíncrona com a exclusão da chamada de objeto do WDF. O dispositivo pode não estar em D0 quando essa chamada é invocada. Esse callback é invocado somente depois que a última referência no objeto vai embora. O callback está em execução no <= nível DPC. O IRQL exato depende do IRQL do thread que libera a última referência.

Gerenciamento de ociosidade do dispositivo ACX

ACX aproveita a infraestrutura de gerenciamento de inatividade do WDF. Os drivers ACX usam os seguintes DDIs do WDF para habilitar a gestão de inatividade:

  • WdfDeviceAssignS0IdleSettings: essa chamada especifica o tipo de timeout de inatividade e gerenciamento de inatividade. O driver ACX é gratuito para usar a configuração apropriada para seu dispositivo.

  • WdfDeviceStopIdle: essa chamada impede que o dispositivo fique ocioso. Observe que sua chamada não bloqueia solicitações Sx. Ou seja, o dispositivo entra em Dx independentemente do número de referências de energia ativas quando o sistema vai para um estado de energia mais baixo.

  • WdfDeviceResumeIdle: essa chamada permite que o dispositivo reinicie seu tempo limite ocioso.

Em um cenário de várias pilhas/circuitos, pilhas diferentes podem ter tempos limite de ociosidade diferentes. Isso ocorre devido às diferentes configurações/requisitos de energia de cada pilha, portanto, tempos limite ociosos diferentes são apropriados. Para obter informações gerais sobre pilhas múltiplas, consulte comunicações entre drivers de pilhas múltiplas do ACX.

Driver ACX e filas gerenciadas por energia

O WDF dá suporte a filas de E/S gerenciadas por energia. Esse tipo de fila é totalmente integrada ao gerenciamento de energia do WDF. O WDF invoca os callbacks da fila em várias etapas na sequência de ligar/desligar do WDF. Para obter mais informações, consulte Como usar filas de E/S de Power-Managed.

Os drivers ACX só poderão usar esse tipo de fila se o driver não estiver usando o recurso de componente único/múltiplo com múltiplos estados (Fx).

Driver ACX e estados D3Hot/D3Cold (D3)

Os drivers de áudio sabem quando ir para D3Hot ou D3Cold baseado nas informações disponíveis na enumeração ACX_DX_EXIT_LATENCY.

typedef enum _ACX_DX_EXIT_LATENCY { 
  AcxDxExitLatencyInstant     = 0,
  AcxDxExitLatencyFast,
  AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;

AcxDxExitLatencyFast corresponde a D3Hot (DSP ativado) e AcxDxExitLatencyResponsive corresponde a D3Cold (DSP desativado).

Os drivers de áudio podem obter o valor ACX_DX_EXIT_LATENCY chamando a função AcxDeviceGetCurrentDxExitLatency.

O WDF sabe sobre os recursos D3Cold do driver por meio do campo ExcludeD3Cold do WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. O driver passa esse struct como entrada para o WdfDeviceAssignS0IdleSettings.

Os drivers WDF podem invocar o WdfDeviceAssignS0IdleSettings várias vezes para ativar ou desativar o D3Cold, dependendo do ambiente do sistema, ou seja, em resposta ao ACX. Para obter mais informações, consulte a estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS.

Estrutura de gerenciamento de energia (PoFx) e tempo limite ocioso gerenciado pelo driver

Gerenciamento de Energia Component-Level

Observe que WDF não suporta diretamente os estados de dispositivo/componente Fx. Para usar esses estados, o driver deve usar o tempo limite de ociosidade gerenciado pelo driver. Para obter mais informações sobre o uso dos estados dos componentes do dispositivo Fx e o timeout de inatividade gerenciado pelo driver, consulte os tópicos a seguir.

Estrutura de gerenciamento de energia (PoFx)

O Windows oferece uma estrutura de gerenciamento de energia em tempo de execução (PoFx) que fornece apoio para o gerenciamento de energia no nível do componente. Um componente ou subdevice é uma unidade de hardware funcional em um dispositivo que pode ser ativado ou alternado para um estado de baixa potência independentemente dos outros componentes no mesmo dispositivo. Para obter mais informações, consulte Visão geral do Power Management Framework.

Consulte também

Enumeração de dispositivo ACX

Documentação de referência da ACX

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

Usando filas de E/S Power-Managed.

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