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