我试图了解大多数应用程序如何执行ATSC调整。假设我已经通过
获得了ATSC调谐请求ITuneRequest *pITuneRequest = NULL;
pATSCTuningSpace->CreateTuneRequest(&pTuneRequest)`
似乎有三种流行的方法:
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 one和this 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 :(得分:2)
简而言之,我们的解决方案是不支持扫描,并采用第二种方法:直接调到Major.Minor。在我的原帖中,我注意到这只适用于我所在地区的8.1和8.2。
事实证明,设置Channel
和MinorChannel
是不够的。我需要cross-reference each major channel并在调整时设置PhysicalChannel
(RFChannel)。因此,为了调整,我们为所有请求设置了Channel
,MinorChannel
和PhysicalChannel
。
我在CarrierFrequency
中将所有其他属性(包括TuneRequest
)设置为-1。
此外,我还发现了另外两个用于查找的资源:
http://transition.fcc.gov/mb/engineering/dtvmaps/
http://www.tvfool.com
作为旁注,为了我们的应用目的,要求用户使用antennaweb.org查找物理(RF)频道是合理的。如果用户手头没有这些信息,我不确定你是如何使用我们的方法的。