定义一个Filter的分发例程时,如有需要,可以指定DEFINE_KSFILTER_NODE_DESCRIPTORS以便在Filter里生成Node

一个典型的NODE_DESCRIPTORS如下所示

 

BDA驱动学习笔记(3):NODE例程const KSNODE_DESCRIPTOR DgtlTunerFilterNodeDescriptors[] =
BDA驱动学习笔记(3):NODE例程

 

这里定义了两个Node,每个Node都指定了Automation TableNode Type Name

一个典型的Automation Tale如下所示

BDA驱动学习笔记(3):NODE例程DEFINE_KSAUTOMATION_TABLE(RFTunerNodeAutomation)
BDA驱动学习笔记(3):NODE例程


这里只定义了属性集,方法集和事件集都被置为空。进一步的,

RFTunerNodeProperties定义如下

 

BDA驱动学习笔记(3):NODE例程DEFINE_KSPROPERTY_SET_TABLE(RFTunerNodeProperties)
BDA驱动学习笔记(3):NODE例程

 

可以看到,Tunner Node里扩展了KSPROPSETID_BdaFrequencyFilteKSPROPSETID_BdaSignalStats 两个属性集。更进一步的,

RFTunerBdaFrequencyFilter的定义如下

 

BDA驱动学习笔记(3):NODE例程
BDA驱动学习笔记(3):NODE例程
BDA驱动学习笔记(3):NODE例程DEFINE_KSPROPERTY_TABLE(RFTunerBdaFrequencyFilter)
BDA驱动学习笔记(3):NODE例程

 

该属性集中的KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIERKSPROPERTY_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后,还要指定它们的连接方式。

一个典型的连接定义如下

BDA驱动学习笔记(3):NODE例程const
BDA驱动学习笔记(3):NODE例程KSTOPOLOGY_CONNECTION TemplateTunerConnections[] 
=


这张表指定了三条连接,如注释中所讲,第一条从前一个filter出来,连到第0node的第0pin;第二条从第0Node的第1pin出来,连到第1Node的第0pin;第三条从第1Node的第1pin出来,连后后一个filter

指定完连接线路后,还要指定一个Node间的连接点。

一个典型的AntennaTransportJoints如下

BDA驱动学习笔记(3):NODE例程const
BDA驱动学习笔记(3):NODE例程ULONG   AntennaTransportJoints[] 
=


表明Node间的连接点是上面那张链接表中的第二条线路。连接点在指定Node的控制Pin时有用。为什么要指定控制Pin?因为Node从外部是没法访问的,想要访问Node,必须现访问该Node的控制Pin,然后让控制Pin去访问Node。如下图所示

 

BDA驱动学习笔记(3):NODE例程
Node1
处在Pin1Joint1之间,所以Node1的控制Pin就是Pin1;而Node2处在Joint1Pin2之间,所以Node2的控制PinPin2。大多数时候一张拓扑图中只有一个连接点。可以通过BdaPropertyGetControllingPinId 函数取得控制PinID

 

 

BDA架构允许一个驱动运行很多的实例,但是一个时间里只能有一个实例的状态处于运行状态,因为硬件资源往往只有一个。为此需要提供同步机制,BDA中用方法集来保持同步。一个典型的同步方法集如下所示:

 

BDA驱动学习笔记(3):NODE例程DEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods)

 

应用程序引发上述例程,例程实现中通知驱动做相应的操作。

 CFilter::StartChanges中,调用BdaStartChanges 方法通知驱动开始变更。

 CFilter::CheckChanges中,调用BdaCheckChanges方法通知驱动检查变更。

 CFilter::CommitChanges中,调用BdaCommitChanges方法通知驱动提交变更。

 CFilter::GetChangeState中,调用BdaGetChangeState方法获取当前状态。

 

 

最后交代一个原则:每次当driverfirmware,或者硬件发生改变时,都调用BdaFilterFactoryUpdateCacheData 更新DirectShow中相应的数据。

 

至此,BDA驱动的大体架构已出。

相关文章: