對應連線拓撲
為了讓 BDA 支援程式庫代表 BDA 迷你驅動程式將屬性和方法提供給 Ring 3 中的應用程式,BDA 迷你驅動程式必須提供其連線拓撲與 BDA 支援程式庫的對應。 BDA 迷你驅動程式會在 BDA_TEMPLATE_CONNECTION 結構的陣列中提供此對應。 當BdaCreateFilterFactory 支援函式呼叫 BdaCreateFilterFactory支援函式時,BDA 迷你驅動程式會在KSTOPOLOGY_CONNECTION結構的陣列中傳遞這個BDA_TEMPLATE_CONNECTION陣列。 如需詳細資訊 ,請參閱啟動 BDA Minidriver 。 此陣列提供節點與針腳類型之間所有可能連線的表示,這些連接可在篩選內或篩選準則與相鄰篩選之間建立。
網路提供者篩選準則隨後可以在 BDA 迷你驅動程式的篩選實例上設定KSPROPSETID_BdaTopology屬性的 KSPROPERTY_BDA_TEMPLATE_CONNECTIONS 屬性要求,以擷取迷你驅動程式的連線拓撲。 BDA 迷你驅動程式接著會呼叫 BdaPropertyTemplateConnections 支援函式,此函式會傳回篩選 (BDA_TEMPLATE_CONNECTION結構的範本連接清單,) KSTOPOLOGY_CONNECTION結構的陣列中。 BDA_TEMPLATE_CONNECTION 結構的成員會識別下列連線的節點和針腳類型:
節點和釘選類型,連接開始的位置
連線結束的節點和針腳類型
將節點類型設定為值 -1,表示連接會分別在上游或下游篩選的針腳開始或結束。 否則,節點類型的值會對應至內部節點類型之以零起始陣列中的元素索引。 此陣列是 KSNODE_DESCRIPTOR 結構的陣列。 針腳類型的值會對應至 BDA 迷你驅動程式範本篩選描述項中可用之以零起始的針腳類型陣列中的元素索引。 此陣列是 KSPIN_DESCRIPTOR_EX 結構的陣列。
下列程式碼片段顯示 BDA 迷你驅動程式範本篩選描述項中可用的節點類型和釘選類型的範例陣列:
//
// Template Node Descriptors
//
// This array describes all Node Types available in the template
// topology of the filter.
//
const
KSNODE_DESCRIPTOR
NodeDescriptors[] =
{
{ // 0 node type
&RFTunerNodeAutomation,// PKSAUTOMATION_TABLE AutomationTable;
&KSNODE_BDA_RF_TUNER, // Type
NULL // Name
},
{ // 1 node type
&VSB8DemodulatorNodeAutomation, // PKSAUTOMATION_TABLE
// AutomationTable;
&KSNODE_BDA_8VSB_DEMODULATOR, // Type
NULL // Name
}
};
//
// Template Pin Descriptors
//
// This data structure defines the pin types available in the filters
// template topology. These structures will be used to create a
// pin factory ID for a pin type when BdaMethodCreatePin is called.
//
const
KSPIN_DESCRIPTOR_EX
TemplatePinDescriptors[] =
{
// Antenna Pin
// 0 pin type
{
&AntennaPinDispatch,
&AntennaAutomation, // AntennaPinAutomation
{
0, // Interfaces
NULL,
0, // Mediums
NULL,
SIZEOF_ARRAY(AntennaPinRanges),
AntennaPinRanges,
KSPIN_DATAFLOW_IN,
KSPIN_COMMUNICATION_BOTH,
NULL, // Name
NULL, // Category
0
},
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
KSPIN_FLAG_FIXED_FORMAT,
1, // InstancesPossible
0, // InstancesNecessary
NULL, // Allocator Framing
NULL // PinIntersectHandler
},
// Transport Pin
// 1 pin type
{
&TransportPinDispatch,
&TransportAutomation, // TransportPinAutomation
{
0, // Interfaces
NULL,
1, // Mediums
&TransportPinMedium,
SIZEOF_ARRAY(TransportPinRanges),
TransportPinRanges,
KSPIN_DATAFLOW_OUT,
KSPIN_COMMUNICATION_BOTH,
(GUID *) &PINNAME_BDA_TRANSPORT, // Name
(GUID *) &PINNAME_BDA_TRANSPORT, // Category
0
},
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
KSPIN_FLAG_FIXED_FORMAT,
1,
1, // InstancesNecessary
NULL, // Allocator Framing
NULL // PinIntersectHandler
}
};
下列程式碼片段顯示範本連線和聯合陣列的範例:
//
// BDA Template Topology Connections
//
// Lists the possible connections between pin types and
// node types. This structure along with the BDA_FILTER_TEMPLATE,
// KSFILTER_DESCRIPTOR, and BDA_PIN_PAIRING structures
// describe how topologies are created in the filter.
//
const
KSTOPOLOGY_CONNECTION TemplateTunerConnections[] =
{
{ -1, 0, 0, 0}, // from upstream filter to 0 pin of 0 node
{ 0, 1, 1, 0}, // from 1 pin of 0 node to 0 pin of 1 node
{ 1, 1, -1, 1}, // from 1 pin of 1 node to downstream filter
};
//
// Lists the template joints between antenna (input) and transport
// (output) pin types. Values given to joints correspond to indexes
// of elements in the preceding KSTOPOLOGY_CONNECTION array.
//
// For this template topology, the RF node (0) belongs to the antenna
// pin and the 8VSB demodulator node (1) belongs to the transport pin
//
const
ULONG AntennaTransportJoints[] =
{
1 // Second element in the preceding KSTOPOLOGY_CONNECTION array.
};