Filtros de topología
Un filtro de topología representa la parte del circuito en una tarjeta de adaptador de audio que controla las interacciones entre las diversas secuencias de onda y MIDI que se administran en la tarjeta. Este circuito realiza la combinación de secuencias de representación y multiplexación de secuencias de captura.
Un filtro de topología proporciona los pines de puente (consulte Gráficos de filtros de audio) que representan las conexiones físicas del adaptador de audio a dispositivos externos. Estas conexiones suelen llevar señales de salida analógicas que impulsan altavoces y señales de entrada analógicas de micrófonos. Los pines de puente de un filtro de topología también pueden representar conectores de entrada y salida analógicos, y posiblemente incluso conectores de entrada y salida digitales.
El término "filtro de topología" es en un sentido incorrecto. A pesar de su nombre, un filtro de topología es solo uno de varios tipos de filtro de audio que exponen su topología o diseño interno. Aunque el filtro de topología contiene características topológicas clave, no contiene necesariamente toda la topología del adaptador. Los filtros wave y MIDI tienen sus propias topologías. Por ejemplo, un filtro WaveCíclico o WavePci mínimo (vea Filtros de onda) podría exponer una topología que consta de dos patillas y una DAC (convertidor digital a analógico) o ADC (convertidor analógico a digital) en función de si el dispositivo subyacente realiza la representación o captura de audio.
Un filtro de topología se implementa como un par puerto/minipuerto. Un generador de filtros de topología crea un filtro de topología de la siguiente manera:
Crea una instancia de un objeto de controlador de miniporte de topología.
Crea una instancia de un objeto de controlador de puerto de topología llamando a PcNewPort con el valor GUID CLSID_PortTopology.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de minipuerto al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso.
El puerto de topología y los controladores de minipuerto se comunican entre sí a través de sus respectivas interfaces IPortTopology e IMiniportTopology . Estas interfaces son relativamente sencillas en comparación con las de los controladores de puerto y minipuerto y de onda, ya que los filtros de topología no necesitan administrar explícitamente las secuencias que pasan a través de sus patillas. Las patillas de un filtro de topología representan conexiones cableadas en el hardware del adaptador. La conexión física subyacente a un pin de filtro de topología normalmente lleva una señal de audio analógica, pero podría llevar en su lugar una secuencia de audio digital, en función de la implementación del hardware.
A diferencia de las interfaces IMiniportWaveCíclica, IMiniportWavePci, IMiniportMidi e IMiniportDMus , la interfaz IMiniportTopology no tiene ningún método NewStream .
La mayor parte de la funcionalidad de un filtro de topología se proporciona mediante sus controladores de propiedades. El filtro de topología existe principalmente para proporcionar información de topología al controlador del sistema SysAudio y a las aplicaciones que usan la API de mezclador multimedia de Microsoft Windows. Los controladores de propiedades del filtro de topología proporcionan acceso a los distintos controles (como volumen, ecualización y reverberación) que suelen ofrecer los adaptadores de audio. Mediante solicitudes de propiedad, la API de mezclador puede enumerar los nodos de control en el hardware del adaptador, detectar conexiones entre nodos y consultar y establecer los parámetros de control de los nodos. La aplicación SndVol32 (consulte SysTray y SndVol32) usa la API de mezclador para detectar el volumen por secuencia del adaptador y los controles de silenciación.
Al crear un grafo de filtro, SysAudio consulta el filtro de topología para las propiedades de KSPROPERTY_PIN_PHYSICALCONNECTION en sus patillas para determinar qué patilla de filtro de onda, MIDI o DirectMusic está conectado al pin de filtro de topología.
A diferencia de un filtro wave, MIDI o DirectMusic, un filtro de topología no crea instancias de patillas. Por lo tanto, no hay objetos pin disponibles para controlar las consultas de las propiedades de patillas de un filtro de topología. El propio filtro de topología controla todas las consultas relacionadas con las conexiones físicas en sus patillas. Para obtener más información, consulte KSPROPSETID_Pin.
De forma similar a otros tipos de filtros de audio, un filtro de topología usa una matriz de estructuras de PCCONNECTION_DESCRIPTOR para describir su topología interna. El controlador de minipuerto expone esta matriz en la estructura PCFILTER_DESCRIPTOR que genera desde el método IMiniport::GetDescription . La matriz especifica la topología como una lista de conexiones entre los nodos y las patillas del filtro de topología (consulte Nodos y conexiones). El controlador del sistema WDMAud convierte estas conexiones y nodos en las líneas de mezclador y controla que la API de mezclador expone a las aplicaciones. Como se describe en Filtros de audio, un pin de entrada en un filtro KS se asigna a una línea mezcladora SRC y un pin de salida en un filtro se asigna a una línea mezcladora DST.
Un adaptador de audio típico puede reproducir archivos de onda y MIDI a través de un altavoz, y puede capturar señales de audio desde un micrófono y un sintetizador MIDI. El ejemplo de código siguiente contiene la matriz PCCONNECTION_DESCRIPTOR para un filtro de topología que expone estas funcionalidades:
// 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 }
};
La constante PCFILTER_NODE en el ejemplo de código anterior es el identificador de nodo nulo y se define en el archivo de encabezado Portcls.h. Para obtener una descripción de cómo se usa esta constante para distinguir patillas externas en un filtro de patillas lógicas en un nodo, consulte PCCONNECTION_DESCRIPTOR.
Cada nombre de patilla del ejemplo de código anterior termina con "SRC" o "DST" en función de si la API de mezclador asigna el pin a una línea de mezclador de origen o de destino. Para evitar confusiones, recuerde que las líneas del mezclador de origen y destino se asignan a las patillas de filtro KS de origen (entrada) y de origen (salida), respectivamente. Para obtener más información, vea Filtros de audio.
La matriz PCCONNECTION_DESCRIPTOR del ejemplo de código anterior describe el filtro de topología en la ilustración siguiente.
El filtro de topología de la figura tiene cuatro patillas de entrada (receptor) a la izquierda y dos patillas de salida (origen) a la derecha. Las rutas de acceso de datos que conectan los dos pines de entrada superiores y el pin de salida superior mezclan las dos señales analógicas que se han representado desde las secuencias wave y MIDI que se están reproduciéndose. Las rutas de acceso de datos que conectan los dos pines de entrada inferiores y el pin de salida inferior multiplexan las señales analógicas capturadas que se registran.
Las cuatro patillas de entrada funcionan de la siguiente manera:
El pin de KSPIN_TOPO_WAVEOUT_SRC está conectado físicamente al pin de salida de un filtro de onda, que representa una secuencia de onda de un origen como un archivo .wav para generar la señal analógica en el pin.
El pin de KSPIN_TOPO_SYNTHOUT_SRC está conectado físicamente al pin de salida de un filtro synth, que podría representar, por ejemplo, una secuencia MIDI de un origen como un archivo .mid para producir la señal analógica en el pin.
El pin KSPIN_TOPO_SYNTHIN_SRC está conectado físicamente a un sintetizador que genera una señal analógica. (Tenga en cuenta que un diseño de hardware más práctico podría tomar un flujo de entrada MIDI de una interfaz MIDI MPU-401 y convertirlo directamente en formato de onda, pasando por completo el filtro de topología).
El pin KSPIN_TOPO_MIC_SRC está conectado físicamente a un conector de entrada que toma una señal analógica de un micrófono.
Las dos patillas de salida funcionan de la siguiente manera:
El pin KSPIN_TOPO_LINEOUT_DST está conectado físicamente a un conector de línea analógico que normalmente controla un conjunto de altavoces.
El pin de KSPIN_TOPO_WAVEIN_DST está conectado físicamente al pin de entrada de un filtro de onda, que convierte la señal analógica en una secuencia de onda y la escribe en un destino como un archivo .wav.
Los nodos de volumen y silenciado (consulte KSNODETYPE_VOLUME y KSNODETYPE_MUTE) se usan para controlar los niveles de volumen de los distintos flujos. El nodo SUM (vea KSNODETYPE_SUM) mezcla las secuencias de audio de las entradas wave y MIDI. El nodo MUX (consulte KSNODETYPE_MUX) selecciona entre los dos flujos de entrada.
La ilustración usa una flecha discontinua para indicar una conexión entre dos nodos o entre un pin y un nodo. La flecha apunta en la dirección del flujo de datos. El diagrama muestra un total de 13 conexiones, cada una de las cuales corresponde a uno de los 13 elementos de la matriz PCCONNECTION_DESCRIPTOR del ejemplo de código anterior.
Además del filtro de topología, el controlador del adaptador crea otros filtros:-wave, fm synth, tabla de onda, etc., que se conectan a los pines del filtro de topología.
Por ejemplo, el filtro de onda que está conectado físicamente al pin de KSPIN_TOPO_WAVEOUT_SRC del filtro de topología contiene una DAC (representada por un nodo KSNODETYPE_DAC ) que convierte los datos de PCM en la señal analógica que genera en el pin del filtro de topología. El filtro fm-synth o un filtro de sinth que se conecta físicamente al pin de KSPIN_TOPO_SYNTHOUT_SRC del filtro de topología convierte de forma similar los datos MIDI en una señal analógica que genera en el pin del filtro de topología. El filtro de topología mezcla las señales analógicas de estos dos pines y genera la señal mixta a los altavoces.
Las conexiones físicas del filtro de topología a otros filtros que representan otros dispositivos de hardware en la misma tarjeta de adaptador deben distinguirse de otros tipos de conexiones a filtros. Por ejemplo, ciertos pines en filtros wave, MIDI y DirectMusic se pueden conectar o desconectar bajo el control de software.
Durante el inicio del dispositivo, el controlador del adaptador registra las conexiones físicas del filtro de topología mediante una llamada a PcRegisterPhysicalConnection una vez por conexión. El controlador de puerto necesita esta información para responder a KSPROPERTY_PIN_PHYSICALCONNECTION solicitudes get-property.