我想了解大多数应用程序如何执行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 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频道的扫描/调谐?
你的名单是如何建立的?如果物理通道是数组的索引,则双重映射是不可能的,重复只会替换第一个映射。这至少有助于1)。我假设映射只完成一次?或者你反复映射?后者也将解释为什么映射产生不一致的结果。 – scenia
>双映射是不可能的 - 这是我的问题点。在方法1中,我有时会看到对物理频道30的调谐请求导致调谐到43.1,有时看到调谐请求将我调到43.2。似乎没有这种行为的模式,我会预期物理 - > major.minor映射的1:1关系。我问方法1的行为的最后一件事是......为什么会发生这种情况?我不想替换第一个映射,因为你永远不知道这两个次要频道中的哪一个将被实际调整。 –
这种关系不一定是1:1。实际上,除非我理解系统是错误的,否则映射主要是物理的,而未成年人只是在同一通道上提供的几个数据流。这意味着有更多的节目(major.minor)比频道(物理)更多。 – scenia