00001
00002
00003 #ifndef FREQUENCY_TABLE_H
00004 #define FREQUENCY_TABLE_H
00005
00006
00007 #include <vector>
00008 using namespace std;
00009
00010
00011 #include <qmap.h>
00012 #include <qstring.h>
00013 #include <qmutex.h>
00014
00015
00016 #include "dtvchannel.h"
00017
00018 #include "mythexp.h"
00019 #include "dvbconfparser.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 init_freq_tables();
00029
00030 freq_table_list_t get_matching_freq_tables(
00031 QString format, QString modulation, QString country);
00032
00033 MPUBLIC 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),
00051 modulation(_modulation) { ; }
00052
00053 FrequencyTable(uint64_t _frequencyStart,
00054 uint64_t _frequencyEnd,
00055 uint _frequencyStep,
00056 QString _name_format,
00057 int _name_offset,
00058 DTVInversion _inversion,
00059 DTVBandwidth _bandwidth,
00060 DTVCodeRate _coderate_hp,
00061 DTVCodeRate _coderate_lp,
00062 DTVModulation _constellation,
00063 DTVTransmitMode _trans_mode,
00064 DTVGuardInterval _guard_interval,
00065 DTVHierarchy _hierarchy,
00066 DTVModulation _modulation,
00067 int _offset1,
00068 int _offset2)
00069 : name_format(_name_format), name_offset(_name_offset),
00070 frequencyStart(_frequencyStart), frequencyEnd(_frequencyEnd),
00071 frequencyStep(_frequencyStep), modulation(_modulation),
00072 offset1(_offset1), offset2(_offset2),
00073 inversion(_inversion), bandwidth(_bandwidth),
00074 coderate_hp(_coderate_hp), coderate_lp(_coderate_lp),
00075 constellation(_constellation), trans_mode(_trans_mode),
00076 guard_interval(_guard_interval), hierarchy(_hierarchy) { ; }
00077
00078 virtual ~FrequencyTable() { ; }
00079
00080
00081 QString name_format;
00082 int name_offset;
00083 uint64_t frequencyStart;
00084 uint64_t frequencyEnd;
00085 uint frequencyStep;
00086 DTVModulation modulation;
00087 int offset1;
00088 int offset2;
00089
00090
00091 DTVInversion inversion;
00092 DTVBandwidth bandwidth;
00093 DTVCodeRate coderate_hp;
00094 DTVCodeRate coderate_lp;
00095 DTVModulation constellation;
00096 DTVTransmitMode trans_mode;
00097 DTVGuardInterval guard_interval;
00098 DTVHierarchy hierarchy;
00099 };
00100
00106 class TransportScanItem
00107 {
00108 public:
00109 TransportScanItem();
00110 TransportScanItem(uint _sourceid,
00111 const QString &_si_std,
00112 const QString &_name,
00113 uint _mplexid,
00114 uint _timeoutTune);
00115
00116 TransportScanItem(uint _sourceid,
00117 const QString &_name,
00118 DTVMultiplex &_tuning,
00119 uint _timeoutTune);
00120
00121 TransportScanItem(uint _sourceid,
00122 const QString &_name,
00123 DTVTunerType _tuner_type,
00124 const DTVTransport &_tuning,
00125 uint _timeoutTune);
00126
00127 TransportScanItem(uint _sourceid,
00128 const QString &_si_std,
00129 const QString &strFmt,
00130 uint freqNum,
00131 uint frequency,
00132 const FrequencyTable&,
00133 uint _timeoutTune);
00134
00135 uint offset_cnt() const
00136 { return (freq_offsets[2]) ? 3 : ((freq_offsets[1]) ? 2 : 1); }
00137
00138 uint64_t freq_offset(uint i) const;
00139
00140 QString toString() const;
00141
00142 private:
00143 uint GetMultiplexIdFromDB(void) const;
00144
00145 public:
00146 uint mplexid;
00147
00148 QString FriendlyName;
00149 uint friendlyNum;
00150 int SourceID;
00151 bool UseTimer;
00154 bool scanning;
00155 int freq_offsets[3];
00156 unsigned timeoutTune;
00157
00158 DTVMultiplex tuning;
00159
00160 DTVChannelInfoList expectedChannels;
00161 };
00162
00163 class transport_scan_items_it_t
00164 {
00165 public:
00166 transport_scan_items_it_t() : _offset(0) {}
00167 transport_scan_items_it_t(const QValueList<TransportScanItem>::iterator it)
00168 {
00169 _it = it;
00170 _offset = 0;
00171 }
00172
00173 transport_scan_items_it_t& operator++()
00174 {
00175 _offset++;
00176 if ((uint)_offset >= (*_it).offset_cnt())
00177 {
00178 ++_it;
00179 _offset = 0;
00180 }
00181 return *this;
00182 }
00183 transport_scan_items_it_t& operator--()
00184 {
00185 _offset--;
00186 if (_offset < 0)
00187 {
00188 --_it;
00189 _offset = (*_it).offset_cnt() - 1;
00190 }
00191 return *this;
00192 }
00193
00194 transport_scan_items_it_t operator++(int)
00195 { transport_scan_items_it_t tmp = *this; return ++tmp; }
00196 transport_scan_items_it_t operator--(int)
00197 { transport_scan_items_it_t tmp = *this; return --tmp; }
00198
00199 transport_scan_items_it_t& operator+=(int incr)
00200 { for (int i = 0; i < incr; i++) ++(*this); return *this; }
00201 transport_scan_items_it_t& operator-=(int incr)
00202 { for (int i = 0; i < incr; i++) --(*this); return *this; }
00203
00204
00205 const TransportScanItem& operator*() const { return *_it; }
00206 TransportScanItem& operator*() { return *_it; }
00207
00208 uint offset() const { return (uint) _offset; }
00209 transport_scan_items_it_t nextTransport() const
00210 {
00211 QValueList<TransportScanItem>::iterator tmp = _it;
00212 return transport_scan_items_it_t(++tmp);
00213 }
00214 private:
00215 QValueList<TransportScanItem>::iterator _it;
00216 int _offset;
00217
00218 friend bool operator==(const transport_scan_items_it_t&,
00219 const transport_scan_items_it_t&);
00220 friend bool operator!=(const transport_scan_items_it_t&,
00221 const transport_scan_items_it_t&);
00222
00223 friend bool operator==(const transport_scan_items_it_t&,
00224 const QValueList<TransportScanItem>::iterator&);
00225 };
00226
00227 inline bool operator==(const transport_scan_items_it_t& A,
00228 const transport_scan_items_it_t &B)
00229 {
00230 return (A._it == B._it) && (A._offset == B._offset);
00231 }
00232
00233 inline bool operator!=(const transport_scan_items_it_t &A,
00234 const transport_scan_items_it_t &B)
00235 {
00236 return (A._it != B._it) || (A._offset != B._offset);
00237 }
00238
00239 inline bool operator==(const transport_scan_items_it_t& A,
00240 const QValueList<TransportScanItem>::iterator& B)
00241 {
00242 return A._it == B && (0 == A.offset());
00243 }
00244
00245 typedef QValueList<TransportScanItem> transport_scan_items_t;
00246
00247 #endif // FREQUENCY_TABLE_H