Filtros de topologia

Um filtro de topologia representa a parte do circuito em um adaptador de áudio cartão que manipula interações entre as várias ondas e fluxos MIDI gerenciados no cartão. Esse circuito faz a combinação de fluxos de renderização e multiplexação de fluxos de captura.

Um filtro de topologia fornece os pinos de ponte (consulte Gráficos de filtro de áudio) que representam as conexões físicas do adaptador de áudio com dispositivos externos. Essas conexões normalmente carregam sinais de saída analógicos que conduzem alto-falantes e sinais de entrada analógicos de microfones. Os pinos de ponte de um filtro de topologia também podem representar conectores analógicos de linein e lineout e, possivelmente, até mesmo conectores de entrada e saída digitais.

O termo "filtro de topologia" é, em certo sentido, um erro denom. Apesar de seu nome, um filtro de topologia é apenas um dos vários tipos de filtro de áudio que expõem sua topologia ou layout interno. Embora o filtro de topologia contenha os principais recursos topológicos, ele não contém necessariamente toda a topologia do adaptador. Os filtros Wave e MIDI têm suas próprias topologias. Por exemplo, um filtro WaveCyclic ou WavePci mínimo (consulte Filtros de onda) pode expor uma topologia que consiste em dois pinos e um DAC (conversor digital para analógico) ou ADC (conversor analógico para digital), dependendo se o dispositivo subjacente faz a renderização ou captura de áudio.

Um filtro de topologia é implementado como um par de porta/miniport. Uma fábrica de filtros de topologia cria um filtro de topologia da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporta de topologia.

  • Ele cria uma instância de um objeto de driver de porta de topologia chamando PcNewPort com o valor guid CLSID_PortTopology.

  • Ele chama o método IPort::Init do driver de porta para associar o driver de miniporto ao driver de porta.

O exemplo de código em Criação de Subdispositivos ilustra esse processo.

A porta de topologia e os drivers de miniporto se comunicam entre si por meio de suas respectivas interfaces IPortTopology e IMiniportTopology . Essas interfaces são relativamente simples em comparação com aquelas para drivers de porta e miniporta wave e MIDI porque os filtros de topologia não precisam gerenciar explicitamente os fluxos que passam por seus pinos. Os pinos de um filtro de topologia representam conexões embutidas no hardware do adaptador. A conexão física subjacente a um pino de filtro de topologia normalmente carrega um sinal de áudio analógico, mas pode carregar um fluxo de áudio digital, dependendo da implementação do hardware.

Ao contrário das interfaces IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi e IMiniportDMus , a interface IMiniportTopology não tem nenhum método NewStream .

A maior parte da funcionalidade de um filtro de topologia é fornecida por seus manipuladores de propriedade. O filtro de topologia existe principalmente para fornecer informações de topologia para o driver do sistema SysAudio e para aplicativos que usam a API de mixer multimídia do Microsoft Windows. Os manipuladores de propriedade no filtro de topologia fornecem acesso aos vários controles (como volume, equalização e reverberação) que os adaptadores de áudio normalmente oferecem. Por meio de solicitações de propriedade, a API do mixer pode enumerar os nós de controle no hardware do adaptador, descobrir conexões entre nós e consultar e definir os parâmetros de controle dos nós. O aplicativo SndVol32 (consulte SysTray e SndVol32) usa a API do mixer para descobrir o volume por fluxo do adaptador e ativar mudo dos controles.

Ao criar um grafo de filtro, o SysAudio consulta o filtro de topologia para as propriedades de KSPROPERTY_PIN_PHYSICALCONNECTION em seus pinos para determinar qual pino de filtro wave, MIDI ou DirectMusic está conectado a qual pino de filtro de topologia.

Ao contrário de um filtro wave, MIDI ou DirectMusic, um filtro de topologia não cria uma instância de pinos. Portanto, nenhum objeto pin está disponível para manipular consultas para propriedades de pin de um filtro de topologia. O próprio filtro de topologia manipula todas as consultas relacionadas às conexões físicas em seus pinos. Para obter mais informações, consulte KSPROPSETID_Pin.

