File: TVChannel.cpp

package info (click to toggle)
camstream 0.27%2Bdfsg-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 12,320 kB
  • ctags: 5,393
  • sloc: cpp: 17,031; sh: 8,154; asm: 455; ansic: 440; makefile: 343
file content (188 lines) | stat: -rw-r--r-- 5,458 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

#include <qapplication.h>

#include "TVChannel.h"

bool TVChannel::s_TablesFilled = false;
QVector<TVChannel::FrequencyTableEntry> TVChannel::s_Channel2BaseFrequency[TVChannel::FrequencyGrid_MAX];


TVChannel::TVChannel()
{
  Name = QString::null;
  FrequencySystem = FrequencyGrid_INVALID;
  Channel = 0;
  Finetuning = 0;
  ColorSystem = PAL_BG;
}

TVChannel::TVChannel(const TVChannel &org)
{
  Name = org.Name;
  FrequencySystem = org.FrequencySystem;
  Channel = org.Channel;
  Finetuning = org.Finetuning;
  ColorSystem = org.ColorSystem;
}

TVChannel &TVChannel::operator =(const TVChannel &org)
{
  // kkeep ListView parent
  Name = org.Name;
  FrequencySystem = org.FrequencySystem;
  Channel = org.Channel;
  Finetuning = org.Finetuning;
  ColorSystem = org.ColorSystem;
  return *this;
}

// private

/**
  \brief Fill frequency base tables with names and frequencies
*/
void TVChannel::FillTables()
{
   int i, j;
   QString fname;

   if (s_TablesFilled)
     return;

   s_Channel2BaseFrequency[European].resize(109); // Total number of channels for Europe
   s_Channel2BaseFrequency[European].setAutoDelete(true);
   for (i = 0; i < 109; i++)
   {
      s_Channel2BaseFrequency[European].insert(i, new FrequencyTableEntry());
   }

   j = 0;
   for (i = 0; i < 3; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("VHF %d", 2 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 48.25 + 7.0 * i;
   }
   for (i = 0; i < 8; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("VHF %d", 5 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 175.25 + 7.0 * i;
   }
   /* The following set of frequencies make no sense at all. */
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy A");
   s_Channel2BaseFrequency[European][j++]->Frequency = 53.75;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy B");
   s_Channel2BaseFrequency[European][j++]->Frequency = 62.25;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy C");
   s_Channel2BaseFrequency[European][j++]->Frequency = 82.25;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy D");
   s_Channel2BaseFrequency[European][j++]->Frequency = 175.25;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy E");
   s_Channel2BaseFrequency[European][j++]->Frequency = 183.75;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy F");
   s_Channel2BaseFrequency[European][j++]->Frequency = 192.25;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy G");
   s_Channel2BaseFrequency[European][j++]->Frequency = 201.25;
   s_Channel2BaseFrequency[European][j  ]->Name = tr("Italy H");
   s_Channel2BaseFrequency[European][j++]->Frequency = 210.25;

   /* UHF band */
   for (i = 0; i < 49; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("UHF %d", 21 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 471.25 + 8.0 * i;
   }
   /* Cable */
   for (i = 0; i < 10; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("CATV S%d", 1 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 105.25 + 7.0 * i;
   }
   for (i = 0; i < 10; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("CATV S%d", 11 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 231.25 + 7.0 * i;
   }
   for (i = 0; i < 21; i++) {
      s_Channel2BaseFrequency[European][j  ]->Name = fname.sprintf("CATV S%d", 21 + i);
      s_Channel2BaseFrequency[European][j++]->Frequency = 303.25 + 8.0 * i;
   }

   s_TablesFilled = true;
}



// public

/**
  \brief Calculate frequency for this channel
  \return The frequency in MHz

  See also the function below.

*/

float TVChannel::Frequency() const
{
   return Frequency(FrequencySystem, Channel, Finetuning);
}

/**
  \brief Calculate frequency for channel + finetuning
  \return The frequency in MHz
  \param grid The frequency grid system
  \param channel The channel in this grid
  \param finetuning The finetuning offset, in 0.01 MHz

  Note: the frequency is in MHz, so for the real frequency multiply by 1e6.

*/
float TVChannel::Frequency(FrequencyGrid grid, int channel, int finetuning)
{
   float fr;

   FillTables();

   if (grid < 0 || grid >= FrequencyGrid_MAX)
     return 0.0;

   if (channel < 0 || channel >= s_Channel2BaseFrequency[grid].count())
     return 0.0;

   fr = s_Channel2BaseFrequency[grid][channel]->Frequency + finetuning / 100.0;
   return fr;
}


/**
  \brief Return number of channels within a grid
  \return Number of channels, or 0 if invalid grid
  \see ChannelName

*/
uint TVChannel::GetNumberOfChannels(FrequencyGrid grid)
{
   if (grid < 0 || grid >= FrequencyGrid_MAX)
     return 0;
   FillTables();
   return s_Channel2BaseFrequency[grid].count();
}


/**
  \brief Return name of a channel
  \param grid The frequency grid system
  \param channel The channel in this grid
  \return The name of this channel, like VHF 1, or CATV 23

  Note: the name is not a TV channel name, but a rather systemic name
  given to the channel within the given frequency system, like VHF 3,
  UHF 21, etc.
*/
QString TVChannel::ChannelName(FrequencyGrid grid, int channel)
{
   FillTables();

   if (grid < 0 || grid >= FrequencyGrid_MAX)
     return QString::null;

   if (channel < 0 || channel >= s_Channel2BaseFrequency[grid].count())
     return QString::null;
   return s_Channel2BaseFrequency[grid][channel]->Name;
}