Partilhar via


Propriedades de filtro, pino e nó

Os drivers de áudio WDM (Microsoft Windows Driver Model) representam um dispositivo de áudio como um filtro KS e representam um buffer de hardware no dispositivo como um pino no filtro. Quando um cliente envia uma solicitação de propriedade para um desses objetos de filtro ou pino, o driver de porta recebe a solicitação e roteia a solicitação para o manipulador de propriedade apropriado no driver de porta ou driver de miniporta.

Os dispositivos de áudio suportam três tipos de propriedades:

  • Propriedades do filtro

    Uma propriedade de filtro é uma propriedade do filtro como um todo, em vez de uma propriedade de um determinado pino ou nó dentro do filtro. As solicitações de propriedades de filtro indicam identificadores de filtro, mas não especificam IDs de nós.

  • Propriedades de marcadores

    Uma propriedade de pino é uma propriedade de uma instância específica de pino no filtro. As solicitações para essas propriedades especificam identificadores de pino, mas não especificam IDs de nó.

  • Propriedades do nó

    Uma propriedade de nó é uma propriedade de um nó de topologia dentro do filtro. Uma solicitação para uma propriedade de nó especifica um identificador de filtro ou identificador de pino, além de uma ID de nó.

Se uma solicitação de propriedade de nó especifica um filtro ou identificador de pino depende de se o nó é exclusivo para o filtro. Para obter mais informações, consulte a seção Propriedades do nó a seguir.

A figura a seguir mostra esses três tipos de solicitação de propriedade: uma solicitação de propriedade de pino enviada para uma instância de pino, uma solicitação de propriedade de nó enviada para um nó (em uma instância de filtro ou pino) e uma solicitação de propriedade de filtro enviada para uma instância de filtro.

Diagrama ilustrando solicitações de propriedades de filtro, pino e nó.

Normalmente, o driver de porta lida com a maioria das solicitações de propriedades de filtro e pino, e o driver de miniporta lida com solicitações de propriedades de nó.

O controlador de porta fornece os seus próprios manipuladores integrados para as propriedades de filtro e de pino que são usadas pelo driver de sistema SysAudio (consulte KSPROPSETID_Sysaudio e KSPROPSETID_Sysaudio_Pin) e o driver de sistema WDMAud. Um driver de miniporta não precisa implementar manipuladores para propriedades que o driver de porta manipula. Um driver de miniporta típico fornece poucos, se houver, manipuladores para propriedades de filtro e pino. O miniport driver fornece os controladores para propriedades de nós que representam funcionalidades dependentes de hardware do dispositivo de áudio. Os drivers de porta não fornecem manipulação interna de propriedades de nó, com exceção de KSPROPERTY_TOPOLOGY_NAME.

Quando o controlador de porta e o controlador de miniporta fornecem manipuladores para a mesma propriedade, o controlador de porta usa seu próprio manipulador e ignora o manipulador do controlador de miniporta.

Descritores de Filtro

O driver de porta obtém ponteiros para os gestores de propriedades do driver de miniporta chamando o método IMiniport::GetDescription. Através deste método, o controlador de porta recupera um ponteiro para o descritor de filtro do controlador de miniporta, que é uma estrutura do tipo PCFILTER_DESCRIPTOR. Essa estrutura especifica os manipuladores de propriedades do driver de miniporta para propriedades de filtro, pino e nó:

  • O membro AutomationTable da estrutura PCFILTER_DESCRIPTOR aponta para a tabela de automação do filtro. Esta tabela especifica os manipuladores de propriedades do driver de miniporta para propriedades de filtro.

  • O membro Pins da estrutura PCFILTER_DESCRIPTOR contém as tabelas de automação para os pinos. Cada tabela especifica os gestores de propriedades para as propriedades de pino de um tipo específico de pino.

  • O membro Nodes da estrutura PCFILTER_DESCRIPTOR contém as tabelas de automação dos nós de topologia no interior do filtro. Cada tabela especifica os manipuladores de propriedade para as propriedades de nó de um tipo de nó específico.

Propriedades do filtro

O driver de porta acessa os manipuladores de propriedades de filtro do driver de miniporta por meio do membro AutomationTable do PCFILTER_DESCRIPTOR. Normalmente, esta tabela de automação contém poucos manipuladores, uma vez que o driver de porta fornece seus próprios manipuladores internos para todas as propriedades do filtro que o SysAudio e o WDMAud utilizam para consultar e configurar dispositivos de áudio.

No entanto, o driver de miniporta pode fornecer manipuladores para propriedades de filtro, como KSPROPERTY_GENERAL_COMPONENTID que fornecem informações dependentes de hardware que não estão disponíveis para o driver de porta. Dois dos drivers de áudio de exemplo no Microsoft Windows Driver Kit (WDK) manipulam a propriedade KSPROPERTY_GENERAL_COMPONENTID. Para obter mais informações, consulte as implementações de miniport driver no driver de exemplo Sysvad, que é discutido em Drivers de áudio de exemplo.

