Pin Factorys
Die Pin-Factorys eines Audiofilters beschreiben alle Pins, die der Filter instanziieren kann. Wie bereits erwähnt, speichert ein Audio-Miniporttreiber Pininformationen in einem Array von PCPIN_DESCRIPTOR Strukturen. Jede Struktur gibt eine Pinfactory an, und eine Pinfactory wird durch ihren Index im Array identifiziert. Dieser Index wird häufig als Pin-ID bezeichnet.
Eine PCPIN_DESCRIPTOR-Struktur enthält eine Automatisierungstabelle und eine KSPIN_DESCRIPTOR-Struktur .
Die KSPIN_DESCRIPTOR-Struktur enthält die folgenden Informationen zu den Pins in der Pin factory:
Filterrelative Richtung des Datenflusses
Filterrelative Richtung des Kommunikationsflusses (In allen aktuellen Windows-Versionen verwenden KS-Filter IRPs für die Kommunikation.)
Anheften der Kategorie
Anzeigename
Instanzfunktionen
Datenformatfunktionen
Die Elemente Category und Name der Struktur geben die Pin-Kategorie und den Anzeigenamen der Pinfactory an. Für jede Pinfactory im Filter gibt der Miniporttreiber eine Kombination aus Kategorie - und Namens-GUIDs an, die zusammen die Pinfactory eindeutig identifizieren. Wenn zwei oder mehr Pinfactorys denselben Category-Wert verwenden, verfügt jede Pinfactory über einen Name-Wert , der sie von den anderen unterscheidet. Wenn nur eine einzelne Pinfactory über einen bestimmten Category-Wert verfügt, reicht dieser Wert aus, um die Pinfactory zu identifizieren, und der Name-Wert für diese Pinfactory kann auf NULL festgelegt werden. Ein Codierungsbeispiel finden Sie unter Verfügbarmachen der Filtertopologie. Informationen zu Anheftkategorien finden Sie unter Pin Category Property.
Eine Pinfactory gibt den Bereich der Datenformate an, den sie als Array erweiterter KSDATARANGE-Strukturen unterstützt:
Eine Pinfactory, die einen Bereich von Wave- oder DirectSound-Datenformaten für den Eingabe- oder Ausgabestream unterstützt, gibt ein Array von KSDATARANGE_AUDIO Strukturen an.
Eine Pinfactory, die eine Reihe von MIDI- oder DirectMusic-Datenformaten für den Eingabe- oder Ausgabestream unterstützt, gibt ein Array von KSDATARANGE_MUSIC-Strukturen an.
KSDATARANGE_AUDIO und KSDATARANGE_MUSIC sind erweiterte Versionen von KSDATARANGE. Beispiele für beide Arten von Datenbereichen finden Sie unter Audiodatenformate und Datenbereiche.
Bevor eine Senkennadel an einem Filter mit einem Quellpin eines anderen Filters verbunden wird, kann ein Graph-Generator (z. B. der SysAudio-Systemtreiber) die Datenbereiche nach einem kompatiblen Format durchsuchen. Der Graph-Generator ruft in der Regel den Datenschnitthandler des Filters auf, mit dem der Filter selbst ein kompatibles Format auswählen kann.
Ein Filter kann über mehrere Pinfactorys verfügen, und eine Pinfactory kann mehrere Pininstanzen unterstützen.
Mehrere Pinfactorys in einem Filter sind nützlich, um separate Datenpfade für die verschiedenen Datentypen zu unterscheiden, die durch den Filter fließen. Beispielsweise kann eine Pinfactory PCM-Datenströme unterstützen, und eine andere Pinfactory unterstützt möglicherweise AC-3-Streams.
Ein einzelner Filter kann das Rendern und Erfassen von Streams gleichzeitig unterstützen. Die Rendering- und Erfassungspfade verfügen über separate Sätze von Filterfactorys.
Wenn mehrere Pininstanzen in einer Senke-Pin-Factory vorhanden sind, bedeutet dies häufig eine Vermischung. In diesem Fall enthält der Filter einen SUM-Knoten (KSNODETYPE_SUM).
Pins sind wie Filter Kernelobjekte und werden durch Kernelhandles identifiziert. Das Handle für eine Pin-instance wird durch Aufrufen von KsCreatePin erstellt. Als Kernelobjekt kann ein Pin als Ziel eines IRP angegeben werden. Ein Client des Treibers gibt das Pinhandle an, wenn eine IOCTL-Anforderung an eine Pin gesendet wird.
Beim Erstellen eines Audiofilterdiagramms verknüpft SysAudio einen Filter mit einem anderen, indem seine Pins verbunden werden. Ein Quellpin aus einem Filter kann mit dem Senkenstift eines anderen Filters verbunden werden. Daten und IRPs vom Quellpin fließen über diese Verbindung in die Senkennadel. Um die Verbindung herzustellen, erstellt ein Graph-Generator (in der Regel SysAudio) zuerst den Quellpin, indem er KsCreatePin aufruft und dann die Senkennadel durch erneutes Aufrufen von KsCreatePin erstellt. Beim zweiten Aufruf gibt der Client jedoch an, dass die neue Senkennadel mit dem Quellpin verbunden werden soll, der beim ersten Aufruf erstellt wurde.