Semelhante a outros tipos de filtros de áudio, um filtro de topologia usa uma matriz de estruturas PCCONNECTION_DESCRIPTOR para descrever sua topologia interna. O driver de miniporta expõe essa matriz na estrutura PCFILTER_DESCRIPTOR que ela gera do método IMiniport::GetDescription . A matriz especifica a topologia como uma lista de conexões entre os nós e os pinos do filtro de topologia (consulte Nós e Conexões). O driver do sistema WDMAud converte essas conexões e nós nas linhas e controles do mixer que a API do mixer expõe aos aplicativos. Conforme discutido em Filtros de Áudio, um pino de entrada em um filtro KS é mapeado para uma linha de mixer SRC e um pino de saída em um filtro é mapeado para uma linha de mixer DST.

Um adaptador de áudio típico pode reproduzir arquivos de onda e MIDI por meio de um alto-falante e pode capturar sinais de áudio de um microfone e de um sintetizador MIDI. O exemplo de código abaixo contém a matriz PCCONNECTION_DESCRIPTOR para um filtro de topologia que expõe esses recursos:

    // topology pins
    enum
    {
        KSPIN_TOPO_WAVEOUT_SRC = 0,
        KSPIN_TOPO_SYNTHOUT_SRC,
        KSPIN_TOPO_SYNTHIN_SRC,
        KSPIN_TOPO_MIC_SRC,
        KSPIN_TOPO_LINEOUT_DST,
        KSPIN_TOPO_WAVEIN_DST
    };
 
    // topology nodes
    enum
    {
        KSNODE_TOPO_WAVEOUT_VOLUME = 0,
        KSNODE_TOPO_WAVEOUT_MUTE,
        KSNODE_TOPO_SYNTHOUT_VOLUME,
        KSNODE_TOPO_SYNTHOUT_MUTE,
        KSNODE_TOPO_MIC_VOLUME,
        KSNODE_TOPO_SYNTHIN_VOLUME,
        KSNODE_TOPO_LINEOUT_MIX,
        KSNODE_TOPO_LINEOUT_VOLUME,
        KSNODE_TOPO_WAVEIN_MUX
    };
 
    static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
    {
       // FromNode---------------------FromPin------------------ToNode-----------------------ToPin
 
        { PCFILTER_NODE,               KSPIN_TOPO_WAVEOUT_SRC,  KSNODE_TOPO_WAVEOUT_VOLUME,  1 },
        { KSNODE_TOPO_WAVEOUT_VOLUME,  0,                       KSNODE_TOPO_WAVEOUT_MUTE,    1 },
        { KSNODE_TOPO_WAVEOUT_MUTE,    0,                       KSNODE_TOPO_LINEOUT_MIX,     1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHOUT_SRC, KSNODE_TOPO_SYNTHOUT_VOLUME, 1 },
        { KSNODE_TOPO_SYNTHOUT_VOLUME, 0,                       KSNODE_TOPO_SYNTHOUT_MUTE,   1 },
        { KSNODE_TOPO_SYNTHOUT_MUTE,   0,                       KSNODE_TOPO_LINEOUT_MIX,     2 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHIN_SRC,  KSNODE_TOPO_SYNTHIN_VOLUME,  1 },
        { KSNODE_TOPO_SYNTHIN_VOLUME,  0,                       KSNODE_TOPO_WAVEIN_MUX,      1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_MIC_SRC,      KSNODE_TOPO_MIC_VOLUME,      1 },
        { KSNODE_TOPO_MIC_VOLUME,      0,                       KSNODE_TOPO_WAVEIN_MUX,      2 },
 
        { KSNODE_TOPO_LINEOUT_MIX,     0,                       KSNODE_TOPO_LINEOUT_VOLUME,  1 },
        { KSNODE_TOPO_LINEOUT_VOLUME,  0,                 PCFILTER_NODE,  KSPIN_TOPO_LINEOUT_DST },
 
        { KSNODE_TOPO_WAVEIN_MUX,      0,                 PCFILTER_NODE,  KSPIN_TOPO_WAVEIN_DST }
    };

A PCFILTER_NODE constante no exemplo de código anterior é a ID do nó nulo e é definida no arquivo de cabeçalho Portcls.h. Para obter uma descrição de como essa constante é usada para distinguir pinos externos em um filtro de pinos lógicos em um nó, consulte PCCONNECTION_DESCRIPTOR.

Cada nome de pino no exemplo de código anterior termina com "SRC" ou "DST", dependendo se a API do mixer mapeia o pino para uma linha de mixer de origem ou de destino. Para evitar confusão, lembre-se de que as linhas do mixer de origem e destino são mapeadas para os pinos de filtro KS de coletor (entrada) e de origem (saída), respectivamente. Para obter mais informações, consulte Filtros de áudio.

A matriz PCCONNECTION_DESCRIPTOR no exemplo de código anterior descreve o filtro de topologia na figura a seguir.

Diagrama ilustrando as conexões de filtro de topologia descritas pela matriz PCCONNECTION_DESCRIPTOR.

O filtro de topologia na figura tem quatro pinos de entrada (coletor) à esquerda e dois pinos de saída (origem) à direita. Os caminhos de dados que conectam os dois principais pinos de entrada e o pino de saída superior misturam os dois sinais analógicos que foram renderizados dos fluxos de onda e MIDI que estão sendo reproduzidos. Os caminhos de dados que conectam os dois pinos de entrada inferiores e a saída inferior fixam multiplex nos sinais analógicos capturados que estão sendo registrados.

Os quatro pinos de entrada operam da seguinte maneira:

  • O pino KSPIN_TOPO_WAVEOUT_SRC está fisicamente conectado ao pino de saída de um filtro de onda, que renderiza um fluxo de onda de uma fonte, como um arquivo .wav, para produzir o sinal analógico no pino.

  • O pino KSPIN_TOPO_SYNTHOUT_SRC está fisicamente conectado ao pino de saída de um filtro de sintetizador, que pode renderizar, por exemplo, um fluxo MIDI de uma origem, como um arquivo .mid, para produzir o sinal analógico no pino.

  • O pino KSPIN_TOPO_SYNTHIN_SRC está fisicamente conectado a um sintetizador que gera um sinal analógico. (Observe que um design de hardware mais prático pode usar um fluxo de entrada MIDI de uma interface MIDI MPU-401 e convertê-lo diretamente em formato de onda, ignorando completamente o filtro de topologia.)

  • O pino KSPIN_TOPO_MIC_SRC está fisicamente conectado a um conector de entrada que usa um sinal analógico de um microfone.

Os dois pinos de saída operam da seguinte maneira:

  • O pino KSPIN_TOPO_LINEOUT_DST está fisicamente conectado a um conector de lineout analógico que normalmente conduz um conjunto de alto-falantes.

  • O pino KSPIN_TOPO_WAVEIN_DST está fisicamente conectado ao pino de entrada de um filtro de onda, que converte o sinal analógico em um fluxo de ondas e o grava em um destino como um arquivo .wav.

Os nós de volume e mudo (consulte KSNODETYPE_VOLUME e KSNODETYPE_MUTE) são usados para controlar os níveis de volume dos vários fluxos. O nó SOMA (consulte KSNODETYPE_SUM) mistura os fluxos de áudio das entradas wave e MIDI. O nó MUX (consulte KSNODETYPE_MUX) seleciona entre os dois fluxos de entrada.

A figura usa uma seta tracejada para indicar uma conexão entre dois nós ou entre um pino e um nó. A seta aponta na direção do fluxo de dados. O diagrama mostra um total de 13 conexões, cada uma correspondendo a um dos 13 elementos na matriz PCCONNECTION_DESCRIPTOR no exemplo de código anterior.

Além do filtro de topologia, o driver do adaptador cria outros filtros – onda, sintetizador FM, tabela de ondas e assim por diante – que se conectam aos pinos no filtro de topologia.

Por exemplo, o filtro de onda que está fisicamente conectado ao pino KSPIN_TOPO_WAVEOUT_SRC do filtro de topologia contém um DAC (representado por um nó KSNODETYPE_DAC ) que converte os dados do PCM no sinal analógico que ele gera para o pino do filtro de topologia. O filtro de sintetizador FM ou um filtro de sintetizador que está fisicamente conectado ao pino KSPIN_TOPO_SYNTHOUT_SRC do filtro de topologia converte de forma semelhante os dados MIDI em um sinal analógico que ele gera para o pino do filtro de topologia. O filtro de topologia mistura os sinais analógicos desses dois pinos e gera o sinal misto para os alto-falantes.

As conexões físicas do filtro de topologia com outros filtros que representam outros dispositivos de hardware no mesmo adaptador cartão precisam ser distinguidas de outros tipos de conexões com filtros. Por exemplo, determinados pinos em filtros wave, MIDI e DirectMusic podem ser conectados ou desconectados sob controle de software.

Durante a inicialização do dispositivo, o driver do adaptador registra as conexões físicas do filtro de topologia chamando PcRegisterPhysicalConnection uma vez por conexão. O driver de porta precisa dessas informações para responder a KSPROPERTY_PIN_PHYSICALCONNECTION solicitações get-property.