Filtres de topologie

Un filtre de topologie représente la partie du circuit sur une carte audio carte qui gère les interactions entre les différents flux d’ondes et MIDI gérés sur le carte. Ce circuit mélange les flux de rendu et le multiplexage des flux de capture.

Un filtre de topologie fournit les broches de pont (voir Graphiques de filtre audio) qui représentent les connexions physiques de l’adaptateur audio aux appareils externes. Ces connexions transportent généralement des signaux de sortie analogiques qui pilotent les haut-parleurs et les signaux d’entrée analogiques des microphones. Les broches de pont d’un filtre de topologie peuvent également représenter des prises linein et lineout analogiques, et peut-être même des connecteurs d’entrée et de sortie numériques.

Le terme « filtre de topologie » est en un sens un terme erroné. Malgré son nom, un filtre de topologie n’est qu’un des nombreux types de filtre audio qui exposent leur topologie interne ou leur disposition. Bien que le filtre de topologie contienne des caractéristiques topologiques clés, il ne contient pas nécessairement la topologie entière de l’adaptateur. Les filtres Wave et MIDI ont leurs propres topologies. Par exemple, un filtre WaveCyclique ou WavePci minimal (voir Filtres d’ondes) peut exposer une topologie composée de deux broches et d’une DAC (convertisseur numérique-analogique) ou ADC (convertisseur analogique-numérique) selon que l’appareil sous-jacent effectue un rendu ou une capture audio.

Un filtre de topologie est implémenté en tant que paire port/miniport. Une fabrique de filtre de topologie crée un filtre de topologie comme suit :

  • Il instancie un objet pilote de miniport de topologie.

  • Il instancie un objet pilote de port de topologie en appelant PcNewPort avec la valeur GUID CLSID_PortTopology.

  • Il appelle la méthode IPort ::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Subdevice Creation illustre ce processus.

Les pilotes de port de topologie et de miniport communiquent entre eux via leurs interfaces IPortTopology et IMiniportTopology respectives . Ces interfaces sont relativement simples par rapport à celles pour les pilotes de port et de miniport wave et MIDI, car les filtres de topologie n’ont pas besoin de gérer explicitement les flux qui passent par leurs broches. Les broches d’un filtre de topologie représentent des connexions câblées dans le matériel de l’adaptateur. La connexion physique sous-jacente à une broche de filtre de topologie transporte généralement un signal audio analogique, mais peut transporter un flux audio numérique à la place, en fonction de l’implémentation matérielle.

Contrairement aux interfaces IMiniportWaveCyclique, IMiniportWavePci, IMiniportMidi et IMiniportDMus , l’interface IMiniportTopology n’a pas de méthode NewStream .

La plupart des fonctionnalités d’un filtre de topologie sont fournies par ses gestionnaires de propriétés. Le filtre de topologie existe principalement pour fournir des informations de topologie au pilote système SysAudio et aux applications qui utilisent l’API mixer multimédia Microsoft Windows. Les gestionnaires de propriétés dans le filtre de topologie permettent d’accéder aux différents contrôles (tels que le volume, l’égalisation et la réverbération) que les cartes audio offrent généralement. Grâce aux demandes de propriété, l’API mixer peut énumérer les nœuds de contrôle dans le matériel de l’adaptateur, découvrir les connexions entre les nœuds et interroger et définir les paramètres de contrôle des nœuds. L’application SndVol32 (voir SysTray et SndVol32) utilise l’API mixer pour découvrir le volume par flux de l’adaptateur et désactiver le son des contrôles.

Lors de la création d’un graphique de filtres, SysAudio interroge le filtre de topologie pour rechercher les propriétés KSPROPERTY_PIN_PHYSICALCONNECTION à ses broches pour déterminer quelle broche de filtre d’onde, MIDI ou DirectMusic est connectée à quelle broche de filtre de topologie.

Contrairement à un filtre wave, MIDI ou DirectMusic, un filtre de topologie n’instancie pas les broches. Par conséquent, aucun objet d’épingle n’est disponible pour gérer les requêtes pour les propriétés d’épingle d’un filtre de topologie. Le filtre de topologie lui-même gère toutes les requêtes concernant les connexions physiques au niveau de ses broches. Pour plus d’informations, consultez KSPROPSETID_Pin.

Comme pour d’autres types de filtres audio, un filtre de topologie utilise un tableau de structures PCCONNECTION_DESCRIPTOR pour décrire sa topologie interne. Le pilote miniport expose ce tableau dans la structure PCFILTER_DESCRIPTOR qu’il génère à partir de la méthode IMiniport ::GetDescription . Le tableau spécifie la topologie sous la forme d’une liste de connexions entre les nœuds et les broches du filtre de topologie (voir Nœuds et connexions). Le pilote système WDMAud traduit ces connexions et nœuds dans les lignes de mélangeur et les contrôles que l’API mixer expose aux applications. Comme indiqué dans Filtres audio, une broche d’entrée sur un filtre KS est mappée à une ligne de mixer SRC, et une broche de sortie sur un filtre est mappée à une ligne de mixage DST.

