00001
00002
00003 #ifndef FREQUENCY_TABLE_H
00004 #define FREQUENCY_TABLE_H
00005
00006
00007 #include <list>
00008 #include <vector>
00009 using namespace std;
00010
00011
00012 #include <QString>
00013 #include <QMap>
00014
00015
00016 #include "dtvchannel.h"
00017
00018 #include "mythtvexp.h"
00019 #include "dtvconfparser.h"
00020 #include "dtvconfparserhelpers.h"
00021
00022 class FrequencyTable;
00023 class TransportScanItem;
00024
00025 typedef QMap<QString, const FrequencyTable*> freq_table_map_t;
00026 typedef vector<const FrequencyTable*> freq_table_list_t;
00027
00028 bool teardown_frequency_tables(void);
00029
00030 freq_table_list_t get_matching_freq_tables(
00031 const QString &format, const QString &modulation, const QString &country);
00032
00033 MTV_PUBLIC long long get_center_frequency(
00034 QString format, QString modulation, QString country, int freqid);
00035
00036 int get_closest_freqid(
00037 QString format, QString modulation, QString country, long long centerfreq);
00038
00039 class FrequencyTable
00040 {
00041 public:
00042 FrequencyTable(QString _name_format,
00043 int _name_offset,
00044 uint64_t _frequencyStart,
00045 uint64_t _frequencyEnd,
00046 uint _frequencyStep,
00047 DTVModulation _modulation)
00048 : name_format(_name_format), name_offset(_name_offset),
00049 frequencyStart(_frequencyStart), frequencyEnd(_frequencyEnd),
00050 frequencyStep(_frequencyStep), modulation(_modulation),
00051 offset1(0), offset2(0),
00052 symbol_rate(0) { }
00053
00054 FrequencyTable(uint64_t _frequencyStart,
00055 uint64_t _frequencyEnd,
00056 uint _frequencyStep,
00057 QString _name_format,
00058 int _name_offset,
00059 DTVInversion _inversion,
00060 DTVBandwidth _bandwidth,
00061 DTVCodeRate _coderate_hp,
00062 DTVCodeRate _coderate_lp,
00063 DTVModulation _constellation,
00064 DTVTransmitMode _trans_mode,
00065 DTVGuardInterval _guard_interval,
00066 DTVHierarchy _hierarchy,
00067 DTVModulation _modulation,
00068 int _offset1,
00069 int _offset2)
00070 : name_format(_name_format), name_offset(_name_offset),
00071 frequencyStart(_frequencyStart), frequencyEnd(_frequencyEnd),
00072 frequencyStep(_frequencyStep), modulation(_modulation),
00073 offset1(_offset1), offset2(_offset2),
00074 inversion(_inversion), bandwidth(_bandwidth),
00075 coderate_hp(_coderate_hp), coderate_lp(_coderate_lp),
00076 constellation(_constellation), trans_mode(_trans_mode),
00077 guard_interval(_guard_interval), hierarchy(_hierarchy),
00078 symbol_rate(0) { }
00079
00080 FrequencyTable(uint64_t _frequencyStart,
00081 uint64_t _frequencyEnd,
00082 uint _frequencyStep,
00083 QString _name_format,
00084 int _name_offset,
00085 DTVCodeRate _fec_inner,
00086 DTVModulation _modulation,
00087 uint _symbol_rate,
00088 int _offset1,
00089 int _offset2)
00090 : name_format(_name_format), name_offset(_name_offset),
00091 frequencyStart(_frequencyStart), frequencyEnd(_frequencyEnd),
00092 frequencyStep(_frequencyStep), modulation(_modulation),
00093 offset1(_offset1), offset2(_offset2),
00094 symbol_rate(_symbol_rate), fec_inner(_fec_inner) { ; }
00095
00096 virtual ~FrequencyTable() { ; }
00097
00098
00099 QString name_format;
00100 int name_offset;
00101 uint64_t frequencyStart;
00102 uint64_t frequencyEnd;
00103 uint frequencyStep;
00104 DTVModulation modulation;
00105 int offset1;
00106 int offset2;
00107
00108
00109 DTVInversion inversion;
00110 DTVBandwidth bandwidth;
00111 DTVCodeRate coderate_hp;
00112 DTVCodeRate coderate_lp;
00113 DTVModulation constellation;
00114 DTVTransmitMode trans_mode;
00115 DTVGuardInterval guard_interval;
00116 DTVHierarchy hierarchy;
00117
00118
00119 uint symbol_rate;
00120 DTVCodeRate fec_inner;
00121 };
00122
00128 class TransportScanItem
00129 {
00130 public:
00131 TransportScanItem();
00132 TransportScanItem(uint _sourceid,
00133 const QString &_si_std,
00134 const QString &_name,
00135 uint _mplexid,
00136 uint _timeoutTune);
00137
00138 TransportScanItem(uint _sourceid,
00139 const QString &_name,
00140 DTVMultiplex &_tuning,
00141 uint _timeoutTune);
00142
00143 TransportScanItem(uint _sourceid,
00144 const QString &_name,
00145 DTVTunerType _tuner_type,
00146 const DTVTransport &_tuning,
00147 uint _timeoutTune);
00148
00149 TransportScanItem(uint _sourceid,
00150 const QString &_si_std,
00151 const QString &strFmt,
00152 uint freqNum,
00153 uint frequency,
00154 const FrequencyTable&,
00155 uint _timeoutTune);
00156
00157 uint offset_cnt() const
00158 { return (freq_offsets[2]) ? 3 : ((freq_offsets[1]) ? 2 : 1); }
00159
00160 uint64_t freq_offset(uint i) const;
00161
00162 QString toString() const;
00163
00164 private:
00165 uint GetMultiplexIdFromDB(void) const;
00166
00167 public:
00168 uint mplexid;
00169
00170 QString FriendlyName;
00171 uint friendlyNum;
00172 int SourceID;
00173 bool UseTimer;
00176 bool scanning;
00177 int freq_offsets[3];
00178 unsigned timeoutTune;
00179
00180 DTVMultiplex tuning;
00181
00182 DTVChannelInfoList expectedChannels;
00183 };
00184
00185 class transport_scan_items_it_t
00186 {
00187 public:
00188 transport_scan_items_it_t() : _offset(0) {}
00189 transport_scan_items_it_t(const list<TransportScanItem>::iterator it)
00190 {
00191 _it = it;
00192 _offset = 0;
00193 }
00194
00195 transport_scan_items_it_t& operator++()
00196 {
00197 _offset++;
00198 if ((uint)_offset >= (*_it).offset_cnt())
00199 {
00200 ++_it;
00201 _offset = 0;
00202 }
00203 return *this;
00204 }
00205 transport_scan_items_it_t& operator--()
00206 {
00207 _offset--;
00208 if (_offset < 0)
00209 {
00210 --_it;
00211 _offset = (*_it).offset_cnt() - 1;
00212 }
00213 return *this;
00214 }
00215
00216 transport_scan_items_it_t operator++(int)
00217 {
00218 transport_scan_items_it_t tmp = *this;
00219 operator++();
00220 return tmp;
00221 }
00222
00223 transport_scan_items_it_t operator--(int)
00224 {
00225 transport_scan_items_it_t tmp = *this;
00226 operator--();
00227 return tmp;
00228 }
00229
00230 transport_scan_items_it_t& operator+=(int incr)
00231 { for (int i = 0; i < incr; i++) ++(*this); return *this; }
00232 transport_scan_items_it_t& operator-=(int incr)
00233 { for (int i = 0; i < incr; i++) --(*this); return *this; }
00234
00235
00236 const TransportScanItem& operator*() const { return *_it; }
00237 TransportScanItem& operator*() { return *_it; }
00238
00239 list<TransportScanItem>::iterator iter() { return _it; }
00240 list<TransportScanItem>::const_iterator iter() const { return _it; }
00241 uint offset() const { return (uint) _offset; }
00242 transport_scan_items_it_t nextTransport() const
00243 {
00244 list<TransportScanItem>::iterator tmp = _it;
00245 return transport_scan_items_it_t(++tmp);
00246 }
00247
00248 private:
00249 list<TransportScanItem>::iterator _it;
00250 int _offset;
00251
00252 friend bool operator==(const transport_scan_items_it_t&,
00253 const transport_scan_items_it_t&);
00254 friend bool operator!=(const transport_scan_items_it_t&,
00255 const transport_scan_items_it_t&);
00256
00257 friend bool operator==(const transport_scan_items_it_t&,
00258 const list<TransportScanItem>::iterator&);
00259 };
00260
00261 inline bool operator==(const transport_scan_items_it_t& A,
00262 const transport_scan_items_it_t& B)
00263 {
00264 list<TransportScanItem>::const_iterator A_it = A._it;
00265 list<TransportScanItem>::const_iterator B_it = B._it;
00266
00267 return (A_it == B_it) && (A._offset == B._offset);
00268 }
00269
00270 inline bool operator!=(const transport_scan_items_it_t &A,
00271 const transport_scan_items_it_t &B)
00272 {
00273 return (A._it != B._it) || (A._offset != B._offset);
00274 }
00275
00276 inline bool operator==(const transport_scan_items_it_t& A,
00277 const list<TransportScanItem>::iterator& B)
00278 {
00279 list<TransportScanItem>::const_iterator A_it = A._it;
00280 list<TransportScanItem>::const_iterator B_it = B;
00281
00282 return (A_it == B_it) && (0 == A.offset());
00283 }
00284
00285 typedef list<TransportScanItem> transport_scan_items_t;
00286
00287 #endif // FREQUENCY_TABLE_H