Todos os drivers de porta em Portcls.sys fornecem gestão para os conjuntos de propriedades KSPROPSETID_Pin e KSPROPSETID_Topology. Todas as propriedades neste conjunto são propriedades de filtro, com exceção de KSPROPERTY_TOPOLOGY_NAME, que é uma propriedade de nó (que usa um identificador de filtro, não um identificador de pino, para especificar o destino da solicitação). Os drivers de porta suportam o seguinte subconjunto das propriedades KSPROPSETID_Pin:

KSPROPERTY_PIN_CATEGORY

KSPROPERTY_PIN_CINSTANCES

KSPROPERTY_PIN_COMMUNICATION

KSPROPERTY_PIN_CONSTRAINEDDATARANGES

KSPROPERTY_PIN_CTYPES

KSPROPERTY_PIN_DATAFLOW

KSPROPERTY_PIN_DATAINTERSECTION

KSPROPERTY_PIN_DATARANGES

KSPROPERTY_PIN_GLOBALCINSTANCES

KSPROPERTY_PIN_INTERFACES

KSPROPERTY_PIN_MEDIUMS

KSPROPERTY_PIN_NAME

KSPROPERTY_PIN_NECESSARYINSTANCES

KSPROPERTY_PIN_PHYSICALCONNECTION

KSPROPERTY_PIN_PROPOSEDATAFORMAT

KSPROPERTY_PIN_PROPOSEDATAFORMAT2

Essas propriedades fornecem informações sobre as fábricas de pinos pertencentes a um filtro. Normalmente, os clientes consultam o filtro para essas propriedades antes de criar instâncias de pino. Os drivers de porta suportam todas as quatro propriedades de KSPROPSETID_Topology, que fornecem informações sobre a topologia interna do filtro.

Além disso, o driver de porta DMus fornece um manipulador para a propriedade KSPROPERTY_SYNTH_MASTERCLOCK, que é uma propriedade somente para leitura de um filtro DirectMusic. KSPROPERTY_SYNTH_MASTERCLOCK é um membro do conjunto de propriedades KSPROPSETID_SynthClock .

Propriedades do pino

O driver de porta acessa os manipuladores de propriedades de pinos do driver de miniporta por meio do membro Pins de PCFILTER_DESCRIPTOR. Este membro aponta para uma matriz de descritores de pinos, e cada descritor aponta para a tabela de automação para um tipo de pino (identificado por um ID de pino, que é simplesmente o índice de matriz).

Normalmente, essas tabelas de automação contêm poucas entradas porque o driver de porta fornece seus próprios manipuladores para todas as propriedades de pino que SysAudio e WDMAud usam. Um driver de miniporta tem a opção de fornecer manipuladores para uma ou mais propriedades de pino que não são manipuladas pelo driver de porta, mas apenas os clientes que estão cientes dessas propriedades podem enviar solicitações para essas propriedades.

Com exceção do driver de porta de topologia, todos os drivers de porta em Portcls.sys fornecem manipuladores internos para as seguintes propriedades de pino:

KSPROPERTY_CONNECTION_STATE

KSPROPERTY_CONNECTION_DATAFORMAT

KSPROPERTY_CONNECTION_ALLOCATORFRAMING

KSPROPERTY_STREAM_ALLOCATOR

KSPROPERTY_STREAM_MASTERCLOCK

KSPROPERTY_AUDIO_POSITION

KSPROPERTY_DRMAUDIOSTREAM_CONTENTID

Algumas das propriedades nesta lista exigem informações dependentes de hardware do driver de miniporta. Quando o driver de porta recebe um IRP contendo uma solicitação para uma dessas propriedades, ele não passa o IRP para o driver de miniporta. Em vez disso, o controlador de porta lida com a solicitação em si, mas o seu manipulador obtém as informações necessárias chamando um ponto de entrada no controlador de miniporta. Por exemplo, o driver de porta fornece seu próprio manipulador de propriedade para solicitações de KSPROPERTY_AUDIO_POSITION. Esse manipulador simplesmente chama o método GetPosition do fluxo de driver de miniporta (por exemplo, IMiniportWavePciStream::GetPosition) para obter a posição atual.

Propriedades do Node

O driver de porta acede aos manipuladores de propriedades dos nós do driver de miniporta através do membro Nodes de PCFILTER_DESCRIPTOR. Este membro aponta para uma matriz de descritores de nó, e cada descritor aponta para a tabela de automação para um tipo de nó (identificado por um ID de nó, que é simplesmente o índice de matriz). Normalmente, todos ou a maioria dos manipuladores de propriedade pertencentes a um driver de miniporta residem na matriz Nodes . Um driver de áudio representa os controles de hardware em um dispositivo de áudio como nós de topologia e usa o mecanismo de propriedade para fornecer aos clientes acesso às configurações de controle dependentes de hardware.

