dvbcfg_scanfile.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * dvbcfg - support for linuxtv configuration files
  3. * scan channel file support
  4. *
  5. * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
  6. * Copyright (C) 2005 Andrew de Quincey <adq_dvb@lidskialf.net>
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with this library; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  21. */
  22. #define _GNU_SOURCE
  23. #include <malloc.h>
  24. #include <ctype.h>
  25. #include "dvbcfg_scanfile.h"
  26. #include "dvbcfg_common.h"
  27. static const struct dvbcfg_setting dvbcfg_fec_list[] = {
  28. { "1/2", DVBFE_FEC_1_2 },
  29. { "2/3", DVBFE_FEC_2_3 },
  30. { "3/4", DVBFE_FEC_3_4 },
  31. { "4/5", DVBFE_FEC_4_5 },
  32. { "5/6", DVBFE_FEC_5_6 },
  33. { "6/7", DVBFE_FEC_6_7 },
  34. { "7/8", DVBFE_FEC_7_8 },
  35. { "8/9", DVBFE_FEC_8_9 },
  36. { "AUTO", DVBFE_FEC_AUTO },
  37. { "NONE", DVBFE_FEC_NONE },
  38. { NULL, 0 }
  39. };
  40. static const struct dvbcfg_setting dvbcfg_dvbc_modulation_list[] = {
  41. { "QAM16", DVBFE_DVBC_MOD_QAM_16 },
  42. { "QAM32", DVBFE_DVBC_MOD_QAM_32 },
  43. { "QAM64", DVBFE_DVBC_MOD_QAM_64 },
  44. { "QAM128", DVBFE_DVBC_MOD_QAM_128 },
  45. { "QAM256", DVBFE_DVBC_MOD_QAM_256 },
  46. { "AUTO", DVBFE_DVBC_MOD_AUTO },
  47. { NULL, 0 }
  48. };
  49. static const struct dvbcfg_setting dvbcfg_bandwidth_list[] = {
  50. { "6MHz", DVBFE_DVBT_BANDWIDTH_6_MHZ },
  51. { "7MHz", DVBFE_DVBT_BANDWIDTH_7_MHZ },
  52. { "8MHz", DVBFE_DVBT_BANDWIDTH_8_MHZ },
  53. { "AUTO", DVBFE_DVBT_BANDWIDTH_AUTO },
  54. { NULL, 0 }
  55. };
  56. static const struct dvbcfg_setting dvbcfg_constellation_list[] = {
  57. { "QAM16", DVBFE_DVBT_CONST_QAM_16 },
  58. { "QAM32", DVBFE_DVBT_CONST_QAM_32 },
  59. { "QAM64", DVBFE_DVBT_CONST_QAM_64 },
  60. { "QAM128", DVBFE_DVBT_CONST_QAM_128 },
  61. { "QAM256", DVBFE_DVBT_CONST_QAM_256 },
  62. { "QPSK", DVBFE_DVBT_CONST_QPSK },
  63. { "AUTO", DVBFE_DVBT_CONST_AUTO },
  64. { NULL, 0 }
  65. };
  66. static const struct dvbcfg_setting dvbcfg_transmission_mode_list[] = {
  67. { "2k", DVBFE_DVBT_TRANSMISSION_MODE_2K },
  68. { "8k", DVBFE_DVBT_TRANSMISSION_MODE_8K },
  69. { "AUTO", DVBFE_DVBT_TRANSMISSION_MODE_AUTO },
  70. { NULL, 0 }
  71. };
  72. static const struct dvbcfg_setting dvbcfg_guard_interval_list[] = {
  73. { "1/32", DVBFE_DVBT_GUARD_INTERVAL_1_32 },
  74. { "1/16", DVBFE_DVBT_GUARD_INTERVAL_1_16 },
  75. { "1/8", DVBFE_DVBT_GUARD_INTERVAL_1_8 },
  76. { "1/4", DVBFE_DVBT_GUARD_INTERVAL_1_4 },
  77. { "AUTO", DVBFE_DVBT_GUARD_INTERVAL_AUTO },
  78. { NULL, 0 }
  79. };
  80. static const struct dvbcfg_setting dvbcfg_hierarchy_list[] = {
  81. { "1", DVBFE_DVBT_HIERARCHY_1 },
  82. { "2", DVBFE_DVBT_HIERARCHY_2 },
  83. { "4", DVBFE_DVBT_HIERARCHY_4 },
  84. { "AUTO", DVBFE_DVBT_HIERARCHY_AUTO },
  85. { "NONE", DVBFE_DVBT_HIERARCHY_NONE },
  86. { NULL, 0 }
  87. };
  88. static const struct dvbcfg_setting dvbcfg_atsc_modulation_list[] = {
  89. { "8VSB", DVBFE_ATSC_MOD_VSB_8 },
  90. { "16VSB", DVBFE_ATSC_MOD_VSB_16 },
  91. { "QAM64", DVBFE_ATSC_MOD_QAM_64 },
  92. { "QAM256", DVBFE_ATSC_MOD_QAM_256 },
  93. { NULL, 0 }
  94. };
  95. int dvbcfg_scanfile_parse(FILE *file, dvbcfg_scancallback callback, void *private_data)
  96. {
  97. char *line_buf = NULL;
  98. size_t line_size = 0;
  99. int line_len = 0;
  100. int ret_val = 0;
  101. while ((line_len = getline(&line_buf, &line_size, file)) > 0) {
  102. char *line_tmp = line_buf;
  103. char *line_pos = line_buf;
  104. struct dvbcfg_scanfile tmp;
  105. /* remove newline and comments (started with hashes) */
  106. while ((*line_tmp != '\0') && (*line_tmp != '\n') && (*line_tmp != '#'))
  107. line_tmp++;
  108. *line_tmp = '\0';
  109. /* always use inversion auto */
  110. tmp.fe_params.inversion = DVBFE_INVERSION_AUTO;
  111. /* parse frontend type */
  112. switch(dvbcfg_parse_char(&line_pos, " ")) {
  113. case 'T':
  114. tmp.fe_type = DVBFE_TYPE_DVBT;
  115. break;
  116. case 'C':
  117. tmp.fe_type = DVBFE_TYPE_DVBC;
  118. break;
  119. case 'S':
  120. tmp.fe_type = DVBFE_TYPE_DVBS;
  121. break;
  122. case 'A':
  123. tmp.fe_type = DVBFE_TYPE_ATSC;
  124. break;
  125. default:
  126. continue;
  127. }
  128. /* parse frontend specific settings */
  129. switch (tmp.fe_type) {
  130. case DVBFE_TYPE_ATSC:
  131. /* parse frequency */
  132. tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
  133. if (!line_pos)
  134. continue;
  135. /* modulation */
  136. tmp.fe_params.u.atsc.modulation =
  137. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_atsc_modulation_list);
  138. if (!line_pos)
  139. continue;
  140. break;
  141. case DVBFE_TYPE_DVBC:
  142. /* parse frequency */
  143. tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
  144. if (!line_pos)
  145. continue;
  146. /* symbol rate */
  147. tmp.fe_params.u.dvbc.symbol_rate = dvbcfg_parse_int(&line_pos, " ");
  148. if (!line_pos)
  149. continue;
  150. /* fec */
  151. tmp.fe_params.u.dvbc.fec_inner =
  152. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
  153. if (!line_pos)
  154. continue;
  155. /* modulation */
  156. tmp.fe_params.u.dvbc.modulation =
  157. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_dvbc_modulation_list);
  158. if (!line_pos)
  159. continue;
  160. break;
  161. case DVBFE_TYPE_DVBS:
  162. /* parse frequency */
  163. tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
  164. if (!line_pos)
  165. continue;
  166. /* polarization */
  167. tmp.polarization = tolower(dvbcfg_parse_char(&line_pos, " "));
  168. if (!line_pos)
  169. continue;
  170. if ((tmp.polarization != 'h') &&
  171. (tmp.polarization != 'v') &&
  172. (tmp.polarization != 'l') &&
  173. (tmp.polarization != 'r'))
  174. continue;
  175. /* symbol rate */
  176. tmp.fe_params.u.dvbs.symbol_rate = dvbcfg_parse_int(&line_pos, " ");
  177. if (!line_pos)
  178. continue;
  179. /* fec */
  180. tmp.fe_params.u.dvbc.fec_inner =
  181. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
  182. if (!line_pos)
  183. continue;
  184. break;
  185. case DVBFE_TYPE_DVBT:
  186. /* parse frequency */
  187. tmp.fe_params.frequency = dvbcfg_parse_int(&line_pos, " ");
  188. if (!line_pos)
  189. continue;
  190. /* bandwidth */
  191. tmp.fe_params.u.dvbt.bandwidth =
  192. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_bandwidth_list);
  193. if (!line_pos)
  194. continue;
  195. /* fec hp */
  196. tmp.fe_params.u.dvbt.code_rate_HP =
  197. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
  198. if (!line_pos)
  199. continue;
  200. /* fec lp */
  201. tmp.fe_params.u.dvbt.code_rate_LP =
  202. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_fec_list);
  203. if (!line_pos)
  204. continue;
  205. /* constellation */
  206. tmp.fe_params.u.dvbt.constellation =
  207. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_constellation_list);
  208. if (!line_pos)
  209. continue;
  210. /* transmission mode */
  211. tmp.fe_params.u.dvbt.transmission_mode =
  212. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_transmission_mode_list);
  213. if (!line_pos)
  214. continue;
  215. /* guard interval */
  216. tmp.fe_params.u.dvbt.guard_interval =
  217. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_guard_interval_list);
  218. if (!line_pos)
  219. continue;
  220. /* hierarchy */
  221. tmp.fe_params.u.dvbt.hierarchy_information =
  222. dvbcfg_parse_setting(&line_pos, " ", dvbcfg_hierarchy_list);
  223. if (!line_pos)
  224. continue;
  225. break;
  226. }
  227. /* invoke callback */
  228. if ((ret_val = callback(&tmp, private_data)) != 0) {
  229. if (ret_val < 0)
  230. ret_val = 0;
  231. break;
  232. }
  233. }
  234. if (line_buf)
  235. free(line_buf);
  236. return ret_val;
  237. }