Un adaptateur audio classique peut lire des fichiers ondes et MIDI via un haut-parleur, et peut capturer des signaux audio à partir d’un microphone et d’un synthétiseur MIDI. L’exemple de code ci-dessous contient le tableau PCCONNECTION_DESCRIPTOR pour un filtre de topologie qui expose ces fonctionnalités :

    // 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 dans l’exemple de code précédent est l’ID de nœud Null et est définie dans le fichier d’en-tête Portcls.h. Pour obtenir une description de la façon dont cette constante est utilisée pour distinguer les broches externes sur un filtre des broches logiques sur un nœud, consultez PCCONNECTION_DESCRIPTOR.

Chaque nom d’épingle dans l’exemple de code précédent se termine par « SRC » ou « DST » selon que l’API mixer mappe ou non la broche à une ligne de mélangeur source ou de destination. Pour éviter toute confusion, n’oubliez pas que les lignes de mélangeur source et de destination sont mappées aux broches de filtre KS récepteur (entrée) et source (sortie), respectivement. Pour plus d’informations, consultez Filtres audio.

Le tableau PCCONNECTION_DESCRIPTOR dans l’exemple de code précédent décrit le filtre de topologie dans la figure suivante.

Diagramme illustrant les connexions de filtre de topologie décrites par le tableau PCCONNECTION_DESCRIPTOR.

Le filtre de topologie de la figure comporte quatre broches d’entrée (récepteur) à gauche et deux broches de sortie (source) à droite. Les chemins de données qui connectent les deux premières broches d’entrée et la broche de sortie supérieure mélangent les deux signaux analogiques qui ont été rendus à partir des flux d’onde et MIDI en cours de lecture. Les chemins de données qui connectent les deux broches d’entrée inférieures et les broches de sortie inférieures multiplexent les signaux analogiques capturés qui sont enregistrés.

Les quatre broches d’entrée fonctionnent comme suit :

  • La broche KSPIN_TOPO_WAVEOUT_SRC est physiquement connectée à la broche de sortie d’un filtre d’ondes, qui restitue un flux d’ondes à partir d’une source telle qu’un fichier .wav pour produire le signal analogique au niveau de la broche.

  • La broche KSPIN_TOPO_SYNTHOUT_SRC est physiquement connectée à la broche de sortie d’un filtre de synthèse, qui peut afficher, par exemple, un flux MIDI à partir d’une source telle qu’un fichier .mid pour produire le signal analogique au niveau de la broche.

  • La broche KSPIN_TOPO_SYNTHIN_SRC est physiquement connectée à un synthétiseur qui génère un signal analogique. (Notez qu’une conception matérielle plus pratique peut prendre un flux d’entrée MIDI à partir d’une interface MIDI MPU-401 et le convertir directement au format d’onde, en contournant complètement le filtre de topologie.)

  • La broche KSPIN_TOPO_MIC_SRC est physiquement connectée à une prise d’entrée qui prend un signal analogique à partir d’un microphone.

Les deux broches de sortie fonctionnent comme suit :

  • La broche KSPIN_TOPO_LINEOUT_DST est physiquement connectée à une prise lineout analogique qui pilote généralement un ensemble de haut-parleurs.

  • La broche KSPIN_TOPO_WAVEIN_DST est physiquement connectée à la broche d’entrée d’un filtre d’ondes, qui convertit le signal analogique en flux d’ondes et l’écrit dans une destination telle qu’un fichier .wav.

Les nœuds volume et muet (voir KSNODETYPE_VOLUME et KSNODETYPE_MUTE) sont utilisés pour contrôler les niveaux de volume des différents flux. Le nœud SOMME (voir KSNODETYPE_SUM) mélange les flux audio de la vague et des entrées MIDI. Le nœud MUX (voir KSNODETYPE_MUX) sélectionne entre les deux flux d’entrée.

La figure utilise une flèche en pointillés pour indiquer une connexion entre deux nœuds ou entre une broche et un nœud. La flèche pointe dans la direction du flux de données. Le diagramme montre un total de 13 connexions, chacune correspondant à l’un des 13 éléments du tableau PCCONNECTION_DESCRIPTOR dans l’exemple de code précédent.

En plus du filtre de topologie, le pilote de l’adaptateur crée d’autres filtres (wave, FM synth, wave table, etc.) qui se connectent aux broches du filtre de topologie.

Par exemple, le filtre d’ondes qui est physiquement connecté à la broche KSPIN_TOPO_WAVEOUT_SRC du filtre de topologie contient une DAC (représentée par un nœud KSNODETYPE_DAC ) qui convertit les données PCM en signal analogique qu’elles affichent vers la broche du filtre de topologie. Le fm-synth ou un filtre de synthèse pouvant être ondulé qui est physiquement connecté à la broche KSPIN_TOPO_SYNTHOUT_SRC du filtre de topologie convertit de la même façon les données MIDI en un signal analogique qu’elles génèrent vers la broche du filtre de topologie. Le filtre de topologie mélange les signaux analogiques de ces deux broches et génère le signal mixte vers les haut-parleurs.

Les connexions physiques du filtre de topologie à d’autres filtres qui représentent d’autres périphériques matériels sur le même adaptateur carte doivent être distinguées des autres types de connexions aux filtres. Par exemple, certaines broches sur les filtres wave, MIDI et DirectMusic peuvent être connectées ou déconnectées sous contrôle logiciel.

Au démarrage de l’appareil, le pilote de l’adaptateur inscrit les connexions physiques du filtre de topologie en appelant PcRegisterPhysicalConnection une fois par connexion. Le pilote de port a besoin de ces informations pour répondre aux demandes KSPROPERTY_PIN_PHYSICALCONNECTION get-property.