Conforme descrito anteriormente, um cliente envia uma solicitação de propriedade de filtro para uma alça de filtro e uma solicitação de propriedade de pino para uma alça de pino. Ao contrário de uma instância de filtro ou pino, um nó não é um objeto do kernel e não tem um identificador. Um cliente envia uma solicitação de propriedade de nó para um identificador de pino ou um identificador de filtro, mas a solicitação também especifica uma ID de nó para indicar que a solicitação é para uma propriedade de nó em vez de uma propriedade de pino ou filtro.

A seguir estão as regras gerais para determinar se uma propriedade de nó deve usar uma alça de filtro ou uma alça de pino:

  • Se um filtro contiver várias instâncias de um tipo específico de pino, e cada pino desse tipo contiver um nó com um determinado ID de nó, então cada instância de pino conterá uma instância desse nó. Nesse caso, uma solicitação de propriedade de nó deve especificar um identificador de pino (em vez de apenas um identificador de filtro) para distinguir entre várias instâncias do mesmo tipo de nó. A combinação de identificador de pino e ID de nó identifica inequivocamente uma instância de nó específica como o destino da solicitação.

  • Se um filtro contiver apenas uma instância de um nó específico, uma solicitação de propriedade de nó especificará um identificador de filtro. A combinação de identificador de filtro e ID de nó é suficiente para identificar inequivocamente o nó que é o destino da solicitação.

Antes de implementar um manipulador para uma propriedade de nó específica, no entanto, o desenvolvedor de driver deve consultar Conjuntos de propriedades de drivers de áudio para verificar se o destino da propriedade deve ser especificado como um identificador de filtro ou identificador de pino.

Os drivers de porta em Portcls.sys atualmente não fornecem manipulação interna de propriedades de nó, com exceção de KSPROPERTY_TOPOLOGY_NAME.

Solicitações de propriedade superespecificadas e subespecificadas

Os motoristas devem estar preparados para lidar com solicitações de propriedade de clientes que não seguem as regras anteriores. As solicitações podem ser superespecificadas ou subespecificadas:

  • Solicitações superespecificadas

    Se uma solicitação de propriedade exigir apenas um identificador de filtro, mas o cliente enviar a solicitação para um identificador de pino, o destino da solicitação será superespecificado. No entanto, os motoristas normalmente tratam a solicitação como válida; ou seja, tratam o pedido como se tivesse sido enviado para o filtro que contém o pino.

  • Pedidos subespecificados

    Se uma solicitação de propriedade exigir um identificador de pino, mas um cliente enviar a solicitação para um identificador de filtro, o destino da solicitação não será especificado adequadamente. Por exemplo, se um filtro contiver várias instâncias de pino com o mesmo tipo de nó e um cliente enviar uma solicitação para uma propriedade desse tipo de nó para um identificador de filtro em vez de um identificador de pino, o driver não terá como determinar qual instância de nó deve receber a solicitação. Neste caso, o comportamento depende do motorista. Em vez de falhar automaticamente todas as solicitações subespecificadas, alguns drivers consideram válido um pedido de definição de propriedade subespecificado. Nesse caso, a interpretação é que a solicitação define o valor padrão para o ID do nó especificado. Quando uma fábrica de pinos cria uma nova instância de nó, a propriedade pertencente ao novo nó é inicializada com o valor padrão. Uma solicitação que altera o valor padrão não tem efeito nas instâncias de nó criadas antes da solicitação. Além disso, os drivers falham de forma consistente em solicitações get-property insuficientemente especificadas porque o manipulador não tem como determinar qual instância de nó consultar para a propriedade.

Exceções às regras

Por razões históricas, algumas propriedades de áudio têm peculiaridades comportamentais que violam essas regras gerais. Seguem-se alguns exemplos:

  • Conforme descrito em Aplicando configurações de Speaker-Configuration, um cliente pode alterar a configuração do alto-falante de um dispositivo de áudio definindo a propriedade KSPROPERTY_AUDIO_CHANNEL_CONFIG de um nó 3D (KSNODETYPE_3D_EFFECTS). A definição de configuração do alto-falante é global porque altera a configuração do alto-falante para todos os fluxos que fazem parte da mistura que o dispositivo reproduz através dos alto-falantes. De acordo com a regra geral, uma solicitação de propriedade de nó que afete o filtro como um todo deve especificar um identificador de filtro (mais um ID de nó). No entanto, essa propriedade específica requer uma alça de pino em vez de uma alça de filtro. O identificador de pino designa a instância de pino que contém o nó 3D que é o destino da solicitação.

  • KSPROPERTY_SYNTH_VOLUME e KSPROPERTY_SYNTH_MASTERCLOCK são propriedades de um nó de sintetizador (KSNODETYPE_SYNTHESIZER). Embora ambas sejam propriedades de nó, as solicitações para essas propriedades não incluem IDs de nó. (Observe que o descritor de propriedade para a solicitação é uma estrutura do tipo KSPROPERTY, não KSNODEPROPERTY.) Esse comportamento viola a regra geral de que uma propriedade de nó requer uma ID de nó. Apesar dessa discrepância, um driver de miniporta que suporte cada uma das propriedades deve fornecer o manipulador de propriedades através do membro Nós de PCFILTER_DESCRIPTOR (em vez do membro Pins).