|
MythTV
0.26-pre
|
00001 #include <QMutex> 00002 00003 #include "frequencies.h" 00004 #include "frequencytables.h" 00005 #include "channelutil.h" 00006 #include "compat.h" 00007 00008 static bool frequencies_initialized = false; 00009 static QMutex frequencies_lock; 00010 static freq_table_map_t frequencies; 00011 00012 static void init_freq_tables(freq_table_map_t&); 00013 static freq_table_list_t get_matching_freq_tables_internal( 00014 const QString &format, const QString &modulation, const QString &country); 00015 00016 TransportScanItem::TransportScanItem() 00017 : mplexid((uint)-1), FriendlyName(""), 00018 friendlyNum(0), SourceID(0), UseTimer(false), 00019 scanning(false), timeoutTune(1000) 00020 { 00021 memset(freq_offsets, 0, sizeof(int)*3); 00022 00023 tuning.Clear(); 00024 } 00025 00026 TransportScanItem::TransportScanItem(uint sourceid, 00027 const QString &_si_std, 00028 const QString &_name, 00029 uint _mplexid, 00030 uint _timeoutTune) 00031 : mplexid(_mplexid), FriendlyName(_name), 00032 friendlyNum(0), SourceID(sourceid), UseTimer(false), 00033 scanning(false), timeoutTune(_timeoutTune) 00034 { 00035 memset(freq_offsets, 0, sizeof(int)*3); 00036 00037 tuning.Clear(); 00038 tuning.sistandard = _si_std; 00039 00040 if (_si_std == "analog") 00041 { 00042 tuning.sistandard = "analog"; 00043 tuning.modulation = DTVModulation::kModulationAnalog; 00044 } 00045 } 00046 00047 TransportScanItem::TransportScanItem(uint _sourceid, 00048 const QString &_name, 00049 DTVMultiplex &_tuning, 00050 uint _timeoutTune) 00051 : mplexid(0), 00052 FriendlyName(_name), friendlyNum(0), 00053 SourceID(_sourceid), UseTimer(false), 00054 scanning(false), timeoutTune(_timeoutTune) 00055 { 00056 memset(freq_offsets, 0, sizeof(int)*3); 00057 tuning = _tuning; 00058 } 00059 00060 TransportScanItem::TransportScanItem(uint _sourceid, 00061 const QString &_name, 00062 DTVTunerType _tuner_type, 00063 const DTVTransport &_tuning, 00064 uint _timeoutTune) 00065 : mplexid(0), 00066 FriendlyName(_name), friendlyNum(0), 00067 SourceID(_sourceid), UseTimer(false), 00068 scanning(false), timeoutTune(_timeoutTune) 00069 { 00070 memset(freq_offsets, 0, sizeof(int)*3); 00071 expectedChannels = _tuning.channels; 00072 00073 tuning.Clear(); 00074 00075 tuning.ParseTuningParams( 00076 _tuner_type, 00077 QString::number(_tuning.frequency), _tuning.inversion.toString(), 00078 QString::number(_tuning.symbolrate), _tuning.fec.toString(), 00079 _tuning.polarity.toString(), _tuning.hp_code_rate.toString(), 00080 _tuning.lp_code_rate.toString(), _tuning.modulation.toString(), 00081 _tuning.trans_mode.toString(), _tuning.guard_interval.toString(), 00082 _tuning.hierarchy.toString(), _tuning.modulation.toString(), 00083 _tuning.bandwidth.toString(), _tuning.mod_sys.toString(), 00084 _tuning.rolloff.toString()); 00085 } 00086 00087 TransportScanItem::TransportScanItem(uint sourceid, 00088 const QString &std, 00089 const QString &fn, 00090 uint fnum, 00091 uint freq, 00092 const FrequencyTable &ft, 00093 uint tuneTO) 00094 : mplexid(0), FriendlyName(fn), 00095 friendlyNum(fnum), SourceID(sourceid), UseTimer(false), 00096 scanning(false), timeoutTune(tuneTO) 00097 { 00098 memset(freq_offsets, 0, sizeof(int)*3); 00099 00100 tuning.Clear(); 00101 00102 // setup tuning params 00103 tuning.frequency = freq; 00104 tuning.sistandard = "dvb"; 00105 tuning.modulation = ft.modulation; 00106 00107 if (std.toLower() == "atsc") 00108 tuning.sistandard = "atsc"; 00109 else if (std.toLower() == "analog") 00110 { 00111 tuning.sistandard = "analog"; 00112 tuning.modulation = DTVModulation::kModulationAnalog; 00113 } 00114 00115 freq_offsets[1] = ft.offset1; 00116 freq_offsets[2] = ft.offset2; 00117 00118 if (std == "dvbt") 00119 { 00120 tuning.inversion = ft.inversion; 00121 tuning.bandwidth = ft.bandwidth; 00122 tuning.hp_code_rate = ft.coderate_hp; 00123 tuning.lp_code_rate = ft.coderate_lp; 00124 tuning.trans_mode = ft.trans_mode; 00125 tuning.guard_interval = ft.guard_interval; 00126 tuning.hierarchy = ft.hierarchy; 00127 } 00128 else if (std == "dvbc" || std == "dvbs") 00129 { 00130 tuning.symbolrate = ft.symbol_rate; 00131 tuning.fec = ft.fec_inner; 00132 } 00133 00134 mplexid = GetMultiplexIdFromDB(); 00135 } 00136 00140 uint TransportScanItem::GetMultiplexIdFromDB(void) const 00141 { 00142 int mplexid = 0; 00143 00144 for (uint i = 0; (i < offset_cnt()) && (mplexid <= 0); i++) 00145 mplexid = ChannelUtil::GetMplexID(SourceID, freq_offset(i)); 00146 00147 return mplexid < 0 ? 0 : mplexid; 00148 } 00149 00150 uint64_t TransportScanItem::freq_offset(uint i) const 00151 { 00152 int64_t freq = (int64_t) tuning.frequency; 00153 00154 return (uint64_t) (freq + freq_offsets[i]); 00155 } 00156 00157 QString TransportScanItem::toString() const 00158 { 00159 QString str = QString("Transport Scan Item '%1' #%2\n") 00160 .arg(FriendlyName).arg(friendlyNum); 00161 str += QString("\tmplexid(%1) standard(%2) sourceid(%3)\n") 00162 .arg(mplexid).arg(tuning.sistandard).arg(SourceID); 00163 str += QString("\tUseTimer(%1) scanning(%2)\n") 00164 .arg(UseTimer).arg(scanning); 00165 str += QString("\ttimeoutTune(%3 msec)\n").arg(timeoutTune); 00166 if (tuning.sistandard == "atsc" || tuning.sistandard == "analog") 00167 { 00168 str += QString("\tfrequency(%1) modulation(%2)\n") 00169 .arg(tuning.frequency) 00170 .arg(tuning.modulation.toString()); 00171 } 00172 else 00173 { 00174 str += QString("\tfrequency(%1) constellation(%2)\n") 00175 .arg(tuning.frequency) 00176 .arg(tuning.modulation.toString()); 00177 str += QString("\t inv(%1) bandwidth(%2) hp(%3) lp(%4)\n") 00178 .arg(tuning.inversion) 00179 .arg(tuning.bandwidth) 00180 .arg(tuning.hp_code_rate) 00181 .arg(tuning.lp_code_rate); 00182 str += QString("\t trans_mode(%1) guard_int(%2) hierarchy(%3)\n") 00183 .arg(tuning.trans_mode) 00184 .arg(tuning.guard_interval) 00185 .arg(tuning.hierarchy); 00186 } 00187 str += QString("\t offset[0..2]: %1 %2 %3") 00188 .arg(freq_offsets[0]).arg(freq_offsets[1]).arg(freq_offsets[2]); 00189 return str; 00190 } 00191 00192 static bool init_freq_tables(void) 00193 { 00194 if (!frequencies_initialized) 00195 { 00196 init_freq_tables(frequencies); 00197 frequencies_initialized = true; 00198 } 00199 return true; 00200 } 00201 00202 bool teardown_frequency_tables(void) 00203 { 00204 QMutexLocker locker(&frequencies_lock); 00205 if (frequencies_initialized) 00206 { 00207 frequencies.clear(); 00208 frequencies_initialized = false; 00209 } 00210 return true; 00211 } 00212 00213 static freq_table_list_t get_matching_freq_tables_internal( 00214 const QString &format, const QString &modulation, const QString &country) 00215 { 00216 const freq_table_map_t &fmap = frequencies; 00217 00218 freq_table_list_t list; 00219 00220 QString lookup = QString("%1_%2_%3%4") 00221 .arg(format).arg(modulation).arg(country); 00222 00223 freq_table_map_t::const_iterator it = fmap.begin(); 00224 for (uint i = 0; it != fmap.end(); i++) 00225 { 00226 it = fmap.find(lookup.arg(i)); 00227 if (it != fmap.end()) 00228 list.push_back(*it); 00229 } 00230 00231 return list; 00232 } 00233 00234 freq_table_list_t get_matching_freq_tables( 00235 const QString &format, const QString &modulation, const QString &country) 00236 { 00237 QMutexLocker locker(&frequencies_lock); 00238 init_freq_tables(); 00239 00240 freq_table_list_t list = 00241 get_matching_freq_tables_internal(format, modulation, country); 00242 00243 freq_table_list_t new_list; 00244 for (uint i = 0; i < list.size(); i++) 00245 new_list.push_back(new FrequencyTable(*list[i])); 00246 00247 return new_list; 00248 } 00249 00250 long long get_center_frequency( 00251 QString format, QString modulation, QString country, int freqid) 00252 { 00253 QMutexLocker locker(&frequencies_lock); 00254 init_freq_tables(); 00255 00256 freq_table_list_t list = 00257 get_matching_freq_tables_internal(format, modulation, country); 00258 00259 for (uint i = 0; i < list.size(); ++i) 00260 { 00261 int min_freqid = list[i]->name_offset; 00262 int max_freqid = min_freqid + 00263 ((list[i]->frequencyEnd - list[i]->frequencyStart) / 00264 list[i]->frequencyStep); 00265 00266 if ((min_freqid <= freqid) && (freqid <= max_freqid)) 00267 return list[i]->frequencyStart + 00268 list[i]->frequencyStep * (freqid - min_freqid); 00269 } 00270 return -1; 00271 } 00272 00273 int get_closest_freqid( 00274 QString format, QString modulation, QString country, long long centerfreq) 00275 { 00276 modulation = (modulation == "8vsb") ? "vsb8" : modulation; 00277 00278 freq_table_list_t list = 00279 get_matching_freq_tables_internal(format, modulation, country); 00280 00281 for (uint i = 0; i < list.size(); ++i) 00282 { 00283 int min_freqid = list[i]->name_offset; 00284 int max_freqid = min_freqid + 00285 ((list[i]->frequencyEnd - list[i]->frequencyStart) / 00286 list[i]->frequencyStep); 00287 int freqid = 00288 ((centerfreq - list[i]->frequencyStart) / 00289 list[i]->frequencyStep) + min_freqid; 00290 00291 if ((min_freqid <= freqid) && (freqid <= max_freqid)) 00292 return freqid; 00293 } 00294 #if 0 00295 LOG(VB_GENERAL, LOG_DEBUG, 00296 QString("get_closest_freqid(%1, %2, %3, %4) Failed sz(%5)") 00297 .arg(format) .arg(modulation) .arg(country) .arg(centerfreq) 00298 .arg(list.size())); 00299 #endif 00300 return -1; 00301 } 00302 00303 00304 static void init_freq_tables(freq_table_map_t &fmap) 00305 { 00306 // United Kingdom 00307 fmap["dvbt_ofdm_gb0"] = new FrequencyTable( 00308 474000000, 850000000, 8000000, "Channel %1", 21, 00309 DTVInversion::kInversionOff, 00310 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00311 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00312 DTVTransmitMode::kTransmissionModeAuto, 00313 DTVGuardInterval::kGuardInterval_1_32, DTVHierarchy::kHierarchyNone, 00314 DTVModulation::kModulationQAMAuto, 166670, -166670); 00315 00316 // Finland 00317 fmap["dvbt_ofdm_fi0"] = new FrequencyTable( 00318 474000000, 850000000, 8000000, "Channel %1", 21, 00319 DTVInversion::kInversionOff, 00320 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00321 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAM64, 00322 DTVTransmitMode::kTransmissionModeAuto, 00323 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00324 DTVModulation::kModulationQAMAuto, 0, 0); 00325 00326 // Sweden 00327 fmap["dvbt_ofdm_se0"] = new FrequencyTable( 00328 474000000, 850000000, 8000000, "Channel %1", 21, 00329 DTVInversion::kInversionOff, 00330 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00331 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAM64, 00332 DTVTransmitMode::kTransmissionModeAuto, 00333 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00334 DTVModulation::kModulationQAMAuto, 0, 0); 00335 00336 // Australia 00337 fmap["dvbt_ofdm_au0"] = new FrequencyTable( 00338 177500000, 226500000, 7000000, "Channel %1", 5, 00339 DTVInversion::kInversionOff, 00340 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00341 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAM64, 00342 DTVTransmitMode::kTransmissionMode8K, 00343 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00344 DTVModulation::kModulationQAMAuto, 125000, 0); // VHF 5-12 00345 fmap["dvbt_ofdm_au1"] = new FrequencyTable( 00346 529500000, 816500000, 7000000, "Channel %1", 28, 00347 DTVInversion::kInversionOff, 00348 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00349 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAM64, 00350 DTVTransmitMode::kTransmissionMode8K, 00351 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00352 DTVModulation::kModulationQAMAuto, 125000, 0); // UHF 28-69 00353 00354 // Germany (Deuschland) 00355 fmap["dvbt_ofdm_de0"] = new FrequencyTable( 00356 177500000, 226500000, 7000000, "Channel %1", 5, 00357 DTVInversion::kInversionOff, 00358 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00359 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00360 DTVTransmitMode::kTransmissionMode8K, 00361 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00362 DTVModulation::kModulationQAMAuto, 0, 0); // VHF 5-12, deprecated 00363 fmap["dvbt_ofdm_de1"] = new FrequencyTable( 00364 474000000, 826000000, 8000000, "Channel %1", 21, 00365 DTVInversion::kInversionOff, 00366 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00367 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00368 DTVTransmitMode::kTransmissionModeAuto, 00369 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00370 DTVModulation::kModulationQAMAuto, 0, 0); // UHF 21-65 00371 00372 // Italy (Italia) 00373 fmap["dvbt_ofdm_it0"] = new FrequencyTable( 00374 177500000, 226500000, 7000000, "Channel %1", 5, 00375 DTVInversion::kInversionOff, 00376 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00377 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00378 DTVTransmitMode::kTransmissionMode8K, 00379 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00380 DTVModulation::kModulationQAMAuto, 0, 0); // VHF 5-12, deprecated 00381 fmap["dvbt_ofdm_it1"] = new FrequencyTable( 00382 474000000, 858000000, 8000000, "Channel %1", 21, 00383 DTVInversion::kInversionOff, 00384 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00385 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00386 DTVTransmitMode::kTransmissionModeAuto, 00387 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00388 DTVModulation::kModulationQAMAuto, 0, 0); // UHF 21-65 00389 00390 // Czech Republic 00391 fmap["dvbt_ofdm_cz0"] = new FrequencyTable( 00392 474000000, 858000000, 8000000, "Channel %1", 21, 00393 DTVInversion::kInversionOff, 00394 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFEC_2_3, 00395 DTVCodeRate::kFEC_2_3, DTVModulation::kModulationQAM64, 00396 DTVTransmitMode::kTransmissionMode8K, 00397 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00398 DTVModulation::kModulationQAM64, 0, 0); // UHF 21-69 00399 00400 // Greece (Hellas) 00401 fmap["dvbt_ofdm_gr0"] = new FrequencyTable( 00402 174000000, 230000000, 7000000, "Channel %1", 5, 00403 DTVInversion::kInversionAuto, 00404 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00405 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00406 DTVTransmitMode::kTransmissionModeAuto, 00407 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyAuto, 00408 DTVModulation::kModulationQAMAuto, 0, 0); // VHF 5-12, deprecated 00409 fmap["dvbt_ofdm_gr1"] = new FrequencyTable( 00410 474000000, 866000000, 8000000, "Channel %1", 21, 00411 DTVInversion::kInversionAuto, 00412 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00413 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00414 DTVTransmitMode::kTransmissionModeAuto, 00415 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00416 DTVModulation::kModulationQAMAuto, 0, 0); // UHF 21-65 00417 00418 // Spain 00419 fmap["dvbt_ofdm_es0"] = new FrequencyTable( 00420 474000000, 858000000, 8000000, "Channel %1", 21, 00421 DTVInversion::kInversionOff, 00422 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00423 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00424 DTVTransmitMode::kTransmissionModeAuto, 00425 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00426 DTVModulation::kModulationQAMAuto, 125000, 0); // UHF 21-69 00427 00428 // New Zealand 00429 fmap["dvbt_ofdm_nz0"] = new FrequencyTable( 00430 474000000, 858000000, 8000000, "Channel %1", 21, 00431 DTVInversion::kInversionOff, 00432 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFEC_3_4, 00433 DTVCodeRate::kFEC_3_4, DTVModulation::kModulationQAM64, 00434 DTVTransmitMode::kTransmissionMode8K, 00435 DTVGuardInterval::kGuardInterval_1_16, DTVHierarchy::kHierarchyNone, 00436 DTVModulation::kModulationQAM64, 0 , 0); // UHF 21-69 00437 00438 // france 00439 fmap["dvbt_ofdm_fr0"] = new FrequencyTable( 00440 474000000, 850000000, 8000000, "Channel %1", 21, 00441 DTVInversion::kInversionOff, 00442 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFECAuto, 00443 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00444 DTVTransmitMode::kTransmissionMode8K, 00445 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00446 DTVModulation::kModulationQAMAuto, 167000, -166000); 00447 00448 // Denmark 00449 fmap["dvbt_ofdm_dk0"] = new FrequencyTable( 00450 474000000, 858000000, 8000000, "Channel %1", 21, 00451 DTVInversion::kInversionOff, 00452 DTVBandwidth::kBandwidth8MHz, DTVCodeRate::kFEC_2_3, 00453 DTVCodeRate::kFECNone, DTVModulation::kModulationQAM64, 00454 DTVTransmitMode::kTransmissionMode8K, 00455 DTVGuardInterval::kGuardInterval_1_4, DTVHierarchy::kHierarchyNone, 00456 DTVModulation::kModulationQAM64, 0, 0); 00457 00458 // Chile (ISDB-Tb) 00459 fmap["dvbt_ofdm_cl0"] = new FrequencyTable( 00460 473000000, 803000000, 6000000, "Channel %1", 14, 00461 DTVInversion::kInversionAuto, 00462 DTVBandwidth::kBandwidthAuto, DTVCodeRate::kFEC_3_4, 00463 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00464 DTVTransmitMode::kTransmissionModeAuto, 00465 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00466 DTVModulation::kModulationQAMAuto, 143000, 0); 00467 00468 // DVB-C Germany 00469 fmap["dvbc_qam_de0"] = new FrequencyTable( 00470 73000000, 73000000, 8000000, "Channel D%1", 73, 00471 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00472 6900000, 0, 0); 00473 fmap["dvbc_qam_de1"] = new FrequencyTable( 00474 81000000, 81000000, 8000000, "Channel D%1", 81, 00475 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00476 6900000, 0, 0); 00477 fmap["dvbc_qam_de2"] = new FrequencyTable( 00478 113000000, 121000000, 8000000, "Channel S0%1", 2, 00479 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00480 6900000, 0, 0); 00481 fmap["dvbc_qam_de3"] = new FrequencyTable( 00482 306000000, 466000000, 8000000, "Channel S%1", 21, 00483 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00484 6900000, 0, 0); 00485 fmap["dvbc_qam_de4"] = new FrequencyTable( 00486 474000000, 858000000, 8000000, "Channel %1", 21, 00487 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00488 6900000, 0, 0); 00489 00490 fmap["dvbc_qam_gb0"] = new FrequencyTable( 00491 12324000, 12324000+1, 10, "Channel %1", 1, 00492 DTVCodeRate::kFEC_3_4, DTVModulation::kModulationQAMAuto, 00493 29500000, 0, 0); 00494 fmap["dvbc_qam_gb1"] = new FrequencyTable( 00495 459000000, 459000000+1, 10, "Channel %1", 2, 00496 DTVCodeRate::kFEC_3_4, DTVModulation::kModulationQAM64, 00497 6952000, 0, 0); 00498 00499 fmap["dvbc_qam_bf0"] = new FrequencyTable( 00500 203000000, 795000000, 100000, "BF Channel %1", 1, 00501 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00502 6900000, 0, 0); 00503 fmap["dvbc_qam_bf1"] = new FrequencyTable( 00504 194750000, 794750000, 100000, "BF Channel %1", 1 + (795000-203000) / 100, 00505 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00506 6900000, 0, 0); 00507 00508 //#define DEBUG_DVB_OFFSETS 00509 #ifdef DEBUG_DVB_OFFSETS 00510 // UHF 14-69 00511 fmap["atsc_vsb8_us0"] = new FrequencyTable( 00512 533000000, 803000000, 6000000, "xATSC Channel %1", 24, 00513 DTVInversion::kInversionOff, 00514 DTVBandwidth::kBandwidth7MHz, DTVCodeRate::kFECAuto, 00515 DTVCodeRate::kFECAuto, DTVModulation::kModulationQAMAuto, 00516 DTVTransmitMode::kTransmissionMode8K, 00517 DTVGuardInterval::kGuardIntervalAuto, DTVHierarchy::kHierarchyNone, 00518 DTVModulation::kModulation8VSB, -100000, 100000); 00519 #else // if !DEBUG_DVB_OFFSETS 00520 // USA Terrestrial (center frequency, subtract 1.75 MHz for visual carrier) 00521 // VHF 2-4 00522 fmap["atsc_vsb8_us0"] = new FrequencyTable( 00523 "ATSC Channel %1", 2, 57000000, 69000000, 6000000, 00524 DTVModulation::kModulation8VSB); 00525 // VHF 5-6 00526 fmap["atsc_vsb8_us1"] = new FrequencyTable( 00527 "ATSC Channel %1", 5, 79000000, 85000000, 6000000, 00528 DTVModulation::kModulation8VSB); 00529 // VHF 7-13 00530 fmap["atsc_vsb8_us2"] = new FrequencyTable( 00531 "ATSC Channel %1", 7, 177000000, 213000000, 6000000, 00532 DTVModulation::kModulation8VSB); 00533 // UHF 14-69 00534 fmap["atsc_vsb8_us3"] = new FrequencyTable( 00535 "ATSC Channel %1", 14, 473000000, 803000000, 6000000, 00536 DTVModulation::kModulation8VSB); 00537 #endif // !DEBUG_DVB_OFFSETS 00538 00539 QString modStr[] = { "vsb8", "qam256", "qam128", "qam64", }; 00540 uint mod[] = { DTVModulation::kModulation8VSB, 00541 DTVModulation::kModulationQAM256, 00542 DTVModulation::kModulationQAM128, 00543 DTVModulation::kModulationQAM64, }; 00544 QString desc[] = { "ATSC ", "QAM-256 ", "QAM-128 ", "QAM-64 ", }; 00545 00546 #define FREQ(A,B, C,D, E,F,G, H, I) \ 00547 fmap[QString("atsc_%1_us%2").arg(A).arg(B)] = \ 00548 new FrequencyTable(C+D, E, F, G, H, I); 00549 00550 // The maximum channel defined in the US frequency tables (standard, HRC, IRC) 00551 #define US_MAX_CHAN 159 00552 // Equation for computing EIA-542 frequency of channels > 99 00553 // A = bandwidth, B = offset, C = channel designation (number) 00554 #define EIA_542_FREQUENCY(A,B,C) ( ( A * ( 8 + C ) ) + B ) 00555 00556 for (uint i = 0; i < 4; i++) 00557 { 00558 // USA Cable, ch 2 to US_MAX_CHAN and T.7 to T.14 00559 FREQ(modStr[i], "cable0", desc[i], "Channel %1", 00560 2, 57000000, 69000000, 6000000, mod[i]); // 2-4 00561 FREQ(modStr[i], "cable1", desc[i], "Channel %1", 00562 5, 79000000, 85000000, 6000000, mod[i]); // 5-6 00563 FREQ(modStr[i], "cable2", desc[i], "Channel %1", 00564 7, 177000000, 213000000, 6000000, mod[i]); // 7-13 00565 FREQ(modStr[i], "cable3", desc[i], "Channel %1", 00566 14, 123000000, 171000000, 6000000, mod[i]); // 14-22 00567 FREQ(modStr[i], "cable4", desc[i], "Channel %1", 00568 23, 219000000, 645000000, 6000000, mod[i]); // 23-94 00569 FREQ(modStr[i], "cable5", desc[i], "Channel %1", 00570 95, 93000000, 117000000, 6000000, mod[i]); // 95-99 00571 // The center frequency of any EIA-542 std cable channel over 99 is 00572 // Frequency_MHz = ( 6 * ( 8 + channel_designation ) ) + 3 00573 FREQ(modStr[i], "cable6", desc[i], "Channel %1", 00574 100, 651000000, 00575 EIA_542_FREQUENCY(6000000, 3000000, US_MAX_CHAN), 00576 6000000, mod[i]); // 100-US_MAX_CHAN 00577 FREQ(modStr[i], "cable7", desc[i], "Channel T-%1", 00578 7, 8750000, 50750000, 6000000, mod[i]); // T7-14 00579 00580 // USA Cable, QAM 256 ch 78 to US_MAX_CHAN 00581 FREQ(modStr[i], "cablehigh0", desc[i], "Channel %1", 00582 78, 549000000, 645000000, 6000000, mod[i]); // 78-94 00583 FREQ(modStr[i], "cablehigh1", desc[i], "Channel %1", 00584 100, 651000000, 00585 EIA_542_FREQUENCY(6000000, 3000000, US_MAX_CHAN), 00586 6000000, mod[i]); // 100-US_MAX_CHAN 00587 00588 // USA Cable HRC, ch 1 to US_MAX_CHAN 00589 FREQ(modStr[i], "hrc0", desc[i], "HRC %1", 00590 1, 73753600, 73753601, 6000300, mod[i]); // 1 00591 FREQ(modStr[i], "hrc1", desc[i], "HRC %1", 00592 2, 55752700, 67753300, 6000300, mod[i]); // 2-4 00593 FREQ(modStr[i], "hrc2", desc[i], "HRC %1", 00594 5, 79753900, 85754200, 6000300, mod[i]); // 5-6 00595 FREQ(modStr[i], "hrc3", desc[i], "HRC %1", 00596 7, 175758700, 211760500, 6000300, mod[i]); // 7-13 00597 FREQ(modStr[i], "hrc4", desc[i], "HRC %1", 00598 14, 121756000, 169758400, 6000300, mod[i]); // 14-22 00599 FREQ(modStr[i], "hrc5", desc[i], "HRC %1", 00600 23, 217760800, 643782100, 6000300, mod[i]); // 23-94 00601 FREQ(modStr[i], "hrc6", desc[i], "HRC %1", 00602 95, 91754500, 115755700, 6000300, mod[i]); // 95-99 00603 // The center frequency of any EIA-542 HRC cable channel over 99 is 00604 // Frequency_MHz = ( 6.0003 * ( 8 + channel_designation ) ) + 1.75 00605 FREQ(modStr[i], "hrc7", desc[i], "HRC %1", 00606 100, 649782400, 00607 EIA_542_FREQUENCY(6000300, 1750000, US_MAX_CHAN), 00608 6000300, mod[i]); // 100-US_MAX_CHAN 00609 00610 // USA Cable HRC, ch 76-94 and 100-US_MAX_CHAN 00611 // Channels 95-99 are low frequency despite high channel numbers 00612 FREQ(modStr[i], "hrchigh0", desc[i], "HRC %1", 00613 76, 535776700, 643782100, 6000300, mod[i]); // 76-94 00614 FREQ(modStr[i], "hrchigh1", desc[i], "HRC %1", 00615 100, 649782400, 00616 EIA_542_FREQUENCY(6000300, 1750000, US_MAX_CHAN), 00617 6000300, mod[i]); // 100-US_MAX_CHAN 00618 00619 // USA Cable IRC, ch 1 to US_MAX_CHAN 00620 FREQ(modStr[i], "irc0", desc[i], "IRC %1", 00621 1, 75012500, 75012501, 6000000, mod[i]); // 1 00622 FREQ(modStr[i], "irc1", desc[i], "IRC %1", 00623 2, 57012500, 69012500, 6000000, mod[i]); // 2-4 00624 FREQ(modStr[i], "irc2", desc[i], "IRC %1", 00625 5, 81012500, 87012500, 6000000, mod[i]); // 5-6 00626 FREQ(modStr[i], "irc3", desc[i], "IRC %1", 00627 7, 177012500, 213012500, 6000000, mod[i]); // 7-13 00628 FREQ(modStr[i], "irc4", desc[i], "IRC %1", 00629 14, 123012500, 171012500, 6000000, mod[i]); // 14-22 00630 FREQ(modStr[i], "irc5", desc[i], "IRC %1", 00631 23, 219012500, 327012500, 6000000, mod[i]); // 23-41 00632 FREQ(modStr[i], "irc6", desc[i], "IRC %1", 00633 42, 333025000, 333025001, 6000000, mod[i]); // 42 00634 FREQ(modStr[i], "irc7", desc[i], "IRC %1", 00635 43, 339012500, 645012500, 6000000, mod[i]); // 43-94 00636 FREQ(modStr[i], "irc8", desc[i], "IRC %1", 00637 95, 93012500, 105012500, 6000000, mod[i]); // 95-97 00638 FREQ(modStr[i], "irc9", desc[i], "IRC %1", 00639 98, 111025000, 117025000, 6000000, mod[i]); // 98-99 00640 // The center frequency of any EIA-542 IRC cable channel over 99 is 00641 // Frequency_MHz = ( 6 * ( 8 + channel_designation ) ) + 3.0125 00642 FREQ(modStr[i], "irc10", desc[i], "IRC %1", 00643 100, 651012500, 00644 EIA_542_FREQUENCY(6000000, 3012500, US_MAX_CHAN), 00645 6000000, mod[i]); // 100-US_MAX_CHAN 00646 00647 // USA Cable IRC, ch 76-94 and 100-125 00648 // Channels 95-99 are low frequency despite high channel numbers 00649 FREQ(modStr[i], "irchigh0", desc[i], "IRC %1", 00650 76, 537012500, 645012500, 6000000, mod[i]); // 76-94 00651 FREQ(modStr[i], "irchigh1", desc[i], "IRC %1", 00652 100, 651012500, 00653 EIA_542_FREQUENCY(6000000, 3012500, US_MAX_CHAN), 00654 6000000, mod[i]); // 100-US_MAX_CHAN 00655 } 00656 00657 // create old school frequency tables... 00658 for (struct CHANLISTS *ptr = chanlists; ptr->name ; ptr++) 00659 { 00660 QString tbl_name = ptr->name; 00661 for (uint i = 0; i < (uint)ptr->count; i++) 00662 { 00663 uint64_t freq = (ptr->list[i].freq * 1000LL) + 1750000; 00664 fmap[QString("analog_analog_%1%2").arg(tbl_name).arg(i)] = 00665 new FrequencyTable( 00666 QString("%1 %2").arg(tbl_name).arg(ptr->list[i].name), i+2, 00667 freq, freq + 3000000, 00668 6000000, DTVModulation::kModulationAnalog); 00669 } 00670 } 00671 00672 }
1.7.6.1