IRPs de pacote de solicitação de E/S ACX
Este tópico fornece um resumo dos IRPs de pacote de solicitação de E/S das extensões de classe de áudio (ACX).
Para obter informações gerais sobre o ACX, consulte Visão geral das extensões de classe de áudio ACX e Resumo dos objetos ACX. Para obter informações sobre destinos e sincronização do ACX, consulte Destinos e sincronização de driver do ACX.
Expedição de solicitações de IRP
Um cliente ACX especifica uma ação por meio de uma solicitação de driver (IRP). Para obter informações gerais sobre IRPs, consulte Pacotes de solicitação de E/S e E/S controlada por pacote com IRPs reutilizáveis.
O cliente envia essa solicitação para um circuito/pino/elemento/fluxo usando o identificador de circuito ou de fluxo. O ID do pedido é um tripleto:
- conjunto (guid),
- id/índice (ulong)
- valor opcional pin-id/node-id (ulong).
No momento da criação, o driver pode opcionalmente associar propriedades/métodos/eventos a um ou mais dos seguintes objetos:
- pin
- circuito
- fluxo
- element
Cada propriedade/método/evento é identificado por uma ID e um manipulador de retorno de chamada. Por padrão, o ACX define todas as propriedades/métodos/eventos exigidos pelos clientes KS (camadas de modo de usuário), portanto, os drivers não precisam redefini-los. Os drivers só precisam definir suas propriedades/métodos/eventos personalizados.
Quando o ACX recebe uma solicitação IoCtrl no estilo ACX/KS, ele valida a solicitação e bloqueia os buffers do chamador na memória. Essa validação e bloqueio de buffer são feitos em um retorno de chamada de pré-processo do WDM que o ACX registrou no momento da inicialização. Durante essa fase, o ACX adiciona seu próprio retorno de chamada de conclusão ao IRP do WDM antes de encaminhá-lo de volta ao WDF para expedição normal. O retorno de chamada de conclusão dá ao ACX a oportunidade de adicionar/injetar quaisquer soluções alternativas de compatibilidade, conforme necessário.
Em seguida, o WDF invoca o retorno de chamada IRP de expedição dinâmica. Nesse retorno de chamada, o ACX/driver (opcionalmente) associa uma fila do WDF à solicitação. Nesse retorno de chamada, o ACX localiza o objeto ACX de destino: circuito, pino, elemento do circuito ou fluxo usando o identificador no qual essa solicitação foi enviada e o opcional pin-id/node-id/circuit-element dentro da solicitação.
Em um dispositivo composto de áudio, é possível que o objeto de destino (somente circuito) esteja localizado em uma pilha diferente daquela em que a solicitação foi originalmente enviada. Além disso, uma solicitação pode precisar agir em várias pilhas, um exemplo disso é um estado de alteração de fluxo.
Depois que o destino é identificado, o ACX verifica se o circuito de destino/objeto de fluxo especifica uma substituição para a fila de processamento padrão, caso contrário, o ACX usará a fila padrão associada ao identificador atual. O ACX/driver instrui o WDF a inserir a solicitação na fila especificada ou padrão.
Em seguida, o WDF invoca o retorno de chamada do processo no chamador, se presente. O ACX não precisa/usa o retorno de chamada do processo no chamador porque ele já bloqueou os buffers na memória no retorno de chamada do pré-processo. Assim, o ACX informa ao WDF para não invocar o retorno de chamada em processo depois de especificar a fila de destino para a solicitação.
Uso da fila secundária
A fila do ACX padrão é uma fila sem bloqueio, serial, gerenciada por energia. O driver deve mover qualquer solicitação que leve um tempo indeterminado para uma fila secundária. A fila gerenciada pelo driver pode ser uma fila passiva manual, em que o driver pode manter essas solicitações até que esteja pronto para concluí-las mais tarde.
Solicitações de referência de energia
O ACX liga automaticamente o dispositivo antes de expedir uma solicitação para o driver. Isso é feito implicitamente usando filas gerenciadas por energia do WDF. Isso cria um comportamento semelhante a portcls. Ou seja, é feita uma referência de energia antes de expedir a solicitação.
Invocar o manipulador de expedição da fila
Em seguida, o WDF usa uma referência de energia e invoca o manipulador de expedição da fila. A fila padrão associada ao manipulador do ACX verifica se há substituições de pré-processo e, se presentes, o ACX invoca o retorno de chamada de pré-processo do driver registrado. O ACX permite que o driver especifique substituições com base no tipo de solicitação (propriedade, evento e método) e (opcionalmente) IDs de solicitação.
Se um retorno de chamada de pré-processo for especificado depois que o ACX invocar o retorno de chamada, a solicitação será de propriedade do driver. O driver pode concluir a solicitação ou encaminhá-la de volta ao ACX para expedição normal.
Se um retorno de chamada de pré-processo não tiver sido especificado ou se o driver devolver a solicitação ao ACX, o ACX recuperará o objeto ACX de destino e localizará o retorno de chamada da propriedade/evento/método declarado. Em seguida, ele invoca o retorno de chamada passando a solicitação do WDF e o objeto ACX de destino (circuito/fluxo/elemento do circuito).
Em seguida, o ACX (ou, para propriedades personalizadas, o driver) executa a ação solicitada e conclui a solicitação ou, se a solicitação demorar um tempo indeterminado, o driver poderá mover a solicitação para uma fila secundária. O driver é responsável por serializar e concluir todas as solicitações pendentes ativas.
Este diagrama ilustra o fluxo de trabalho típico de expedição de solicitações.
Este diagrama ilustra o fluxo de trabalho de expedição quando o driver tem um retorno de chamada de pré-processo de ACX definido, embora, no final, a solicitação seja manipulada pela estrutura do ACX.
Interfaces internas PnP de circuito do ACX
Para facilitar a comunicação entre o ACX Endpoint Manager (EM) e os componentes do driver do ACX (componentes de modo kernel ou de modo de usuário), o ACX define as seguintes interfaces de dispositivo PnP internas:
- ACXCATEGORY_CIRCUITFACTORY
- ACXCATEGORY_CIRCUIT
O EM usa a interface ACXCATEGORY_CIRCUITFACTORY para instruir um dispositivo de destino a criar ou remover um circuito específico desse tipo. Essa interface fica ativa enquanto o dispositivo sublinhado é capaz de criar circuitos, caso contrário, ele é desativado (exemplo: remover, remoção surpresa, parar ou remoção manual).
O subsistema de áudio usa ACXCATEGORY_CIRCUIT (que pode ser criado em uma pilha de dispositivo diferente da pilha do gerenciador de circuitos) para rastrear e se comunicar com o circuito do ACX. Essa interface é ativada quando o circuito é criado e fica pronto para processar comandos.
Para obter informações sobre outros processos de energia e PnP, consulte Enumeração de dispositivo ACX e Gerenciamento de energia do ACX.
Confira também
Visão geral de extensões de classe de áudio ACX