1 /*
2 * This code is taken from xawdecode and adapted a bit...
3 * purpose: make ffv1rec able to read xawdecode's channel tables.
4 * The code is neither fast nor elegant, but since it runs only once on startup
5 * I didn't care
6 */
7
8
9 /*****************************************************************************
10 * frequencies.c: frequencies TV table
11 *****************************************************************************
12 * $Id$
13 *****************************************************************************
14 * Copyright (C) 2003 Keuleu
15 * Thu 06 Nov 2003 10:50:41 AM EET - Lucian Langa <cooly@eweb.ro>
16 * Added SR1-SR8, SR11-SR18 channels for east-europe freq table
17 * Wed 10 Dec 2003 04:00:49 PM EET - cooly
18 * Added secam-russia tab
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
33 *****************************************************************************/
34
35
36
37
38
39
40 /* COMPREHENSIVE LIST OF FORMAT BY COUNTRY
41 (M) NTSC used in:
42 Antigua, Aruba, Bahamas, Barbados, Belize, Bermuda, Bolivia, Burma,
43 Canada, Chile, Colombia, Costa Rica, Cuba, Curacao, Dominican Republic,
44 Ecuador, El Salvador, Guam Guatemala, Honduras, Jamaica, Japan,
45 South Korea, Mexico, Montserrat, Myanmar, Nicaragua, Panama, Peru,
46 Philippines, Puerto Rico, St Christopher and Nevis, Samoa, Suriname,
47 Taiwan, Trinidad/Tobago, United States, Venezuela, Virgin Islands
48 (B) PAL used in:
49 Albania, Algeria, Australia, Austria, Bahrain, Bangladesh, Belgium,
50 Bosnia-Herzegovinia, Brunei Darussalam, Cambodia, Cameroon, Croatia,
51 Cyprus, Denmark, Egypt, Ethiopia, Equatorial Guinea, Finland, Germany,
52 Ghana, Gibraltar, Greenland, Iceland, India, Indonesia, Israel, Italy,
53 Jordan, Kenya, Kuwait, Liberia, Libya, Luxembourg, Malaysa, Maldives,
54 Malta, Nepal, Netherlands, New Zeland, Nigeria, Norway, Oman, Pakistan,
55 Papua New Guinea, Portugal, Qatar, Sao Tome and Principe, Saudi Arabia,
56 Seychelles, Sierra Leone, Singapore, Slovenia, Somali, Spain,
57 Sri Lanka, Sudan, Swaziland, Sweden, Switzeland, Syria, Thailand,
58 Tunisia, Turkey, Uganda, United Arab Emirates, Yemen
59 (N) PAL used in: (Combination N = 4.5MHz audio carrier, 3.58MHz burst)
60 Argentina (Combination N), Paraguay, Uruguay
61 (M) PAL (525/60, 3.57MHz burst) used in:
62 Brazil
63 (G) PAL used in:
64 Albania, Algeria, Austria, Bahrain, Bosnia/Herzegovinia, Cambodia,
65 Cameroon, Croatia, Cyprus, Denmark, Egypt, Ethiopia, Equatorial Guinea,
66 Finland, Germany, Gibraltar, Greenland, Iceland, Israel, Italy, Jordan,
67 Kenya, Kuwait, Liberia, Libya, Luxembourg, Malaysia, Monaco,
68 Mozambique, Netherlands, New Zealand, Norway, Oman, Pakistan,
69 Papa New Guinea, Portugal, Qatar, Romania, Sierra Leone, Singapore,
70 Slovenia, Somalia, Spain, Sri Lanka, Sudan, Swaziland, Sweeden,
71 Switzerland, Syria, Thailand, Tunisia, Turkey, United Arab Emirates,
72 Yemen, Zambia, Zimbabwe
73 (D) PAL used in:
74 China, North Korea, Romania
75 (H) PAL used in:
76 Belgium
77 (I) PAL used in:
78 Angola, Botswana, Gambia, Guinea-Bissau, Hong Kong, Ireland, Lesotho,
79 Malawi, Nambia, Nigeria, South Africa, Tanzania, United Kingdom,
80 Zanzibar
81 (B) SECAM used in:
82 Djibouti, Greece, Iran, Iraq, Lebanon, Mali, Mauritania, Mauritus,
83 Morocco
84 (D) SECAM used in:
85 Afghanistan, Armenia, Azerbaijan, Belarus, Bulgaria, Czech Republic,
86 Estonia, Georgia, Hungary, Zazakhstan, Lithuania, Mongolia, Moldova,
87 Poland, Russia, Slovak Republic, Ukraine, Vietnam
88 (G) SECAM used in:
89 Greecem Iran, Iraq, Mali, Mauritus, Morocco, Saudi Arabia
90 (K) SECAM used in:
91 Armenia, Azerbaijan, Bulgaria, Czech Republic, Estonia, Georgia,
92 Hungary, Kazakhstan, Lithuania, Madagascar, Moldova, Poland, Russia,
93 Slovak Republic, Ukraine, Vietnam
94 (K1) SECAM used in:
95 Benin, Burkina Faso, Burundi, Chad, Cape Verde, Central African
96 Republic, Comoros, Congo, Gabon, Madagascar, Niger, Rwanda, Senegal,
97 Togo, Zaire
98 (L) SECAM used in:
99 France
100 */
101 struct freqlist
102 {
103 char name[5];
104 int freq[12];
105 };
106
107
108
109
110 #include <stdlib.h>
111 #include <stdio.h>
112 #include <string.h>
113 struct STRTAB
114 {
115 int nr;
116 char *str;
117 };
118
119 struct STRTAB chan_names[] = {
120 {0, "ntsc-bcast"},
121 {1, "ntsc-cable"},
122 {2, "ntsc-bcast-jp"},
123 {3, "ntsc-cable-jp"},
124 {4, "secam-france"},
125 {5, "secam-russia"},
126 {6, "pal-europe"},
127 {7, "pal-europe-east"},
128 {8, "pal-italy"},
129 {9, "pal-newzealand"},
130 {10, "pal-australia"},
131 {11, "pal-ireland"},
132 {-1, NULL}
133 };
134
135
136 /* ------------------------------------------------------------------------- */
137 /* moved here from channels.h */
138
139 /* NOTE : NTSC BROADCAST OVER 69 WERE RE-ALLOCATED CELLULAR, included anyway */
140
141 struct freqlist tvtuner[] = {
142 /* CH US-TV US-CATV JP-TV JP-CATV SECAMF SECAMR EUROPE EUR-E ITALY NZ AU UHF_GHI */
143 {"K02", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
144 {"E2", {0, 0, 0, 0, 48250, 0, 48250, 0, 0, 0, 0, 0}},
145 {"E3", {0, 0, 0, 0, 55250, 0, 55250, 0, 0, 0, 0, 0}},
146 {"E4", {0, 0, 0, 0, 62250, 0, 62250, 0, 0, 0, 0, 0}},
147
148 {"S01", {0, 0, 0, 0, 0, 0, 69250, 0, 0, 0, 0, 0}},
149 {"S02", {0, 0, 0, 0, 0, 0, 76250, 0, 0, 0, 0, 0}},
150 {"S03", {0, 0, 0, 0, 0, 0, 83250, 0, 0, 0, 0, 0}},
151
152 {"R1", {0, 0, 0, 0, 0, 49750, 0, 49750, 0, 0, 0, 0}},
153 {"R2", {0, 0, 0, 0, 0, 59250, 0, 59250, 0, 0, 0, 0}},
154 {"R3", {0, 0, 0, 0, 0, 77250, 0, 77250, 0, 0, 0, 0}},
155 {"R4", {0, 0, 0, 0, 0, 84250, 0, 84250, 0, 0, 0, 0}},
156 {"R5", {0, 0, 0, 0, 0, 93250, 0, 93250, 0, 0, 0, 0}},
157
158 {"SE1", {0, 0, 0, 0, 105250, 0, 105250, 105250, 0, 0, 0, 0}},
159 {"SE2", {0, 0, 0, 0, 112250, 0, 112250, 112250, 0, 0, 0, 0}},
160 {"SE3", {0, 0, 0, 0, 119250, 0, 119250, 119250, 0, 0, 0, 0}},
161 {"SE4", {0, 0, 0, 0, 126250, 0, 126250, 126250, 0, 0, 0, 0}},
162 {"SE5", {0, 0, 0, 0, 133250, 0, 133250, 133250, 0, 0, 0, 0}},
163 {"SE6", {0, 0, 0, 0, 140250, 0, 140250, 140250, 0, 0, 0, 0}},
164 {"SE7", {0, 0, 0, 0, 147250, 0, 147250, 147250, 0, 0, 0, 0}},
165 {"SE8", {0, 0, 0, 0, 154250, 0, 154250, 154250, 0, 0, 0, 0}},
166 {"SE9", {0, 0, 0, 0, 161250, 0, 161250, 161250, 0, 0, 0, 0}},
167 {"SE10", {0, 0, 0, 0, 168250, 0, 168250, 168250, 0, 0, 0, 0}},
168
169 {"E5", {0, 0, 0, 0, 175250, 0, 175250, 0, 0, 0, 0, 0}},
170 {"E6", {0, 0, 0, 0, 182250, 0, 182250, 0, 0, 0, 0, 0}},
171 {"E7", {0, 0, 0, 0, 189250, 0, 189250, 0, 0, 0, 0, 0}},
172 {"E8", {0, 0, 0, 0, 196250, 0, 196250, 0, 0, 0, 0, 0}},
173 {"E9", {0, 0, 0, 0, 203250, 0, 203250, 0, 0, 0, 0, 0}},
174 {"E10", {0, 0, 0, 0, 210250, 0, 210250, 0, 0, 0, 0, 0}},
175 {"E11", {0, 0, 0, 0, 217250, 0, 217250, 0, 0, 0, 0, 0}},
176 {"E12", {0, 0, 0, 0, 224250, 0, 224250, 0, 0, 0, 0, 0}},
177
178 {"R6", {0, 0, 0, 0, 0, 175250, 0, 175250, 0, 0, 0, 0}},
179 {"R7", {0, 0, 0, 0, 0, 183250, 0, 183250, 0, 0, 0, 0}},
180 {"R8", {0, 0, 0, 0, 0, 191250, 0, 191250, 0, 0, 0, 0}},
181 {"R9", {0, 0, 0, 0, 0, 199250, 0, 199250, 0, 0, 0, 0}},
182 {"R10", {0, 0, 0, 0, 0, 207250, 0, 207250, 0, 0, 0, 0}},
183 {"R11", {0, 0, 0, 0, 0, 215250, 0, 215250, 0, 0, 0, 0}},
184 {"R12", {0, 0, 0, 0, 0, 223250, 0, 223250, 0, 0, 0, 0}},
185
186 {"SE11", {0, 0, 0, 0, 231250, 0, 231250, 231250, 0, 0, 0, 0}},
187 {"SE12", {0, 0, 0, 0, 238250, 0, 238250, 238250, 0, 0, 0, 0}},
188 {"SE13", {0, 0, 0, 0, 245250, 0, 245250, 245250, 0, 0, 0, 0}},
189 {"SE14", {0, 0, 0, 0, 252250, 0, 252250, 252250, 0, 0, 0, 0}},
190 {"SE15", {0, 0, 0, 0, 259250, 0, 259250, 259250, 0, 0, 0, 0}},
191 {"SE16", {0, 0, 0, 0, 266250, 0, 266250, 266250, 0, 0, 0, 0}},
192 {"SE17", {0, 0, 0, 0, 273250, 0, 273250, 273250, 0, 0, 0, 0}},
193 {"SE18", {0, 0, 0, 0, 280250, 0, 280250, 280250, 0, 0, 0, 0}},
194 {"SE19", {0, 0, 0, 0, 287250, 0, 287250, 287250, 0, 0, 0, 0}},
195 {"SE20", {0, 0, 0, 0, 294250, 0, 294250, 294250, 0, 0, 0, 0}},
196
197 {"SR1", {0, 0, 0, 0, 0, 111250, 0, 111250, 0, 0, 0, 0}},
198 {"SR2", {0, 0, 0, 0, 0, 119250, 0, 119250, 0, 0, 0, 0}},
199 {"SR3", {0, 0, 0, 0, 0, 127250, 0, 127250, 0, 0, 0, 0}},
200 {"SR4", {0, 0, 0, 0, 0, 135250, 0, 135250, 0, 0, 0, 0}},
201 {"SR5", {0, 0, 0, 0, 0, 143250, 0, 143250, 0, 0, 0, 0}},
202 {"SR6", {0, 0, 0, 0, 0, 151250, 0, 151250, 0, 0, 0, 0}},
203 {"SR7", {0, 0, 0, 0, 0, 159250, 0, 159250, 0, 0, 0, 0}},
204 {"SR8", {0, 0, 0, 0, 0, 167250, 0, 167250, 0, 0, 0, 0}},
205
206 {"SR11", {0, 0, 0, 0, 0, 231250, 0, 231250, 0, 0, 0, 0}},
207 {"SR12", {0, 0, 0, 0, 0, 239250, 0, 239250, 0, 0, 0, 0}},
208 {"SR13", {0, 0, 0, 0, 0, 247250, 0, 247250, 0, 0, 0, 0}},
209 {"SR14", {0, 0, 0, 0, 0, 255250, 0, 255250, 0, 0, 0, 0}},
210 {"SR15", {0, 0, 0, 0, 0, 263250, 0, 263250, 0, 0, 0, 0}},
211 {"SR16", {0, 0, 0, 0, 0, 271250, 0, 271250, 0, 0, 0, 0}},
212 {"SR17", {0, 0, 0, 0, 0, 279250, 0, 279250, 0, 0, 0, 0}},
213 {"SR18", {0, 0, 0, 0, 0, 287259, 0, 287250, 0, 0, 0, 0}},
214
215 {"S21", {0, 0, 0, 0, 303250, 303250, 303250, 303250, 0, 0, 0, 0}},
216 {"S22", {0, 0, 0, 0, 311250, 311250, 311250, 311250, 0, 0, 0, 0}},
217 {"S23", {0, 0, 0, 0, 319250, 319250, 319250, 319250, 0, 0, 0, 0}},
218 {"S24", {0, 0, 0, 0, 327250, 327250, 327250, 327250, 0, 0, 0, 0}},
219 {"S25", {0, 0, 0, 0, 335250, 335250, 335250, 335250, 0, 0, 0, 0}},
220 {"S26", {0, 0, 0, 0, 343250, 343250, 343250, 343250, 0, 0, 0, 0}},
221 {"S27", {0, 0, 0, 0, 351250, 351250, 351250, 351250, 0, 0, 0, 0}},
222 {"S28", {0, 0, 0, 0, 359250, 359250, 359250, 359250, 0, 0, 0, 0}},
223 {"S29", {0, 0, 0, 0, 367250, 367250, 367250, 367250, 0, 0, 0, 0}},
224 {"S30", {0, 0, 0, 0, 375250, 375250, 375250, 375250, 0, 0, 0, 0}},
225 {"S31", {0, 0, 0, 0, 383250, 383250, 383250, 383250, 0, 0, 0, 0}},
226 {"S32", {0, 0, 0, 0, 391250, 391250, 391250, 391250, 0, 0, 0, 0}},
227 {"S33", {0, 0, 0, 0, 399250, 399250, 399250, 399250, 0, 0, 0, 0}},
228 {"S34", {0, 0, 0, 0, 407250, 407250, 407250, 407250, 0, 0, 0, 0}},
229 {"S35", {0, 0, 0, 0, 415250, 415250, 415250, 415250, 0, 0, 0, 0}},
230 {"S36", {0, 0, 0, 0, 423250, 423250, 423250, 423250, 0, 0, 0, 0}},
231 {"S37", {0, 0, 0, 0, 431250, 431250, 431250, 431250, 0, 0, 0, 0}},
232 {"S38", {0, 0, 0, 0, 439250, 439250, 439250, 439250, 0, 0, 0, 0}},
233 {"S39", {0, 0, 0, 0, 447250, 447250, 447250, 447250, 0, 0, 0, 0}},
234 {"S40", {0, 0, 0, 0, 455250, 455250, 455250, 455250, 0, 0, 0, 0}},
235 {"S41", {0, 0, 0, 0, 463250, 463250, 463250, 463250, 0, 0, 0, 0}},
236
237 {"K01", {0, 0, 0, 0, 47750, 0, 0, 0, 0, 0, 0, 0}},
238 {"K02", {0, 0, 0, 0, 55750, 0, 0, 0, 0, 0, 0, 0}},
239 {"K03", {0, 0, 0, 0, 60500, 0, 0, 0, 0, 0, 0, 0}},
240 {"K04", {0, 0, 0, 0, 63750, 0, 0, 0, 0, 0, 0, 0}},
241 {"K05", {0, 0, 0, 0, 176000, 0, 0, 0, 0, 0, 0, 0}},
242 {"K06", {0, 0, 0, 0, 184000, 0, 0, 0, 0, 0, 0, 0}},
243 {"K07", {0, 0, 0, 0, 192000, 0, 0, 0, 0, 0, 0, 0}},
244 {"K08", {0, 0, 0, 0, 200000, 0, 0, 0, 0, 0, 0, 0}},
245 {"K09", {0, 0, 0, 0, 208000, 0, 0, 0, 0, 0, 0, 0}},
246 {"K10", {0, 0, 0, 0, 216000, 0, 0, 0, 0, 0, 0, 0}},
247 {"K B", {0, 0, 0, 0, 116750, 0, 0, 0, 0, 0, 0, 0}},
248 {"K C", {0, 0, 0, 0, 128750, 0, 0, 0, 0, 0, 0, 0}},
249 {"K D", {0, 0, 0, 0, 140750, 0, 0, 0, 0, 0, 0, 0}},
250 {"K E", {0, 0, 0, 0, 159750, 0, 0, 0, 0, 0, 0, 0}},
251 {"K F", {0, 0, 0, 0, 164750, 0, 0, 0, 0, 0, 0, 0}},
252 {"K G", {0, 0, 0, 0, 176750, 0, 0, 0, 0, 0, 0, 0}},
253 {"K H", {0, 0, 0, 0, 188750, 0, 0, 0, 0, 0, 0, 0}},
254 {"K I", {0, 0, 0, 0, 200750, 0, 0, 0, 0, 0, 0, 0}},
255 {"K J", {0, 0, 0, 0, 212750, 0, 0, 0, 0, 0, 0, 0}},
256 {"K K", {0, 0, 0, 0, 224750, 0, 0, 0, 0, 0, 0, 0}},
257 {"K L", {0, 0, 0, 0, 236750, 0, 0, 0, 0, 0, 0, 0}},
258 {"K M", {0, 0, 0, 0, 248750, 0, 0, 0, 0, 0, 0, 0}},
259 {"K N", {0, 0, 0, 0, 260750, 0, 0, 0, 0, 0, 0, 0}},
260 {"K O", {0, 0, 0, 0, 272750, 0, 0, 0, 0, 0, 0, 0}},
261 {"K P", {0, 0, 0, 0, 284750, 0, 0, 0, 0, 0, 0, 0}},
262 {"K Q", {0, 0, 0, 0, 296750, 0, 0, 0, 0, 0, 0, 0}},
263 {"H01", {0, 0, 0, 0, 303250, 0, 0, 0, 0, 0, 0, 0}},
264 {"H02", {0, 0, 0, 0, 311250, 0, 0, 0, 0, 0, 0, 0}},
265 {"H03", {0, 0, 0, 0, 319250, 0, 0, 0, 0, 0, 0, 0}},
266 {"H04", {0, 0, 0, 0, 327250, 0, 0, 0, 0, 0, 0, 0}},
267 {"H05", {0, 0, 0, 0, 335250, 0, 0, 0, 0, 0, 0, 0}},
268 {"H06", {0, 0, 0, 0, 343250, 0, 0, 0, 0, 0, 0, 0}},
269 {"H07", {0, 0, 0, 0, 351250, 0, 0, 0, 0, 0, 0, 0}},
270 {"H08", {0, 0, 0, 0, 359250, 0, 0, 0, 0, 0, 0, 0}},
271 {"H09", {0, 0, 0, 0, 367250, 0, 0, 0, 0, 0, 0, 0}},
272 {"H10", {0, 0, 0, 0, 375250, 0, 0, 0, 0, 0, 0, 0}},
273 {"H11", {0, 0, 0, 0, 383250, 0, 0, 0, 0, 0, 0, 0}},
274 {"H12", {0, 0, 0, 0, 391250, 0, 0, 0, 0, 0, 0, 0}},
275 {"H13", {0, 0, 0, 0, 399250, 0, 0, 0, 0, 0, 0, 0}},
276 {"H14", {0, 0, 0, 0, 407250, 0, 0, 0, 0, 0, 0, 0}},
277 {"H15", {0, 0, 0, 0, 415250, 0, 0, 0, 0, 0, 0, 0}},
278 {"H16", {0, 0, 0, 0, 423250, 0, 0, 0, 0, 0, 0, 0}},
279 {"H17", {0, 0, 0, 0, 431250, 0, 0, 0, 0, 0, 0, 0}},
280 {"H18", {0, 0, 0, 0, 439250, 0, 0, 0, 0, 0, 0, 0}},
281 {"H19", {0, 0, 0, 0, 447250, 0, 0, 0, 0, 0, 0, 0}},
282
283 {"0", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46250, 45750}},
284 {"1", {0, 73250, 91250, 0, 0, 0, 0, 0, 0, 45250, 57250, 53750}},
285 {"2", {55250, 55250, 97250, 0, 0, 0, 0, 0, 53750, 55250, 64250, 61750}},
286 {"3", {61250, 61250, 103250, 0, 0, 0, 0, 0, 62250, 62250, 86250, 175250}},
287 {"4", {67250, 67250, 171250, 0, 0, 0, 0, 0, 82250, 175250, 95250, 183250}},
288 {"5", {77250, 77250, 177250, 0, 0, 0, 0, 0, 175250, 182250, 102250, 191250}},
289 {"5A", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138250, 0}},
290 {"6", {83250, 83250, 183250, 0, 0, 0, 0, 0, 183750, 189250, 175250, 199250}},
291 {"7", {175250, 175250, 189250, 0, 0, 0, 0, 0, 192250, 196250, 182250, 207250}},
292 {"8", {181250, 181250, 193250, 0, 0, 0, 0, 0, 201250, 203250, 189250, 215250}},
293 {"9", {187250, 187250, 199250, 0, 0, 0, 0, 0, 210250, 210250, 196250, 0}},
294 {"10", {193250, 193250, 205250, 0, 0, 0, 0, 0, 210250, 217250, 209250, 0}},
295 {"11", {199250, 199250, 211250, 0, 0, 0, 0, 0, 217250, 0, 216250, 0}},
296 {"12", {205250, 205250, 217250, 0, 0, 0, 0, 0, 224250, 0, 0, 0}},
297
298 {"13", {211250, 211250, 0, 109250, 0, 0, 0, 0, 0, 0, 0, 0}},
299 {"14", {471250, 121250, 0, 115250, 0, 0, 0, 0, 0, 0, 0, 0}},
300 {"15", {477250, 127250, 0, 121250, 0, 0, 0, 0, 0, 0, 0, 0}},
301 {"16", {483250, 133250, 0, 127250, 0, 0, 0, 0, 0, 0, 0, 0}},
302 {"17", {489250, 139250, 0, 133250, 0, 0, 0, 0, 0, 0, 0, 0}},
303 {"18", {495250, 145250, 0, 139250, 0, 0, 0, 0, 0, 0, 0, 0}},
304 {"19", {501250, 151250, 0, 145250, 0, 0, 0, 0, 0, 0, 0, 0}},
305 {"20", {507250, 157250, 0, 151250, 0, 0, 0, 0, 0, 0, 0, 0}},
306
307 {"21", {513250, 163250, 0, 157250, 471250, 471250, 471250, 471250, 0, 471250, 0, 471250}},
308 {"22", {519250, 169250, 0, 165250, 479250, 479250, 479250, 479250, 0, 479250, 0, 479250}},
309 {"23", {525250, 217250, 0, 223250, 487250, 487250, 487250, 487250, 0, 487250, 0, 487250}},
310 {"24", {531250, 223250, 0, 231250, 495250, 495250, 495250, 495250, 0, 495250, 0, 495250}},
311 {"25", {537250, 229250, 0, 237250, 503250, 503250, 503250, 503250, 0, 503250, 0, 503250}},
312 {"26", {543250, 235250, 0, 243250, 511250, 511250, 511250, 511250, 0, 511250, 0, 511250}},
313 {"27", {549250, 241250, 0, 249250, 519250, 519250, 519250, 519250, 0, 519250, 0, 519250}},
314
315 {"28",
316 {555250, 247250, 0, 253250, 527250, 527250, 527250, 527250, 0, 527250, 527250, 527250}},
317 {"29",
318 {561250, 253250, 0, 259250, 535250, 535250, 535250, 535250, 0, 535250, 534250, 535250}},
319 {"30",
320 {567250, 259250, 0, 265250, 543250, 543250, 543250, 543250, 0, 543250, 541250, 543250}},
321 {"31",
322 {573250, 265250, 0, 271250, 551250, 551250, 551250, 551250, 0, 551250, 548250, 551250}},
323 {"32",
324 {579250, 271250, 0, 277250, 559250, 559250, 559250, 559250, 0, 559250, 555250, 559250}},
325 {"33",
326 {585250, 277250, 0, 283250, 567250, 567250, 567250, 567250, 0, 567250, 562250, 567250}},
327 {"34",
328 {591250, 283250, 0, 289250, 575250, 575250, 575250, 575250, 0, 575250, 569250, 575250}},
329 {"35",
330 {597250, 289250, 0, 295250, 583250, 583250, 583250, 583250, 0, 583250, 576250, 583250}},
331 {"36",
332 {603250, 295250, 0, 301250, 591250, 591250, 591250, 591250, 0, 591250, 0, 591250}},
333 {"37",
334 {609250, 301250, 0, 307250, 599250, 599250, 599250, 599250, 0, 599250, 0, 599250}},
335 {"38",
336 {615250, 307250, 0, 313250, 607250, 607250, 607250, 607250, 0, 607250, 0, 607250}},
337 {"39",
338 {621250, 313250, 0, 319250, 615250, 615250, 615250, 615250, 0, 615250, 604250, 615250}},
339 {"40",
340 {627250, 319250, 0, 325250, 623250, 623250, 623250, 623250, 0, 623250, 611250, 623250}},
341 {"41",
342 {633250, 325250, 0, 331250, 631250, 631250, 631250, 631250, 0, 631250, 618250, 631250}},
343 {"42",
344 {639250, 331250, 0, 337250, 639250, 639250, 639250, 639250, 0, 639250, 625250, 639250}},
345 {"43",
346 {645250, 337250, 0, 343250, 647250, 647250, 647250, 647250, 0, 647250, 632250, 647250}},
347 {"44",
348 {651250, 343250, 0, 349250, 655250, 655250, 655250, 655250, 0, 655250, 639250, 655250}},
349 {"45",
350 {657250, 349250, 663250, 355250, 663250, 663250, 663250, 663250, 0, 663250, 646250,
351 663250}},
352 {"46",
353 {663250, 355250, 669250, 361250, 671250, 671250, 671250, 671250, 0, 671250, 653250,
354 671250}},
355 {"47",
356 {669250, 361250, 675250, 367250, 679250, 679250, 679250, 679250, 0, 679250, 660250,
357 679250}},
358 {"48",
359 {675250, 367250, 681250, 373250, 687250, 687250, 687250, 687250, 0, 687250, 667250,
360 687250}},
361 {"49",
362 {681250, 373250, 687250, 379250, 695250, 695250, 695250, 695250, 0, 695250, 674250,
363 695250}},
364 {"50",
365 {687250, 379250, 693250, 385250, 703250, 703250, 703250, 703250, 0, 703250, 681250,
366 703250}},
367 {"51",
368 {693250, 385250, 699250, 391250, 711250, 711250, 711250, 711250, 0, 711250, 688250,
369 711250}},
370 {"52",
371 {699250, 391250, 705250, 397250, 719250, 719250, 719250, 719250, 0, 719250, 695250,
372 719250}},
373 {"53",
374 {705250, 397250, 711250, 403250, 727250, 727250, 727250, 727250, 0, 727250, 702250,
375 727250}},
376 {"54",
377 {711250, 403250, 717250, 409250, 735250, 735250, 735250, 735250, 0, 735250, 709250,
378 735250}},
379 {"55",
380 {717250, 409250, 723250, 415250, 743250, 743250, 743250, 743250, 0, 743250, 716250,
381 743250}},
382 {"56",
383 {723250, 415250, 729250, 421250, 751250, 751250, 751250, 751250, 0, 751250, 723250,
384 751250}},
385 {"57",
386 {729250, 421250, 735250, 427250, 759250, 759250, 759250, 759250, 0, 759250, 730250,
387 759250}},
388 {"58",
389 {735250, 427250, 741250, 433250, 767250, 767250, 767250, 767250, 0, 767250, 737250,
390 767250}},
391 {"59",
392 {741250, 433250, 747250, 439250, 775250, 775250, 775250, 775250, 0, 775250, 744250,
393 775250}},
394 {"60",
395 {747250, 439250, 753250, 445250, 783250, 783250, 783250, 783250, 0, 783250, 751250,
396 783250}},
397 {"61",
398 {753250, 445250, 759250, 451250, 791250, 791250, 791250, 791250, 0, 0, 758250,
399 791250}},
400 {"62",
401 {759250, 451250, 765250, 457250, 799250, 799250, 799250, 799250, 0, 799250, 765250,
402 799250}},
403 {"63",
404 {765250, 457250, 0, 463250, 807250, 807250, 807250, 807250, 0, 807250, 772250, 807250}},
405 {"64",
406 {771250, 463250, 0, 0, 815250, 815250, 815250, 815250, 0, 815250, 779250, 815250}},
407 {"65",
408 {777250, 469250, 0, 0, 823250, 823250, 823250, 823250, 0, 823250, 786250, 823250}},
409 {"66",
410 {783250, 475250, 0, 0, 831250, 831250, 831250, 831250, 0, 831250, 793250, 831250}},
411 {"67",
412 {789250, 481250, 0, 0, 839250, 839250, 839250, 839250, 0, 839250, 800250, 839250}},
413 {"68",
414 {795250, 487250, 0, 0, 847250, 847250, 847250, 847250, 0, 847250, 807250, 847250}},
415 {"69",
416 {801250, 493250, 0, 0, 855250, 855250, 855250, 855250, 0, 855250, 814250, 855250}},
417
418 {"70", {807250, 499250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
419 {"71", {813250, 505250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
420 {"72", {819250, 511250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
421 {"73", {825250, 517250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
422 {"74", {831250, 523250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
423 {"75", {837250, 529250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
424 {"76", {843250, 535250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
425 {"77", {849250, 541250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
426 {"78", {855250, 547250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
427 {"79", {861250, 553250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
428 {"80", {867250, 559250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
429 {"81", {873250, 565250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
430 {"82", {879250, 571250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
431 {"83", {885250, 577250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
432 {"84", {0, 583250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
433 {"85", {0, 589250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
434 {"86", {0, 595250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
435 {"87", {0, 601250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
436 {"88", {0, 607250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
437 {"89", {0, 613250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
438 {"90", {0, 619250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
439 {"91", {0, 625250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
440 {"92", {0, 631250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
441 {"93", {0, 637250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
442 {"94", {0, 643250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
443 {"95", {0, 91250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
444 {"96", {0, 97250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
445 {"97", {0, 103250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
446 {"98", {0, 109250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
447 {"99", {0, 115250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
448 {"100", {0, 649250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
449 {"101", {0, 655250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
450 {"102", {0, 661250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
451 {"103", {0, 667250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
452 {"104", {0, 673250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
453 {"105", {0, 679250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
454 {"106", {0, 685250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
455 {"107", {0, 691250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
456 {"108", {0, 697250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
457 {"109", {0, 703250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
458 {"110", {0, 709250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
459 {"111", {0, 715250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
460 {"112", {0, 721250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
461 {"113", {0, 727250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
462 {"114", {0, 733250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
463 {"115", {0, 739250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
464 {"116", {0, 745250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
465 {"117", {0, 751250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
466 {"118", {0, 757250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
467 {"119", {0, 763250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
468 {"120", {0, 769250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
469 {"121", {0, 775250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
470 {"122", {0, 781250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
471 {"123", {0, 787250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
472 {"124", {0, 793250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
473 {"125", {0, 799250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
474
475 {"T7", {0, 8250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
476 {"T8", {0, 14250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
477 {"T9", {0, 20250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
478 {"T10", {0, 26250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
479 {"T11", {0, 32250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
480 {"T12", {0, 38250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
481 {"T13", {0, 44250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
482 };
483
484
485
486
487
488
get_symchan_frequency(const char * name,const char * tvnorm)489 int get_symchan_frequency (const char * name, const char * tvnorm) {
490 unsigned int i;
491 int norm = 0;
492
493 if (tvnorm == NULL)
494 tvnorm = "pal-europe";
495
496 /* find index */
497 for (i = 0; i < sizeof(chan_names) / sizeof(*chan_names); i++) {
498 if (!strcmp(tvnorm,chan_names[i].str)) {
499 norm = chan_names[i].nr;
500 break;
501 }
502 }
503
504 /* find channel */
505 for (i = 0; i < sizeof(tvtuner) / sizeof(*tvtuner); i++) {
506 if (!strcmp(tvtuner[i].name, name)) {
507 return tvtuner[i].freq[norm];
508 }
509 }
510 return -1; /* not found */
511 }
512
513 struct channel {
514 char name[100];
515 char channel[100];
516 int fine;
517 };
518
519
520 struct channel * channels;
521 int channels_size= 0;
read_xawdecode_channels(void)522 void read_xawdecode_channels (void)
523 {
524 FILE *fp;
525
526 const char *xawfilename = ".xawdecode/xawdecoderc";
527 char line[100], tag[32], val[100];
528 char filename[1000];
529
530 channels_size= 50;
531 int act_channel = -1;
532 int nr = 0;
533
534 sprintf(filename,"%s/%s",getenv("HOME"), xawfilename);
535
536 fp = fopen (filename, "r");
537 if (NULL == fp) {
538 channels_size = 0;
539 fprintf (stderr, "Can't open config file %s:", filename);
540 return;
541 }
542 channels = (struct channel *) malloc(channels_size*sizeof(*channels));
543
544 while (NULL != fgets (line, 99, fp)) {
545 nr++;
546 if (strlen(line) < 2) continue; // ignore empty lines
547
548 line[99] = '\0';
549 if (1 == sscanf (line, "[%99[^]]]", val)) {
550 act_channel++;
551 if (act_channel >= channels_size) {
552 channels_size *=2;
553 channels = (struct channel *) realloc (channels, channels_size*sizeof(*channels));
554 }
555 strcpy(channels[act_channel].name , val);
556 channels[act_channel].channel[0] = '\0';
557 channels[act_channel].fine = 0;
558 continue;
559 }
560
561 if (act_channel < 0)
562 continue; /* didn't see any channel header yet! */
563
564 if (2 != sscanf (line, " %31[^= ] = %99[^\n]", tag, val))
565 {
566 fprintf (stderr, "%s:%d: parse error\n", filename, nr);
567 continue;
568 }
569
570 /* printf ("tag:%s val %s\n", tag, val);*/
571 if (!strncmp(tag, "channel", 7)) {
572 strcpy(channels[act_channel].channel, val);
573 } else if (!strncmp(tag, "fine", 4)) {
574 channels[act_channel].fine = atoi(val);
575 }
576 }
577
578 channels_size = act_channel+1;
579 fclose(fp);
580 }
581
print_channels()582 void print_channels () {
583 int i;
584 if (!channels)
585 read_xawdecode_channels();
586 for (i = 0; i < channels_size; i++) {
587 fprintf(stderr,"Channel #%d: %s | %s (%d)\n", i+1, channels[i].name, channels[i].channel, channels[i].fine);
588 }
589 }
590
591
get_chan_frequency(const char * nameornumber,char * optional_namebuf)592 double get_chan_frequency(const char *nameornumber, char *optional_namebuf)
593 {
594 int i;
595 long asnumber = 0;
596 char *endptr;
597
598 if (!channels)
599 read_xawdecode_channels();
600
601 /* if name is just a number, take channel number. */
602 asnumber = strtol(nameornumber, &endptr, 10);
603 if (*endptr == '\0' /* string was a valid number */
604 && asnumber > 0 && asnumber <= channels_size) {
605
606 if (optional_namebuf)
607 strncpy(optional_namebuf, channels[asnumber-1].name, 32);
608 return get_symchan_frequency(channels[asnumber-1].channel,NULL)/1000.0;
609 }
610
611
612 /* not a number, search channel name */
613 for (i = 0; i < channels_size; i++) {
614 if (!strncmp(nameornumber, channels[i].name,strlen(nameornumber))) {
615 if (optional_namebuf)
616 strncpy(optional_namebuf, nameornumber, 32);
617 return get_symchan_frequency(channels[i].channel,NULL)/1000.0;
618 }
619 }
620 if (optional_namebuf)
621 strcpy(optional_namebuf, "not found");
622 return 0.0;
623
624 }
625
626 #if BUILD_MAIN
main(int argc,char ** argv)627 int main(int argc, char ** argv)
628 {
629
630 char buf[33];
631
632 if (argc > 1) {
633 double f = get_chan_frequency(argv[1],buf);
634 printf("Frequency of %s(%s) is %f MHz\n", argv[1], buf, f);
635 } else
636 print_channels();
637
638 return 0;
639 }
640 #endif
641