2014-02-06 41 views
3

我想了解大多数应用程序如何执行ATSC调谐。假设我已经有了,我已经通过调谐(并扫描)ATSC频道的正确方法是什么?

ITuneRequest *pITuneRequest = NULL; 
pATSCTuningSpace->CreateTuneRequest(&pTuneRequest)` 

看来,有三种常见的方法获得的ATSC调谐请求:

1)构建所有MAJOR.MINOR频道列表并将其映射到物理频道,然后在请求major.minor时调谐到该物理频道。这张地图是通过如下代码构建的:

for i = 2 to 69 
    tune_to_physical_channel(i) 
    if (tuner_has_lock()) 
     add_to_known_list(i, major_of(i), minor_of(i)); 
next 

UI仅向用户呈现major.minor频道列表。

我在这里看到的问题是,我似乎得到重复的映射;有时我会调整实体频道30并看到43.1,有时我调整它,而是看到43.2!为什么会发生这种情况?

2)直接调到major.minor。允许直接输入主要和次要频道,并且根本不使用物理频道。我尝试过使用几个本地频道:8.1,8.2,43.1,43.2,43.3,49.1,49.2。

8.1和8.2合拍如果构建一个调谐请求并设置参数是这样的:

IATSCChannelTuneRequest* pIATSCChannelTuneRequest = NULL; 
IATSCLocator *pIATSCLocator = NULL; 
hr = pITuneRequest->QueryInterface(IID_IATSCChannelTuneRequest, 
      (void**)&pIATSCChannelTuneRequest); 
pIATSCChannelTuneRequest->put_Channel(lMajorChannel); 
pIATSCChannelTuneRequest->put_MinorChannel(lMinorChannel); 
::CoCreateInstance(CLSID_ATSCLocator, 0, CLSCTX_INPROC, IID_IATSCLocator,  
      (void**)&pIATSCLocator); 
pIATSCLocator->put_CarrierFrequency(-1); 
pIATSCLocator->put_SymbolRate(-1); 
pIATSCLocator->put_PhysicalChannel(-1); 
pIATSCChannelTuneRequest->put_Locator(pIATSCLocator); 

其它通道从不调。为什么?其他应用程序(如WinTV)正确调整所有内容。

3)通过扫描已知频率的列表对于给定的地理区域构建MAJOR.MINOR信道的列表。某些应用程序使用基于位置的已知频率such as this one,this onethis one自行播种。请注意,所有这些都是美国特定的。

我还没有真正尝试过,但我的计划是提供一个清单,并建立MAJOR.MINOR的映射 - >频率,类似于#1:如此反复

foreach (frequency f in frequency_array) 
    tune_to_frequency (f) 
    if (tuner_has_lock()) 
     add_to_known_list(f, major_of(f), minor_of(f)); 
next 

问题是:应用程序如何实现ATSC频道的扫描/调谐?

+0

你的名单是如何建立的?如果物理通道是数组的索引,则双重映射是不可能的,重复只会替换第一个映射。这至少有助于1)。我假设映射只完成一次?或者你反复映射?后者也将解释为什么映射产生不一致的结果。 – scenia

+0

>双映射是不可能的 - 这是我的问题点。在方法1中,我有时会看到对物理频道30的调谐请求导致调谐到43.1,有时看到调谐请求将我调到43.2。似乎没有这种行为的模式,我会预期物理 - > major.minor映射的1:1关系。我问方法1的行为的最后一件事是......为什么会发生这种情况?我不想替换第一个映射,因为你永远不知道这两个次要频道中的哪一个将被实际调整。 –

+0

这种关系不一定是1:1。实际上,除非我理解系统是错误的,否则映射主要是物理的,而未成年人只是在同一通道上提供的几个数据流。这意味着有更多的节目(major.minor)比频道(物理)更多。 – scenia

回答

2

总之,我们的解决方案是不支持扫描,并采用方法二:直接调到Major.Minor。在我原来的文章中,我注意到这只对我的区域8.1和8.2有效。

事实证明,设置ChannelMinorChannel是不够的。我需要cross-reference each major channel,并在调谐时设置PhysicalChannel(RFChannel)。因此,为了调整,我们为所有请求设置了Channel,MinorChannelPhysicalChannel

我在TuneRequest中将所有其他属性(包括CarrierFrequency)设置为-1。

此外,我还发现了其他两种资源做查找:

http://transition.fcc.gov/mb/engineering/dtvmaps/
http://www.tvfool.com

作为一个侧面说明,我们的应用程序而言,它的合理要求用户去查找物理(RF )通道使用antennaweb.org。如果用户手边没有这些信息,我不确定您仍然会如何使用我们的方法。

相关问题