Filtros de topologia
Um filtro de topologia representa a parte do circuito em um cartão de adaptador de áudio que manipula interações entre os vários fluxos de onda e MIDI que são gerenciados no cartão. Esse circuito faz a mistura de fluxos de renderização e multiplexação de fluxos de captura.
Um filtro de topologia fornece os pinos de ponte (consulte Grafos de Filtro de Áudio) que representam as conexões físicas do adaptador de áudio para 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é conectores de entrada e saída digitais.
O termo "filtro de topologia" é, em certo sentido, um equívoco. 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 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 miniporte 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 na Criação de Subdevice ilustra esse processo.
Os drivers de porta e miniporto de topologia 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 miniporto de onda 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 com fio 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.
Em contraste com as 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 do misturador multimídia do Microsoft Windows. Os manipuladores de propriedade no filtro de topologia fornecem acesso aos vários controles (como volume, equalização e reverb) que os adaptadores de áudio normalmente oferecem. Por meio de solicitações de propriedade, a API do misturador 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 misturador para descobrir o volume por fluxo do adaptador e ativar controles mudos.
Ao criar um grafo de filtro, o SysAudio consulta o filtro de topologia das propriedades KSPROPERTY_PIN_PHYSICALCONNECTION em seus pinos para determinar qual pino de filtro de onda, MIDI ou DirectMusic está conectado ao pino de filtro de topologia.
Ao contrário de um filtro de onda, MIDI ou DirectMusic, um filtro de topologia não instancia pinos. Portanto, nenhum objeto de pino 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 de PCCONNECTION_DESCRIPTOR para descrever sua topologia interna. O driver de miniporto expõe essa matriz na estrutura PCFILTER_DESCRIPTOR que ela produz 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 misturador 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 misturador SRC e um pino de saída em um filtro é mapeado para uma linha de misturador 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 constante PCFILTER_NODE 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 misturador mapeia o pino para uma linha do misturador de origem ou de destino. Para evitar confusão, lembre-se de que as linhas do misturador de origem e de destino são mapeadas para os pinos de filtro KS (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.
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 os sinais analógicos capturados que estão sendo registrados.
Os quatro pinos de entrada funcionam da seguinte maneira:
O pino de 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 origem, 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 funcionam da seguinte maneira:
O pino KSPIN_TOPO_LINEOUT_DST está fisicamente conectado a um jack 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 grava-o em um destino como um arquivo .wav.
Os nós de volume e mudo (ver KSNODETYPE_VOLUME e KSNODETYPE_MUTE) são usados para controlar os níveis de volume dos vários fluxos. O nó SUM (veja KSNODETYPE_SUM) mistura os fluxos de áudio das entradas de onda 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 das quais corresponde 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ó de KSNODETYPE_DAC ) que converte dados pcm no sinal analógico que ele gera para o pino do filtro de topologia. O sintetizador FM ou um filtro de sintetizador que está fisicamente conectado ao pino KSPIN_TOPO_SYNTHOUT_SRC do filtro de topologia converte dados MIDI de forma semelhante 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 cartão adaptador 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 de propriedade get.