Topologiefilter

Ein Topologiefilter stellt den Teil der Schaltung auf einem Audioadapter Karte dar, der Interaktionen zwischen den verschiedenen Wellen- und MIDI-Streams verarbeitet, die auf dem Karte verwaltet werden. Diese Schaltung führt das Mischen von Renderingdatenströmen und das Multiplexing von Aufzeichnungsdatenströmen durch.

Ein Topologiefilter stellt die Bridge-Pins bereit (siehe Audiofilterdiagramme), die die physischen Verbindungen des Audioadapters zu externen Geräten darstellen. Diese Verbindungen tragen in der Regel analoge Ausgangssignale, die Lautsprecher und analoge Eingangssignale von Mikrofonen antreiben. Die Bridgepins eines Topologiefilters können auch analoge Linein- und Lineout-Buchsen und möglicherweise sogar digitale Ein- und Ausgabestecker darstellen.

Der Begriff "Topologiefilter" ist in gewisser Weise falsch. Trotz seines Namens ist ein Topologiefilter nur einer von mehreren Arten von Audiofiltern, die ihre interne Topologie oder ihr Layout verfügbar machen. Obwohl der Topologiefilter wichtige topologische Features enthält, enthält er nicht unbedingt die gesamte Topologie des Adapters. Wellen- und MIDI-Filter verfügen über eigene Topologien. Beispielsweise kann ein minimaler WaveCyclic- oder WavePci-Filter (siehe Wellenfilter) eine Topologie verfügbar machen, die aus zwei Pins und entweder einem DAC (Digital-zu-Analog-Konverter) oder ADC (Analog-Zu-Digital-Konverter) besteht, je nachdem, ob das zugrunde liegende Gerät Audiorendering oder -aufzeichnung durchführt.

Ein Topologiefilter wird als Port/Miniport-Paar implementiert. Eine Topologiefilterfactory erstellt einen Topologiefilter wie folgt:

  • Es instanziiert ein Topologie-Miniporttreiberobjekt.

  • Es instanziiert ein Topologieporttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortTopology aufgerufen wird.

  • Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.

Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Prozess.

Die Topologieport- und Miniporttreiber kommunizieren miteinander über ihre jeweiligen IPortTopology - und IMiniportTopology-Schnittstellen . Diese Schnittstellen sind im Vergleich zu denen für Wave- und MIDI-Port- und Miniporttreiber relativ einfach, da Topologiefilter die Streams, die über ihre Pins geleitet werden, nicht explizit verwalten müssen. Die Pins eines Topologiefilters stellen festverdrahtete Verbindungen in der Adapterhardware dar. Die physische Verbindung, die einem Topologiefilternadel zugrunde liegt, trägt normalerweise ein analoges Audiosignal, kann aber je nach Hardwareimplementierung stattdessen einen digitalen Audiodatenstrom enthalten.

Im Gegensatz zu den Schnittstellen IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi und IMiniportDMus verfügt die IMiniportTopology-Schnittstelle über keine NewStream-Methode .

Die meisten Funktionen eines Topologiefilters werden von seinen Eigenschaftenhandlern bereitgestellt. Der Topologiefilter dient in erster Linie zum Bereitstellen von Topologieinformationen für den SysAudio-Systemtreiber und für Anwendungen, die die Microsoft Windows Multimedia-Mixer-API verwenden. Die Eigenschaftenhandler im Topologiefilter bieten Zugriff auf die verschiedenen Steuerelemente (z. B. Volume, Entzerrung und Reverb), die Audioadapter normalerweise bieten. Über Eigenschaftenanforderungen kann die Mixer-API die Steuerungsknoten in der Adapterhardware auflisten, Verbindungen zwischen Knoten ermitteln und die Steuerungsparameter der Knoten abfragen und festlegen. Die SndVol32-Anwendung (siehe SysTray und SndVol32) verwendet die Mixer-API, um die Volume- und Stummschaltungssteuerelemente des Adapters pro Stream zu ermitteln.

