Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1180 lines
41 KiB

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
ObjDesc.cpp
Abstract:
Static object description data structures.
This file includes initial descriptors for all filter, pin, and node
objects exposed by this driver. It also include descriptors for the
properties, methods, and events on those objects.
--*/
#include "BDATuner.h"
#ifdef ALLOC_DATA_PRAGMA
#pragma const_seg("PAGECONST")
#endif // ALLOC_DATA_PRAGMA
#ifdef ALLOC_PRAGMA
#pragma code_seg("PAGE")
#endif // ALLOC_PRAGMA
//
// Before defining structures for nodes, pins, and filters,
// it may be useful to show the filter's template topology here.
//
// The sample filter's topology:
//
// Node Type 0 Node Type 1
// | |
// v v
// --------------- --------------------
// Antenna | | | | Transport
// In Pin --------| Tuner Node |--X--| Demodulator Node |------------ Out Pin
// ^ ^ | | ^ | | ^ ^
// | | --------------- | -------------------- | |
// | | | | |
// | -- Connection 0 -- Connection 1 -- Connection 2 |
// | Topology Joint |
// ---- Pin Type 0 Pin Type 1 ----
//
//
//===========================================================================
//
// Node definitions
//
// Nodes are special in that, though they are defined at the filter level,
// they are actually associated with a pin type. The filter's node
// descriptor list is actually a list of node types.
//
// BDA allows a node type to appear only once in a template topology.
// This means that a node in an actual filter topology can be uniquely
// identified by specifying the node type along with the actual input and
// output pin IDs of the the path that the node appears in.
//
// Note that the dispatch routines for nodes actually point to
// pin-specific methods because the context data associated with
// a node is stored in the pin context.
//
// Node property begin with a KSP_NODE structure that contains the node type of the node to which
// that property applies. This begs the question:
//
// "How is a node uniquely identified by only the node type?"
//
// The BDA Support Library uses the concept of a topology joint to solve
// this problem. Nodes upstream of a topology joint have their properties
// dispatched to the input pin of the path. Properties for nodes
// downstream of the joint are dispatched to the output pin of the path
// containing the node.
//
// Node properties and methods should only be accessed from the
// appropriate pin. The BDA Support Library helps assure this by
// automatically merging a node type's automation table onto the automation
// table of the correct pin. This pin is called the controlling pin
// for that node type.
//
//===========================================================================
typedef enum {
BDA_SAMPLE_TUNER_NODE = 0,
BDA_SAMPLE_DEMODULATOR_NODE
}BDA_SAMPLE_NODES;
//===========================================================================
//
// BDA Sample Tuner Node (Node Type 0) definitions
//
// Define structures here for the Properties, Methods, and Events
// available on the BDA Sample Tuner Node.
//
// This node is associated with an antenna input pin, therefore, the node
// properties should be set/retrieved using the antenna input pin. The
// BDA Support Library will automatically merge the node's automation
// table into the automation table for the antenna input pin.
//
// Properties and methods are dispatched to the Antenna class.
//
//===========================================================================
//
// BDA Sample Tune Frequency Filter
//
// Define dispatch routines for specific properties.
//
// One property is used to get and set the tuner's center frequency.
// For this property, define dispatch routines to get and set the frequency.
//
// Other properties can be used to get and set the tuner's frequency range,
// as well as to report signal strength.
//
// These properties must be supported by BDA and
// defined elsewhere (for example, in Bdamedia.h).
//
DEFINE_KSPROPERTY_TABLE(SampleTunerNodeFrequencyProperties)
{
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY(
CAntennaPin::GetCenterFrequency,
CAntennaPin::PutCenterFrequency
),
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY_MULTIPLIER(
NULL, NULL
),
#ifdef SATELLITE_TUNER
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_POLARITY(
NULL, NULL
),
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_RANGE(
NULL, NULL
),
#endif // SATELLITE_TUNER
#ifdef CHANNEL_BASED_TUNER
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_TRANSPONDER(
NULL, NULL
),
#endif // CHANNEL_BASED_TUNER
#ifdef DVBT_TUNER
DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_BANDWIDTH(
NULL, NULL
),
#endif // DVBT_TUNER
};
//
// BDA Signal Statistics Properties
//
// Defines the dispatch routines for the Signal Statistics Properties
// on the RF Tuner, Demodulator, and PID Filter Nodes
//
DEFINE_KSPROPERTY_TABLE(SampleRFSignalStatsProperties)
{
#ifdef OPTIONAL_SIGNAL_STATISTICS
DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH(
NULL, NULL
),
#endif // OPTIONAL_SIGNAL_STATISTICS
DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT(
CAntennaPin::GetSignalStatus,
NULL
),
};
//
// Define the Property Sets for the sample tuner node from the
// previously defined node properties and from property sets
// that BDA supports.
// These supported property sets must be defined elsewhere
// (for example, in Bdamedia.h).
//
// Associate the sample tuner node with the antenna input pin.
//
DEFINE_KSPROPERTY_SET_TABLE(SampleTunerNodePropertySets)
{
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaFrequencyFilter, // Property Set defined elsewhere
SIZEOF_ARRAY(SampleTunerNodeFrequencyProperties), // Number of properties in the array
SampleTunerNodeFrequencyProperties, // Property set array
0, // FastIoCount
NULL // FastIoTable
),
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaSignalStats, // Property Set defined elsewhere
SIZEOF_ARRAY(SampleRFSignalStatsProperties), // Number of properties in the array
SampleRFSignalStatsProperties, // Property set array
0, // FastIoCount
NULL // FastIoTable
)
};
//
// Define the Automation Table for the BDA sample tuner node.
//
DEFINE_KSAUTOMATION_TABLE(SampleTunerNodeAutomation) {
DEFINE_KSAUTOMATION_PROPERTIES(SampleTunerNodePropertySets),
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//===========================================================================
//
// Sample Demodulator Node definitions
//
// This structure defines the Properties, Methods, and Events
// available on the BDA Demodulator Node.
//
// This node is associated with a transport output pin and thus the node
// properties should be set/put using the transport output pin.
//
//===========================================================================
//
// BDA Signal Statistics Properties for Demodulator Node
//
// Defines the dispatch routines for the Signal Statistics Properties
// on the Demodulator Node.
//
DEFINE_KSPROPERTY_TABLE(SampleDemodSignalStatsProperties)
{
#ifdef OPTIONAL_SIGNAL_STATISTICS
DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY(
NULL, NULL
),
#endif // OPTIONAL_SIGNAL_STATISTICS
DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED(
CTransportPin::GetSignalStatus,
NULL
),
};
DEFINE_KSPROPERTY_TABLE(SampleAutoDemodProperties)
{
DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_START(
NULL,
CTransportPin::PutAutoDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_AUTODEMODULATE_STOP(
NULL,
CTransportPin::PutAutoDemodProperty
)
};
#if !ATSC_RECEIVER
//
// BDA Digital Demodulator Property Set for Demodulator Node
//
// Defines the dispatch routines for the Digital Demodulator Properties
// on the Demodulator Node.
//
DEFINE_KSPROPERTY_TABLE(SampleDigitalDemodProperties)
{
DEFINE_KSPROPERTY_ITEM_BDA_MODULATION_TYPE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_TYPE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_RATE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_TYPE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_RATE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_SYMBOL_RATE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
#if DVBS_RECEIVER
DEFINE_KSPROPERTY_ITEM_BDA_SPECTRAL_INVERSION(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
#endif // DVBS_RECEIVER
#if DVBT_RECEIVER
DEFINE_KSPROPERTY_ITEM_BDA_GUARD_INTERVAL(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
),
DEFINE_KSPROPERTY_ITEM_BDA_TRANSMISSION_MODE(
CTransportPin::GetDigitalDemodProperty,
CTransportPin::PutDigitalDemodProperty
)
#endif // DVBT_RECEIVER
};
#endif // !ATSC_RECEIVER
//
// Sample Demodulator Node Extension Properties
//
// Define dispatch routines for a set of driver specific
// demodulator node properties. This is how venders add support
// for properties that are specific to their hardware. They can
// access these properties through a KSProxy plugin.
//
DEFINE_KSPROPERTY_TABLE(BdaSampleDemodExtensionProperties)
{
DEFINE_KSPROPERTY_ITEM_BDA_SAMPLE_DEMOD_EXTENSION_PROPERTY1( // A read and write property
CTransportPin::GetExtensionProperties, // or NULL if not method to get the property
CTransportPin::PutExtensionProperties // or NULL if not method to put the property
),
DEFINE_KSPROPERTY_ITEM_BDA_SAMPLE_DEMOD_EXTENSION_PROPERTY2( //A read only property
CTransportPin::GetExtensionProperties, // or NULL if not method to get the property
NULL // or NULL if not method to put the property
),
DEFINE_KSPROPERTY_ITEM_BDA_SAMPLE_DEMOD_EXTENSION_PROPERTY3( //A write only property
NULL, // or NULL if not method to get the property
CTransportPin::PutExtensionProperties // or NULL if not method to put the property
),
};
//
// Demodulator Node Property Sets supported
//
// This table defines all property sets supported by the
// Demodulator Node associated with the transport output pin.
//
DEFINE_KSPROPERTY_SET_TABLE(SampleDemodNodePropertySets)
{
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaAutodemodulate, // Set
SIZEOF_ARRAY(SampleAutoDemodProperties), // PropertiesCount
SampleAutoDemodProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
),
#if !ATSC_RECEIVER
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaDigitalDemodulator, // Set
SIZEOF_ARRAY(SampleDigitalDemodProperties), // PropertiesCount
SampleDigitalDemodProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
),
#endif // !ATSC_RECEIVER
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaSignalStats, // Set
SIZEOF_ARRAY(SampleDemodSignalStatsProperties), // PropertiesCount
SampleDemodSignalStatsProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
),
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_BdaSampleDemodExtensionProperties, // Set
SIZEOF_ARRAY(BdaSampleDemodExtensionProperties), // Number of properties in the array
BdaSampleDemodExtensionProperties, // Property set array
0, // FastIoCount
NULL // FastIoTable
),
//
// Additional property sets for the node can be added here.
//
};
//
// Demodulator Node Automation Table
//
// This structure defines the Properties, Methods, and Events
// available on the BDA Demodulator Node.
// These are used to set the symbol rate, and Viterbi rate,
// as well as to report signal lock and signal quality.
//
DEFINE_KSAUTOMATION_TABLE(SampleDemodulatorNodeAutomation) {
DEFINE_KSAUTOMATION_PROPERTIES( SampleDemodNodePropertySets),
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//===========================================================================
//
// Antenna Pin Definitions
//
//===========================================================================
//
// The BDA Support Library automatically merges the RF tuner node properties,
// methods, and events onto the antenna pin's automation table. It also
// merges properties, methods, and events the that are require and
// supplied by the BDA Support Library.
//
//
// The hardware vendor may want to provide driver specific properties,
// methods, or events on the antenna pin or override those provided by
// the BDA Support Library. Such roperties, methods, and events will
// be defined here.
//
//
// Define the Automation Table for the antenna pin.
//
//
DEFINE_KSAUTOMATION_TABLE(AntennaAutomation) {
DEFINE_KSAUTOMATION_PROPERTIES_NULL,
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//
// Dispatch Table for the antenna pin.
//
const
KSPIN_DISPATCH
AntennaPinDispatch =
{
CAntennaPin::PinCreate, // Create
CAntennaPin::PinClose, // Close
NULL, // Process siganl data
NULL, // Reset
NULL, // SetDataFormat
CAntennaPin::PinSetDeviceState, // SetDeviceState
NULL, // Connect
NULL, // Disconnect
NULL, // Clock
NULL // Allocator
};
//
// Format the input antenna stream connection.
//
// Used to connect the input antenna pin to a specific upstream filter,
// such as the network provider.
//
const KS_DATARANGE_BDA_ANTENNA AntennaPinRange =
{
// insert the KSDATARANGE and KSDATAFORMAT here
{
sizeof( KS_DATARANGE_BDA_ANTENNA), // FormatSize
0, // Flags - (N/A)
0, // SampleSize - (N/A)
0, // Reserved
{ STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA }, // MajorFormat
{ STATIC_KSDATAFORMAT_SUBTYPE_NONE }, // SubFormat
{ STATIC_KSDATAFORMAT_SPECIFIER_NONE } // Specifier
}
};
// Format Ranges of Antenna Input Pin.
//
static PKSDATAFORMAT AntennaPinRanges[] =
{
(PKSDATAFORMAT) &AntennaPinRange,
// Add more formats here if additional antenna signal formats are supported.
//
};
//===========================================================================
//
// Transport Output Pin Definitions
//
//===========================================================================
//
// The BDA Support Library automatically merges the RF tuner node properties,
// methods, and events onto the antenna pin's automation table. It also
// merges properties, methods, and events the that are require and
// supplied by the BDA Support Library.
//
//
// The hardware vendor may want to provide driver specific properties,
// methods, or events on the antenna pin or override those provided by
// the BDA Support Library. Such roperties, methods, and events will
// be defined here.
//
//
// Define the Automation Table for the transport pin.
//
//
DEFINE_KSAUTOMATION_TABLE(TransportAutomation) {
DEFINE_KSAUTOMATION_PROPERTIES_NULL,
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//
// Dispatch Table for the transport Output pin.
//
// Since data on the transport is actually delivered to the
// PCI bridge in hardware, this pin does not process data.
//
// Connection of, and state transitions on, this pin help the
// driver to determine when to allocate hardware resources for
// each node.
//
const
KSPIN_DISPATCH
TransportPinDispatch =
{
CTransportPin::PinCreate, // Create
CTransportPin::PinClose, // Close
NULL, // Process
NULL, // Reset
NULL, // SetDataFormat
NULL, //SetDeviceState
NULL, // Connect
NULL, // Disconnect
NULL, // Clock
NULL // Allocator
};
//
// Format the output Transport Stream Connection
//
// Used to connect the output pin to a specific downstream filter
//
const KS_DATARANGE_BDA_TRANSPORT TransportPinRange =
{
// insert the KSDATARANGE and KSDATAFORMAT here
{
sizeof( KS_DATARANGE_BDA_TRANSPORT), // FormatSize
0, // Flags - (N/A)
0, // SampleSize - (N/A)
0, // Reserved
{ STATIC_KSDATAFORMAT_TYPE_STREAM }, // MajorFormat
{ STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT }, // SubFormat
{ STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT } // Specifier
},
// insert the BDA_TRANSPORT_INFO here
{
188, // ulcbPhyiscalPacket
312 * 188, // ulcbPhyiscalFrame
0, // ulcbPhyiscalFrameAlignment (no requirement)
0 // AvgTimePerFrame (not known)
}
};
// Format Ranges of Transport Output Pin.
//
static PKSDATAFORMAT TransportPinRanges[] =
{
(PKSDATAFORMAT) &TransportPinRange,
// Add more formats here if additional transport formats are supported.
//
};
// Medium GUIDs for the Transport Output Pin.
//
// This insures contection to the correct Capture Filter pin.
//
// {F102C41F-7FA1-4842-A0C8-DC41176EC844}
#define GUID_BdaSWRcv 0xf102c41f, 0x7fa1, 0x4842, 0xa0, 0xc8, 0xdc, 0x41, 0x17, 0x6e, 0xc8, 0x44
const KSPIN_MEDIUM TransportPinMedium =
{
GUID_BdaSWRcv, 0, 0
};
//===========================================================================
//
// Filter definitions
//
// Define arrays here that contain the types of nodes and pins that are possible for the filter
// Define structures here that describe Properties, Methods, and Events available on the filter
//
// Properties can be used to set and retrieve information for the filter.
// Methods can be used to perform operations on the filter.
//
//===========================================================================
//
// Template Node Descriptors
//
// Define an array that contains all the node types that are available in the template
// topology of the filter.
// These node types must be supported by BDA and
// defined elsewhere (for example, in Bdamedia.h).
//
const
KSNODE_DESCRIPTOR
NodeDescriptors[] =
{
{
&SampleTunerNodeAutomation, // Point to KSAUTOMATION_TABLE structure for the node's automation table
&KSNODE_BDA_RF_TUNER, // Point to the guid that defines function of the node
NULL // Point to the guid that represents the name of the topology node
},
#if ATSC_RECEIVER
{
&SampleDemodulatorNodeAutomation, // Point to KSAUTOMATION_TABLE
&KSNODE_BDA_8VSB_DEMODULATOR, // Point to the guid that defines the topology node
NULL // Point to the guid that represents the name of the topology node
}
#elif DVBS_RECEIVER
{
&SampleDemodulatorNodeAutomation, // Point to KSAUTOMATION_TABLE
&KSNODE_BDA_QPSK_DEMODULATOR, // Point to the guid that defines the topology node
NULL // Point to the guid that represents the name of the topology node
}
#elif DVBT_RECEIVER
{
&SampleDemodulatorNodeAutomation, // Point to KSAUTOMATION_TABLE
&KSNODE_BDA_COFDM_DEMODULATOR, // Point to the guid that defines the topology node
NULL // Point to the guid that represents the name of the topology node
}
#elif CABLE_RECEIVER
{
&SampleDemodulatorNodeAutomation, // Point to KSAUTOMATION_TABLE
&KSNODE_BDA_QAM_DEMODULATOR, // Point to the guid that defines the topology node
NULL // Point to the guid that represents the name of the topology node
}
#endif
};
//
// Initial Pin Descriptors
//
// This data structure defines the pins that will appear on the filer
// when it is first created.
//
// All BDA filters should expose at lease one input pin to insure that
// the filter can be properly inserted in a BDA receiver graph. The
// initial pins can be created in a number of ways.
//
// The initial filters descriptor passed in to BdaInitFilter can include
// a list of n pin descriptors that correspond to the first n of m pin
// descriptors in the template filter descriptor. This list of pin
// descriptors will usually only include those input pins that are
// ALWAYS exposed by the filter in question.
//
// Alternatively, the driver may call BdaCreatePin from its filter Create
// dispatch function for each pin that it ALWAYS wants exposed.
//
// This filter uses an initial filter descriptor to force the Antenna
// input pin to always be exposed.
//
const
KSPIN_DESCRIPTOR_EX
InitialPinDescriptors[] =
{
// Antenna Input Pin
//
{
&AntennaPinDispatch, // Point to the dispatch table for the input pin
&AntennaAutomation, // Point to the automation table for the input pin
{ // Specify members of a KSPIN_DESCRIPTOR structure for the input pin
0, // Interfaces
NULL,
0, // Mediums
NULL,
SIZEOF_ARRAY(AntennaPinRanges),
AntennaPinRanges,
KSPIN_DATAFLOW_IN, // specifies that data flow is into the pin
KSPIN_COMMUNICATION_BOTH, // specifies that the pin factory instantiates pins
// that are both IRP sinks and IRP sources
NULL, // Category GUID
NULL, // GUID of the localized Unicode string name for the pin type
0
}, // Specify flags
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
KSPIN_FLAG_FIXED_FORMAT,
1, // Specify the maximum number of possible instances of the input pin
1, // Specify the number of instances of this pin type that are necessary for proper functioning of this filter
NULL, // Point to KSALLOCATOR_FRAMING_EX structure for allocator framing
CAntennaPin::IntersectDataFormat // Point to the data intersection handler function
}
};
//
// Template Pin Descriptors
//
// This data structure defines the pin types available in the filters
// template topology. These structures will be used to create a
// KDPinFactory for a pin type when BdaCreatePin or BdaMethodCreatePin
// are called.
//
// This structure defines ALL pins the filter is capable of supporting,
// including those pins which may only be created dynamically by a ring
// 3 component such as a Network Provider.
//
//
const
KSPIN_DESCRIPTOR_EX
TemplatePinDescriptors[] =
{
// Antenna Input Pin
//
{
&AntennaPinDispatch, // Point to the dispatch table for the input pin
&AntennaAutomation, // Point to the automation table for the input pin
{ // Specify members of a KSPIN_DESCRIPTOR structure for the input pin
0, // Interfaces
NULL,
0, // Mediums
NULL,
SIZEOF_ARRAY(AntennaPinRanges),
AntennaPinRanges,
KSPIN_DATAFLOW_IN, // specifies that data flow is into the pin
KSPIN_COMMUNICATION_BOTH, // specifies that the pin factory instantiates pins
// that are both IRP sinks and IRP sources
NULL, // Category GUID
NULL, // GUID of the localized Unicode string name for the pin type
0
}, // Specify flags
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
KSPIN_FLAG_FIXED_FORMAT,
1, // Specify the maximum number of possible instances of the input pin
1, // Specify the number of instances of this pin type that are necessary for proper functioning of this filter
NULL, // Point to KSALLOCATOR_FRAMING_EX structure for allocator framing
CAntennaPin::IntersectDataFormat // Point to the data intersection handler function
},
// Tranport Output Pin
//
{
&TransportPinDispatch, // Point to the dispatch table for the output pin
&TransportAutomation, // Point to the automation table for the output pin
{ // Specify members of a KSPIN_DESCRIPTOR structure for the output pin
0, // Interfaces
NULL,
1, // Mediums
&TransportPinMedium,
SIZEOF_ARRAY(TransportPinRanges),
TransportPinRanges,
// 0,
// NULL,
KSPIN_DATAFLOW_OUT, // specifies that data flow is out of the pin
KSPIN_COMMUNICATION_BOTH, // specifies that the pin factory instantiates pins
// that are both IRP sinks and IRP sources
// NULL,//Name
// NULL,//Category
(GUID *) &PINNAME_BDA_TRANSPORT, // Category GUID
(GUID *) &PINNAME_BDA_TRANSPORT, // GUID of the localized Unicode string
// name for the pin type
0
}, // Specify flags
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
KSPIN_FLAG_FIXED_FORMAT,
1, // Specify the maximum number of possible instances of the output pin
0, // Specify the number of instances of this pin type that are necessary for proper functioning of this filter
NULL, // Allocator Framing
CTransportPin::IntersectDataFormat // Point to the data intersection handler function
}
};
//
// BDA Device Topology Property Set
//
// The BDA Support Library supplies a default implementation of the
// BDA Device Topology Property Set. If the driver needs to override
// this default implemenation, the definitions for the override properties
// will be defined here.
//
//
// BDA Change Sync Method Set
//
// The Change Sync Method Set is required on BDA filters. Setting a
// node property should not become effective on the underlying device
// until CommitChanges is called.
//
// The BDA Support Library provides routines that handle committing
// changes to topology. The BDA Support Library routines should be
// called from the driver's implementation before the driver implementation
// returns.
//
DEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods)
{
DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(
CFilter::StartChanges, // Calls BdaStartChanges
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(
CFilter::CheckChanges, // Calls BdaCheckChanges
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(
CFilter::CommitChanges, // Calls BdaCommitChanges
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(
CFilter::GetChangeState, // Calls BdaGetChangeState
NULL
)
};
// Override the standard pin medium property set so that we can provide
// device specific medium information.
//
// Because the property is on a Pin Factory and not on a pin instance,
// this is a filter property.
//
DEFINE_KSPROPERTY_TABLE( SampleFilterPropertyOverrides)
{
DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(
CFilter::GetMedium
)
};
DEFINE_KSPROPERTY_SET_TABLE(SampleFilterPropertySets)
{
DEFINE_KSPROPERTY_SET
(
&KSPROPSETID_Pin, // Property Set GUID
SIZEOF_ARRAY(SampleFilterPropertyOverrides), // Number of Properties
SampleFilterPropertyOverrides, // Array of KSPROPERTY_ITEM structures
0, // FastIoCount
NULL // FastIoTable
)
//
// Additional property sets for the filter can be added here.
//
};
//
// BDA Device Configuration Method Set
//
// The BDA Support Library provides a default implementation of
// the BDA Device Configuration Method Set. In this example, the
// driver overrides the CreateTopology method. Note that the
// support libraries CreateTopology method is called before the
// driver's implementation returns.
//
DEFINE_KSMETHOD_TABLE(BdaDeviceConfigurationMethods)
{
DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY(
CFilter::CreateTopology, // Calls BdaMethodCreateTopology
NULL
)
};
//
// Define an array of method sets that the filter supports
//
DEFINE_KSMETHOD_SET_TABLE(FilterMethodSets)
{
DEFINE_KSMETHOD_SET
(
&KSMETHODSETID_BdaChangeSync, // Method set GUID
SIZEOF_ARRAY(BdaChangeSyncMethods), // Number of methods
BdaChangeSyncMethods, // Array of KSMETHOD_ITEM structures
0, // FastIoCount
NULL // FastIoTable
),
DEFINE_KSMETHOD_SET
(
&KSMETHODSETID_BdaDeviceConfiguration, // Method set GUID
SIZEOF_ARRAY(BdaDeviceConfigurationMethods), // Number of methods
BdaDeviceConfigurationMethods, // Array of KSMETHOD_ITEM structures
0, // FastIoCount
NULL // FastIoTable
)
};
//
// Filter Automation Table
//
// Lists all Property, Method, and Event Set tables for the filter
//
DEFINE_KSAUTOMATION_TABLE(FilterAutomation) {
//DEFINE_KSAUTOMATION_PROPERTIES(SampleFilterPropertySets),
DEFINE_KSAUTOMATION_PROPERTIES_NULL,
DEFINE_KSAUTOMATION_METHODS(FilterMethodSets),
DEFINE_KSAUTOMATION_EVENTS_NULL
};
//
// Filter Dispatch Table
//
// Lists the dispatch routines for major events at the filter
// level.
//
const
KSFILTER_DISPATCH
FilterDispatch =
{
CFilter::Create, // Create
CFilter::FilterClose, // Close
NULL, // Process
NULL // Reset
};
//
// Define the name GUID for our digital tuner filter.
//
// NOTE! You must use a different GUID for each type of filter that
// your driver exposes.
//
#define STATIC_KSNAME_BdaSWTunerFilter\
0x91b0cc87L, 0x9905, 0x4d65, 0xa0, 0xd1, 0x58, 0x61, 0xc6, 0xf2, 0x2c, 0xbf
DEFINE_GUIDSTRUCT("91B0CC87-9905-4d65-A0D1-5861C6F22CBF", KSNAME_BdaSWTunerFilter);
#define KSNAME_BdaSWTunerFilter DEFINE_GUIDNAMED(KSNAME_BdaSWTunerFilter)
// Must match the KSSTRING used in the installation INFs interface sections
// AND must match the KSNAME GUID above.
//
#define KSSTRING_BdaSWTunerFilter L"{91B0CC87-9905-4d65-A0D1-5861C6F22CBF}"
//
// Define the Filter Factory Descriptor for the filter
//
// This structure brings together all of the structures that define
// the tuner filter as it appears when it is first instantiated.
// Note that not all of the template pin and node types may be exposed as
// pin and node factories when the filter is first instanciated.
//
// If a driver exposes more than one filter, each filter must have a
// unique ReferenceGuid.
//
DEFINE_KSFILTER_DESCRIPTOR(InitialFilterDescriptor)
{
&FilterDispatch, // Dispatch
&FilterAutomation, // AutomationTable
KSFILTER_DESCRIPTOR_VERSION, // Version
0, // Flags
&KSNAME_BdaSWTunerFilter, // ReferenceGuid
DEFINE_KSFILTER_PIN_DESCRIPTORS(InitialPinDescriptors),
// PinDescriptorsCount; must expose at least one pin
// PinDescriptorSize; size of each item
// PinDescriptors; table of pin descriptors
DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_NETWORK_TUNER),
// CategoriesCount; number of categories in the table
// Categories; table of categories
DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL,
// NodeDescriptorsCount; in this case, 0
// NodeDescriptorSize; in this case, 0
// NodeDescriptors; in this case, NULL
DEFINE_KSFILTER_DEFAULT_CONNECTIONS,
// Automatically fills in the connections table for a filter which defines no explicit connections
// ConnectionsCount; number of connections in the table
// Connections; table of connections
NULL // ComponentId; in this case, no ID is provided
};
//===========================================================================
//
// Define Filter Template Topology
//
//===========================================================================
//
// Define BDA Template Topology Connections
//
// Lists the Connections that are possible between pin types and
// node types. This, together with the Template Filter Descriptor, and
// the Pin Pairings, describe how topologies can be created in the filter.
//
// =========== ============
// AntennaPin ----| RF Node |--Joint--|Demod Node|----TransportPin
// =========== ============
//
// The RF Node of this filter is controlled by the Antenna input pin.
// RF properties will be set as NODE properties (with NodeType == 0)
// on the filter's Antenna Pin
//
// The Demodulator Node of this filter is controlled by the Transport output pin.
// Demod properties will be set as NODE properties (with NodeType == 1)
// on the filter's Transport Pin
//
const
KSTOPOLOGY_CONNECTION TemplateFilterConnections[] =
{ // KSFILTER_NODE is defined as ((ULONG)-1) in ks.h
// Indicate pin types by the item number is the TemplatePinDescriptors array.
// Indicate node types by either the item number in the NodeDescriptors array
// or the element in the BDA_SAMPLE_NODE enumeration.
{ KSFILTER_NODE, 0, BDA_SAMPLE_TUNER_NODE, 0},
{ BDA_SAMPLE_TUNER_NODE, 1, BDA_SAMPLE_DEMODULATOR_NODE, 0},
{ BDA_SAMPLE_DEMODULATOR_NODE, 1, KSFILTER_NODE, 1}
};
//
// Template Joints between the Antenna and Transport Pin Types.
//
// Lists the template joints between the Antenna Input Pin Type and
// the Transport Output Pin Type.
//
// In this case the RF Node is considered to belong to the antennea input
// pin and the 8VSB Demodulator Node is considered to belong to the
// tranport stream output pin.
//
const
ULONG AntennaTransportJoints[] =
{
1 // joint occurs between the two node types (second element in array)
// indicates that 1st node is controlled by input pin and 2nd node by output pin
};
//
// Define Template Pin Parings.
//
// Array of BDA_PIN_PAIRING structures that are used to determine
// which nodes get duplicated when more than one output pin type is
// connected to a single input pin type or when more that one input pin
// type is connected to a single output pin type.
//
const
BDA_PIN_PAIRING TemplatePinPairings[] =
{
// Input pin to Output pin Topology Joints
//
{
0, // ulInputPin; 0 element in the TemplatePinDescriptors array.
1, // ulOutputPin; 1 element in the TemplatePinDescriptors array.
1, // ulcMaxInputsPerOutput
1, // ulcMinInputsPerOutput
1, // ulcMaxOutputsPerInput
1, // ulcMinOutputsPerInput
SIZEOF_ARRAY(AntennaTransportJoints), // ulcTopologyJoints
AntennaTransportJoints // pTopologyJoints; array of joints
}
// If applicable, list topology of joints between other pins.
//
};
//
// Define the Filter Factory Descriptor that the BDA support library uses
// to create template topology for the filter.
//
// This KSFILTER_DESCRIPTOR structure combines the structures that
// define the topologies that the filter can assume as a result of
// pin factory and topology creation methods.
// Note that not all of the template pin and node types may be exposed as
// pin and node factories when the filter is first instanciated.
//
DEFINE_KSFILTER_DESCRIPTOR(TemplateFilterDescriptor)
{
&FilterDispatch, // Dispatch
&FilterAutomation, // AutomationTable
KSFILTER_DESCRIPTOR_VERSION, // Version
0, // Flags
&KSNAME_BdaSWTunerFilter, // ReferenceGuid
DEFINE_KSFILTER_PIN_DESCRIPTORS(TemplatePinDescriptors),
// PinDescriptorsCount; exposes all template pins
// PinDescriptorSize; size of each item
// PinDescriptors; table of pin descriptors
DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_NETWORK_TUNER),
// CategoriesCount; number of categories in the table
// Categories; table of categories
DEFINE_KSFILTER_NODE_DESCRIPTORS(NodeDescriptors),
// NodeDescriptorsCount; exposes all template nodes
// NodeDescriptorSize; size of each item
// NodeDescriptors; table of node descriptors
DEFINE_KSFILTER_CONNECTIONS(TemplateFilterConnections),
// ConnectionsCount; number of connections in the table
// Connections; table of connections
NULL // ComponentId; in this case, no ID is provided
};
//
// Define BDA Template Topology Descriptor for the filter.
//
// This structure combines the filter descriptor and pin pairings that
// the BDA support library uses to create an instance of the filter.
//
const
BDA_FILTER_TEMPLATE
BdaFilterTemplate =
{
&TemplateFilterDescriptor,
SIZEOF_ARRAY(TemplatePinPairings),
TemplatePinPairings
};
//===========================================================================
//
// Define the Device
//
//===========================================================================
//
// Define Device Dispatch Table
//
// List the dispatch routines for the major events that occur
// during the existence of the underlying device.
//
extern
const
KSDEVICE_DISPATCH
DeviceDispatch =
{
CDevice::Create, // Add
CDevice::Start, // Start
NULL, // PostStart
NULL, // QueryStop
NULL, // CancelStop
NULL, // Stop
NULL, // QueryRemove
NULL, // CancelRemove
NULL, // Remove
NULL, // QueryCapabilities
NULL, // SurpriseRemoval
NULL, // QueryPower
NULL // SetPower
};
//
// Define Device Descriptor
//
// Combines structures that define the device and any non-BDA
// intial filter factories that can be created on it.
// Note that this structure does not include the template topology
// structures as they are specific to BDA.
//
extern
const
KSDEVICE_DESCRIPTOR
DeviceDescriptor =
{
&DeviceDispatch, // Dispatch
0, // SIZEOF_ARRAY( FilterDescriptors), // FilterDescriptorsCount
NULL, // FilterDescriptors // FilterDescriptors
};