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

本文详细介绍了BDA架构中Filter的节点定义、自动化表格、属性集、方法集等内容,并阐述了节点之间的连接方式及同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

一个典型的NODE_DESCRIPTORS如下所示

 

None.gifconst KSNODE_DESCRIPTOR DgtlTunerFilterNodeDescriptors[] =
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif       
dot.gif{
InBlock.gif
InBlock.gif       
&RFTunerNodeAutomation,      // PKSAUTOMATION_TABLE AutomationTable;
InBlock.gif

InBlock.gif       
&KSNODE_BDA_RF_TUNER,   // Type
InBlock.gif

InBlock.gif       
&guidTunerName               // Name
InBlock.gif

ExpandedSubBlockEnd.gif       }
,
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif       
dot.gif{
InBlock.gif
InBlock.gif       
&COFDMDemodulatorNodeAutomation, // PKSAUTOMATION_TABLE AutomationTable;
InBlock.gif

InBlock.gif       
&KSNODE_BDA_COFDM_DEMODULATOR, // Type
InBlock.gif

InBlock.gif       
&guidDemodName                  // Name
InBlock.gif

ExpandedSubBlockEnd.gif       }

InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gif

 

这里定义了两个Node,每个Node都指定了Automation Table,Node Type 和Name。

一个典型的Automation Tale如下所示

None.gifDEFINE_KSAUTOMATION_TABLE(RFTunerNodeAutomation)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif       DEFINE_KSAUTOMATION_PROPERTIES(RFTunerNodeProperties),
InBlock.gif
InBlock.gif       DEFINE_KSAUTOMATION_METHODS_NULL,
InBlock.gif
InBlock.gif       DEFINE_KSAUTOMATION_EVENTS_NULL
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gif 
None.gif
None.gif


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

RFTunerNodeProperties定义如下

 

None.gifDEFINE_KSPROPERTY_SET_TABLE(RFTunerNodeProperties)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif       DEFINE_KSPROPERTY_SET
InBlock.gif
InBlock.gif       (
InBlock.gif
InBlock.gif              
&KSPROPSETID_BdaFrequencyFilter,                // Set
InBlock.gif

InBlock.gif              SIZEOF_ARRAY(RFTunerBdaFrequencyFilter),        
// PropertiesCount
InBlock.gif

InBlock.gif              RFTunerBdaFrequencyFilter,                      
// PropertyItems
InBlock.gif

InBlock.gif              
0,                                              // FastIoCount
InBlock.gif

InBlock.gif              NULL                                            
// FastIoTable
InBlock.gif

InBlock.gif       ),
InBlock.gif
InBlock.gif       DEFINE_KSPROPERTY_SET
InBlock.gif
InBlock.gif       (
InBlock.gif
InBlock.gif              
&KSPROPSETID_BdaSignalStats,                    // Set
InBlock.gif

InBlock.gif              SIZEOF_ARRAY(RFTunerBdaSignalStats),            
// PropertiesCount
InBlock.gif

InBlock.gif              RFTunerBdaSignalStats,                          
// PropertyItems
InBlock.gif

InBlock.gif              
0,                                              // FastIoCount
InBlock.gif

InBlock.gif              NULL                                            
// FastIoTable
InBlock.gif

InBlock.gif       )
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gif

 

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

RFTunerBdaFrequencyFilter的定义如下

 

None.gif
None.gif
None.gifDEFINE_KSPROPERTY_TABLE(RFTunerBdaFrequencyFilter)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif       DEFINE_KSPROPERTY_ITEM
InBlock.gif
InBlock.gif       (
InBlock.gif
InBlock.gif              KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER,   
// 1
InBlock.gif

InBlock.gif              RFTunerNodeGetFrequencyMultiplier,              
// GetSupported or Handler
InBlock.gif

InBlock.gif              
sizeof(KSP_NODE),                               // MinProperty
InBlock.gif

InBlock.gif              
sizeof(DWORD),                                  // MinData
InBlock.gif

InBlock.gif              RFTunerNodeSetFrequencyMultiplier,              
// SetSupported or Handler
InBlock.gif

InBlock.gif              NULL,                                           
// Values
InBlock.gif

InBlock.gif              
0,                                              // RelationsCount
InBlock.gif

InBlock.gif              NULL,                                           
// Relations
InBlock.gif

InBlock.gif              NULL,                                           
// SupportHandler
InBlock.gif

InBlock.gif              
0                                               // SerializedSize
InBlock.gif

InBlock.gif       ),
InBlock.gif
InBlock.gif       DEFINE_KSPROPERTY_ITEM
InBlock.gif
InBlock.gif       (
InBlock.gif
InBlock.gif              KSPROPERTY_BDA_RF_TUNER_FREQUENCY,              
// 1
InBlock.gif

InBlock.gif              RFTunerNodeGetFrequency,                        
// GetSupported or Handler
InBlock.gif

InBlock.gif              
sizeof(KSP_NODE),                               // MinProperty
InBlock.gif

InBlock.gif              
sizeof(DWORD),                                  // MinData
InBlock.gif

InBlock.gif              RFTunerNodeSetFrequency,                        
// SetSupported or Handler
InBlock.gif

InBlock.gif              NULL,                                           
// Values
InBlock.gif

InBlock.gif              
0,                                              // RelationsCount
InBlock.gif

InBlock.gif              NULL,                                           
// Relations
InBlock.gif

InBlock.gif              NULL,                                          
// SupportHandler
InBlock.gif

InBlock.gif              
0                                               // SerializedSize
InBlock.gif

InBlock.gif       )
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.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后,还要指定它们的连接方式。

一个典型的连接定义如下

None.gifconst
None.gifKSTOPOLOGY_CONNECTION TemplateTunerConnections[] 
=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{-1,  0,  0,  0}// from upstream filter to 0 pin of 0 node
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{0,  1,  1,  0}// from 1 pin of 0 node to 0 pin of 1 node
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{1,  1,  -11}// from 1 pin of 1 node to downstream filter
ExpandedBlockEnd.gif
}
;
None.gif
None.gif


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

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

一个典型的AntennaTransportJoints如下

None.gifconst
None.gifULONG   AntennaTransportJoints[] 
=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
1 // Second element in the preceding KSTOPOLOGY_CONNECTION array.
ExpandedBlockEnd.gif
}
;
None.gif
None.gif 
None.gif
None.gif


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

 


Node1处在Pin1和Joint1之间,所以Node1的控制Pin就是Pin1;而Node2处在Joint1和Pin2之间,所以Node2的控制Pin是Pin2。大多数时候一张拓扑图中只有一个连接点。可以通过BdaPropertyGetControllingPinId 函数取得控制Pin的ID。

 

 

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

 

None.gifDEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(
InBlock.gif        CFilter::StartChanges,
InBlock.gif        NULL
InBlock.gif        ),
InBlock.gif    DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(
InBlock.gif        CFilter::CheckChanges,
InBlock.gif        NULL
InBlock.gif        ),
InBlock.gif    DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(
InBlock.gif        CFilter::CommitChanges,
InBlock.gif        NULL
InBlock.gif        ),
InBlock.gif    DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(
InBlock.gif        CFilter::GetChangeState,
InBlock.gif        NULL
InBlock.gif        )
ExpandedBlockEnd.gif}
;
None.gif
None.gif

 

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

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

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

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

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

 

 

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

 

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

转载于:https://www.cnblogs.com/gussing/archive/2007/06/13/781257.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值