Beim Erstellen eines Filterdiagramms fragt SysAudio den Topologiefilter nach den KSPROPERTY_PIN_PHYSICALCONNECTION Eigenschaften an seinen Pins ab, um zu bestimmen, welcher Wave-, MIDI- oder DirectMusic-Filterpin mit welchem Topologiefilterpin verbunden ist.

Im Gegensatz zu einem Wave-, MIDI- oder DirectMusic-Filter instanziiert ein Topologiefilter keine Pins. Daher sind keine Pinobjekte verfügbar, um Abfragen für die Pineigenschaften eines Topologiefilters zu verarbeiten. Der Topologiefilter selbst verarbeitet alle Abfragen in Bezug auf die physischen Verbindungen an seinen Pins. Weitere Informationen finden Sie unter KSPROPSETID_Pin.

Ähnlich wie bei anderen Arten von Audiofiltern verwendet ein Topologiefilter ein Array von PCCONNECTION_DESCRIPTOR Strukturen, um die interne Topologie zu beschreiben. Der Miniporttreiber macht dieses Array in der PCFILTER_DESCRIPTOR-Struktur verfügbar, die von der IMiniport::GetDescription-Methode ausgegeben wird. Das Array gibt die Topologie als Liste der Verbindungen zwischen den Knoten und Pins des Topologiefilters an (siehe Knoten und Verbindungen). Der WDMAud-Systemtreiber übersetzt diese Verbindungen und Knoten in die Mischerlinien und -steuerelemente, die die Mixer-API für Anwendungen verfügbar macht. Wie unter Audiofilter erläutert, wird ein Eingabenadel in einem KS-Filter einer SRC-Mixerlinie zugeordnet, und ein Ausgabestift an einem Filter wird einer DST-Mixerlinie zugeordnet.

Ein typischer Audioadapter kann Wave- und MIDI-Dateien über einen Lautsprecher wiedergeben und Audiosignale von einem Mikrofon und einem MIDI-Synthesizer erfassen. Das folgende Codebeispiel enthält das PCCONNECTION_DESCRIPTOR Array für einen Topologiefilter, der diese Funktionen verfügbar macht:

    // 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 }
    };

Konstante PCFILTER_NODE im vorherigen Codebeispiel ist die NULL-Knoten-ID und wird in der Headerdatei Portcls.h definiert. Eine Beschreibung, wie diese Konstante verwendet wird, um externe Pins in einem Filter von logischen Pins auf einem Knoten zu unterscheiden, finden Sie unter PCCONNECTION_DESCRIPTOR.

Jeder Pinname im vorherigen Codebeispiel endet entweder mit "SRC" oder "DST", je nachdem, ob die Mixer-API den Pin einer Quell- oder Zielmischerzeile ordnet. Um Verwirrung zu vermeiden, denken Sie daran, dass Quell- und Zielmischerlinien den KS-Filterpins Senke (Eingabe) und Quelle (Ausgabe) zugeordnet sind. Weitere Informationen finden Sie unter Audiofilter.

Das PCCONNECTION_DESCRIPTOR Array im vorherigen Codebeispiel beschreibt den Topologiefilter in der folgenden Abbildung.

Diagramm zur Veranschaulichung der Topologiefilterverbindungen, die vom PCCONNECTION_DESCRIPTOR-Array beschrieben werden.

Der Topologiefilter in der Abbildung verfügt links über vier Eingabenadeln (Senke) und rechts über zwei Ausgabepins (Quelle). Die Datenpfade, die die beiden oberen Eingabepins und den oberen Ausgabepin verbinden, mischen die beiden analogen Signale, die von den wave- und MIDI-Streams gerendert wurden, die wiedergegeben werden. Die Datenpfade, die die unteren beiden Eingabestifte und den unteren Ausgang verbinden, pinnen multiplex die erfassten analogen Signale an, die aufgezeichnet werden.

Die vier Eingabestifte funktionieren wie folgt:

  • Der KSPIN_TOPO_WAVEOUT_SRC Pin ist physisch mit dem Ausgabepin eines Wellenfilters verbunden, der einen Wellenstrom aus einer Quelle wie z. B. einer WAV-Datei rendert, um das analoge Signal am Pin zu erzeugen.

  • Der KSPIN_TOPO_SYNTHOUT_SRC Pin ist physisch mit dem Ausgabepin eines Synth-Filters verbunden, der z. B. einen MIDI-Stream aus einer Quelle wie z. B. einer .mid-Datei rendert, um das analoge Signal am Pin zu erzeugen.

  • Der KSPIN_TOPO_SYNTHIN_SRC Pin ist physisch mit einem Synthesizer verbunden, der ein analoges Signal generiert. (Beachten Sie, dass ein praktisches Hardwaredesign einen MIDI-Eingabestream von einer MPU-401 MIDI-Schnittstelle nutzen und direkt in das Wellenformat konvertieren kann, wobei der Topologiefilter vollständig umgangen wird.)

  • Der KSPIN_TOPO_MIC_SRC Pin ist physisch mit einer Eingangsbuchse verbunden, die ein analoges Signal von einem Mikrofon annimmt.

Die beiden Ausgabepins funktionieren wie folgt:

  • Der KSPIN_TOPO_LINEOUT_DST Pin ist physisch mit einer analogen Lineout-Buchse verbunden, die normalerweise eine Reihe von Lautsprechern antreibt.

  • Der KSPIN_TOPO_WAVEIN_DST Pin ist physisch mit dem Eingabepin eines Wellenfilters verbunden, der das analoge Signal in einen Wellenstrom konvertiert und in ein Ziel wie eine WAV-Datei schreibt.

Die Volume- und Stummschaltknoten (siehe KSNODETYPE_VOLUME und KSNODETYPE_MUTE) werden verwendet, um die Lautstärkestufen der verschiedenen Streams zu steuern. Der SUM-Knoten (siehe KSNODETYPE_SUM) mischt die Audiostreams aus den Wave- und MIDI-Eingaben. Der MUX-Knoten (siehe KSNODETYPE_MUX) wählt zwischen den beiden Eingabeströmen aus.

Die Abbildung verwendet einen gestrichelten Pfeil, um eine Verbindung zwischen zwei Knoten oder zwischen einem Pin und einem Knoten anzuzeigen. Der Pfeil zeigt in Die Richtung des Datenflusses. Das Diagramm zeigt insgesamt 13 Verbindungen, die jeweils einem der 13 Elemente im PCCONNECTION_DESCRIPTOR Array im vorherigen Codebeispiel entsprechen.

Zusätzlich zum Topologiefilter erstellt der Adaptertreiber weitere Filter ( Wave, FM Synth, Wellentabelle usw.), die mit den Pins des Topologiefilters verbunden werden.

Beispielsweise enthält der Wellenfilter, der physisch mit dem KSPIN_TOPO_WAVEOUT_SRC Pin des Topologiefilters verbunden ist, eine DAC (dargestellt durch einen KSNODETYPE_DAC-Knoten ), der PCM-Daten in das analoge Signal konvertiert, das er an den Pin des Topologiefilters ausgibt. Der FM-Synth oder ein wellenfähiger Synth-Filter, der physisch mit dem KSPIN_TOPO_SYNTHOUT_SRC Pin des Topologiefilters verbunden ist, konvertiert MIDI-Daten auf ähnliche Weise in ein analoges Signal, das er an den Pin des Topologiefilters ausgibt. Der Topologiefilter mischt die analogen Signale dieser beiden Pins und gibt das gemischte Signal an die Lautsprecher aus.

Die physischen Verbindungen des Topologiefilters zu anderen Filtern, die andere Hardwaregeräte auf demselben Adapter darstellen Karte müssen von anderen Arten von Verbindungen zu Filtern unterschieden werden. Beispielsweise können bestimmte Pins für Wave-, MIDI- und DirectMusic-Filter unter Softwaresteuerung verbunden oder getrennt werden.

Während des Gerätestarts registriert der Adaptertreiber die physischen Verbindungen des Topologiefilters, indem pcRegisterPhysicalConnection einmal pro Verbindung aufgerufen wird. Der Porttreiber benötigt diese Informationen, um auf KSPROPERTY_PIN_PHYSICALCONNECTION Get-Property-Anforderungen zu reagieren.