定义一个Filter的分发例程时,如有需要,可以指定DEFINE_KSFILTER_NODE_DESCRIPTORS以便在Filter里生成Node。
一个典型的NODE_DESCRIPTORS如下所示
const
KSNODE_DESCRIPTOR DgtlTunerFilterNodeDescriptors[]
=
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
![](http://img.e-com-net.com/image/product/437570a32a8e47669b1b8f34e2a85bac.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&RFTunerNodeAutomation, // PKSAUTOMATION_TABLE AutomationTable;
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&KSNODE_BDA_RF_TUNER, // Type
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&guidTunerName // Name
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
},
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
![](http://img.e-com-net.com/image/product/437570a32a8e47669b1b8f34e2a85bac.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&COFDMDemodulatorNodeAutomation, // PKSAUTOMATION_TABLE AutomationTable;
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&KSNODE_BDA_COFDM_DEMODULATOR, // Type
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&guidDemodName // Name
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
}
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
这里定义了两个Node,每个Node都指定了Automation Table,Node Type 和Name。
一个典型的Automation Tale如下所示
DEFINE_KSAUTOMATION_TABLE(RFTunerNodeAutomation)
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSAUTOMATION_PROPERTIES(RFTunerNodeProperties),
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSAUTOMATION_METHODS_NULL,
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSAUTOMATION_EVENTS_NULL
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
这里只定义了属性集,方法集和事件集都被置为空。进一步的,
RFTunerNodeProperties定义如下
DEFINE_KSPROPERTY_SET_TABLE(RFTunerNodeProperties)
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSPROPERTY_SET
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
(
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&KSPROPSETID_BdaFrequencyFilter, // Set
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
SIZEOF_ARRAY(RFTunerBdaFrequencyFilter), // PropertiesCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerBdaFrequencyFilter, // PropertyItems
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0, // FastIoCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL // FastIoTable
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
),
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSPROPERTY_SET
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
(
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
&KSPROPSETID_BdaSignalStats, // Set
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
SIZEOF_ARRAY(RFTunerBdaSignalStats), // PropertiesCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerBdaSignalStats, // PropertyItems
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0, // FastIoCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL // FastIoTable
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
)
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
可以看到,Tunner Node里扩展了KSPROPSETID_BdaFrequencyFilte和KSPROPSETID_BdaSignalStats 两个属性集。更进一步的,
RFTunerBdaFrequencyFilter的定义如下
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
DEFINE_KSPROPERTY_TABLE(RFTunerBdaFrequencyFilter)
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSPROPERTY_ITEM
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
(
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER, // 1
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerNodeGetFrequencyMultiplier, // GetSupported or Handler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
sizeof(KSP_NODE), // MinProperty
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
sizeof(DWORD), // MinData
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerNodeSetFrequencyMultiplier, // SetSupported or Handler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // Values
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0, // RelationsCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // Relations
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // SupportHandler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0 // SerializedSize
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
),
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
DEFINE_KSPROPERTY_ITEM
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
(
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
KSPROPERTY_BDA_RF_TUNER_FREQUENCY, // 1
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerNodeGetFrequency, // GetSupported or Handler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
sizeof(KSP_NODE), // MinProperty
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
sizeof(DWORD), // MinData
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
RFTunerNodeSetFrequency, // SetSupported or Handler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // Values
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0, // RelationsCount
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // Relations
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
NULL, // SupportHandler
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
0 // SerializedSize
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
)
![](http://img.e-com-net.com/image/product/b5ccfbfdc70d443ba19cbdc6a5005b86.gif)
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
该属性集中的KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER和KSPROPERTY_BDA_RF_TUNER_FREQUENCY属性被扩展。
BDA架构目前提供的Node Type有如下几个
KSNODE_BDA_RF_TUNER
KSNODE_BDA_QAM_DEMODULATOR
KSNODE_BDA_QPSK_DEMODULATOR
KSNODE_BDA_8VSB_DEMODULATOR
KSNODE_BDA_COFDM_DEMODULATOR
KSNODE_BDA_OPENCABLE_POD
KSNODE_BDA_COMMON_CA_POD
KSNODE_BDA_PID_FILTER
KSNODE_BDA_IP_SINK
Node Name由自己指定,只是不能有重复。
指定完Node后,还要指定它们的连接方式。
一个典型的连接定义如下
const
KSTOPOLOGY_CONNECTION TemplateTunerConnections[]
=
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
![](http://img.e-com-net.com/image/product/437570a32a8e47669b1b8f34e2a85bac.gif)
{-1, 0, 0, 0}, // from upstream filter to 0 pin of 0 node
![](http://img.e-com-net.com/image/product/437570a32a8e47669b1b8f34e2a85bac.gif)
{0, 1, 1, 0}, // from 1 pin of 0 node to 0 pin of 1 node
![](http://img.e-com-net.com/image/product/437570a32a8e47669b1b8f34e2a85bac.gif)
{1, 1, -1, 1}, // from 1 pin of 1 node to downstream filter
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
这张表指定了三条连接,如注释中所讲,第一条从前一个filter出来,连到第0个node的第0个pin;第二条从第0个Node的第1个pin出来,连到第1个Node的第0个pin;第三条从第1个Node的第1个pin出来,连后后一个filter。
指定完连接线路后,还要指定一个Node间的连接点。
一个典型的AntennaTransportJoints如下
const
ULONG AntennaTransportJoints[]
=
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
1 // Second element in the preceding KSTOPOLOGY_CONNECTION array.
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
表明Node间的连接点是上面那张链接表中的第二条线路。连接点在指定Node的控制Pin时有用。为什么要指定控制Pin?因为Node从外部是没法访问的,想要访问Node,必须现访问该Node的控制Pin,然后让控制Pin去访问Node。如下图所示
![BDA驱动学习笔记(3):NODE例程](http://img.e-com-net.com/image/product/fe742909477d4669a5a80aebdfb048f4.jpg)
Node1处在Pin1和Joint1之间,所以Node1的控制Pin就是Pin1;而Node2处在Joint1和Pin2之间,所以Node2的控制Pin是Pin2。大多数时候一张拓扑图中只有一个连接点。可以通过BdaPropertyGetControllingPinId 函数取得控制Pin的ID。
BDA架构允许一个驱动运行很多的实例,但是一个时间里只能有一个实例的状态处于运行状态,因为硬件资源往往只有一个。为此需要提供同步机制,BDA中用方法集来保持同步。一个典型的同步方法集如下所示:
DEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods)
![](http://img.e-com-net.com/image/product/8bf85857a9e14d23a651e7c8ef856bcc.gif)
{
DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(
CFilter::StartChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(
CFilter::CheckChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(
CFilter::CommitChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(
CFilter::GetChangeState,
NULL
)
}
;
![](http://img.e-com-net.com/image/product/46339e8aae704cb1a8b93e7cd90036c0.gif)
应用程序引发上述例程,例程实现中通知驱动做相应的操作。
在 CFilter::StartChanges中,调用BdaStartChanges 方法通知驱动开始变更。
在 CFilter::CheckChanges中,调用BdaCheckChanges方法通知驱动检查变更。
在 CFilter::CommitChanges中,调用BdaCommitChanges方法通知驱动提交变更。
在 CFilter::GetChangeState中,调用BdaGetChangeState方法获取当前状态。
最后交代一个原则:每次当driver,firmware,或者硬件发生改变时,都调用BdaFilterFactoryUpdateCacheData 更新DirectShow中相应的数据。
至此,
BDA
驱动的大体架构已出。