fm.c
上传用户:ledjyj
上传日期:2014-08-27
资源大小:2639k
文件大小:5k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /* fm.c - simple v4l compatible tuner for radio cards
  2.    Copyright (C) 1998  Russell Kroll <rkroll@exploits.org>
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    This program is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.    GNU General Public License for more details.
  11.    You should have received a copy of the GNU General Public License
  12.    along with this program; if not, write to the Free Software
  13.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  */
  15. #include <math.h>
  16. #include <stdio.h>
  17. #include <fcntl.h>
  18. #include <stdlib.h>
  19. #include <unistd.h>
  20. #include <getopt.h>
  21. #include <string.h>
  22. #include <asm/types.h>
  23. #include <sys/ioctl.h>
  24. #include <linux/videodev.h>
  25. void help(char *prog)
  26. {
  27. printf ("usage: %s [-h] [-o] [-q] [-t <tuner>] <freq>|on|off [<volume>]n", prog); 
  28. printf ("n");
  29. printf ("-h         - display this helpn");
  30. printf ("-o         - override frequency range limits in cardn");
  31. printf ("-q         - quiet moden");
  32. printf ("-t <tuner> - select tuner <tuner>n");
  33. printf ("<tuner>    - tuner number - first one is 0, next one 1, etcn");
  34. printf ("<freq>     - frequency in MHz (i.e. 94.3)n");
  35. printf ("on         - turn radio onn");
  36. printf ("off        - turn radio off (mute)n");
  37. printf ("+          - increase volumen");
  38. printf ("-          - decrease volumen");
  39. printf ("<volume>   - intensity (0-65535)n");
  40. exit (1);
  41. }
  42. void getconfig(int *defaultvol, int *increment)
  43. {
  44. FILE *conf;
  45. char buf[256], fn[256];
  46. sprintf (fn, "%s/.fmrc", getenv("HOME"));
  47. conf = fopen (fn, "r");
  48. if (!conf)
  49. return;
  50. while (fgets(buf, sizeof(buf), conf)) {
  51. buf[strlen(buf)-1] = 0;
  52. if (strncmp (buf, "VOL", 3) == 0)
  53. sscanf (buf, "%*s %i", defaultvol);
  54. if (strncmp (buf, "INCR", 3) == 0)
  55. sscanf (buf, "%*s %i", increment);
  56. }
  57. fclose (conf);
  58. return;
  59. }
  60. int main(int argc, char **argv)
  61. {
  62. int fd, ret, tunevol, quiet=0, i, override = 0;
  63. int defaultvol = 8192; /* default volume = 12.5% */
  64. int increment = 6554; /* default change = 10% */
  65. double fact;
  66. unsigned long freq;
  67. struct  video_audio va;
  68. struct video_tuner vt;
  69. char *progname;
  70. extern char *optarg;
  71. extern int optind, opterr, optopt;
  72. int tuner = 0;
  73. if ((argc < 2) || (argc > 4)) {
  74. printf ("usage: %s [-h] [-o] [-q] [-t <tuner>] <freq>|on|off [<volume>]n", argv[0]); 
  75. exit (1);
  76. }
  77. progname = argv[0]; /* used after getopt munges argv[] */
  78. getconfig(&defaultvol, &increment);
  79. while ((i = getopt(argc, argv, "+qhot:")) != EOF) {
  80. switch (i) {
  81. case 'q':
  82. quiet = 1;
  83. break;
  84. case 'o':
  85. override = 1;
  86. break;
  87. case 't':
  88. tuner = atoi(optarg);
  89. break;
  90. case 'h':
  91. default:
  92. help(argv[0]);
  93. break;
  94. }
  95. }
  96. argc -= optind;
  97. argv += optind;
  98. if (argc == 2)
  99. tunevol = atoi (argv[1]);
  100. else
  101. tunevol = defaultvol;
  102. if (argc == 0) /* no frequency, on|off, or +|- given */
  103. help (progname);
  104. /* moved here so -h works without a device */
  105. fd = open ("/dev/radio0", O_RDONLY); 
  106. if (fd == -1) {
  107. perror ("Unable to open /dev/radio0");
  108. exit (1);
  109. }
  110. if (!strcmp("off", argv[0])) { /* mute the radio */
  111. va.audio = 0;
  112. va.volume = 0;
  113. va.flags = VIDEO_AUDIO_MUTE;
  114. ret = ioctl (fd, VIDIOCSAUDIO, &va);
  115. if (!quiet)
  116. printf ("Radio mutedn");
  117. exit (0);
  118. }
  119. if (!strcmp("on", argv[0])) { /* turn radio on */
  120. va.audio = 0;
  121. va.volume = tunevol;
  122. va.flags = 0;
  123. ret = ioctl (fd, VIDIOCSAUDIO, &va);
  124. if (!quiet)
  125. printf ("Radio on at %2.2f%% volumen", 
  126. (tunevol / 655.36));
  127. exit (0);
  128. }
  129. ret = ioctl (fd, VIDIOCGAUDIO, &va);
  130. if (argv[0][0] == '+') { /* volume up */
  131. if ((va.volume + increment) > 65535)
  132. va.volume = 65535; /* catch overflows in __u16 */
  133. else
  134. va.volume += increment;
  135. if (!quiet)
  136. printf ("Setting volume to %2.2f%%n", 
  137. (va.volume / 655.35));
  138. ret = ioctl (fd, VIDIOCSAUDIO, &va);
  139. exit (0);
  140. }
  141. if (argv[0][0] == '-') { /* volume down */
  142. if ((va.volume - increment) < 0) 
  143. va.volume = 0; /* catch negative numbers */
  144. else
  145. va.volume -= increment;
  146. if (!quiet)
  147. printf ("Setting volume to %2.2f%%n", 
  148. (va.volume / 655.35));
  149. ret = ioctl (fd, VIDIOCSAUDIO, &va);
  150. exit (0);
  151. }
  152. /* at this point, we are trying to tune to a frequency */
  153. vt.tuner = tuner;
  154. ret = ioctl(fd, VIDIOCSTUNER, &vt); /* set tuner # */
  155. if (ret < 0) {
  156. perror ("set tuner");
  157. exit (1);
  158. }
  159. ret = ioctl(fd, VIDIOCGTUNER, &vt); /* get frequency range */
  160. if (ret == -1 || (vt.flags & VIDEO_TUNER_LOW) == 0)
  161.   fact = 16.;
  162. else
  163.   fact = 16000.;
  164. freq = ceil(atof(argv[0]) * fact); /* rounding up matters */
  165. if ((freq < vt.rangelow) || (freq > vt.rangehigh)) {
  166. if (override == 0) {
  167. printf ("Frequency %2.1f out of range (%2.1f - %2.1f MHz)n",
  168.         (freq / fact), (vt.rangelow / fact), 
  169. (vt.rangehigh / fact));
  170. exit (1);
  171. }
  172. }
  173. /* frequency sanity checked, proceed */
  174. ret = ioctl (fd, VIDIOCSFREQ, &freq);
  175. if (ret < 0) {
  176. perror ("set freq");
  177. exit (1);
  178. }
  179. va.audio = 0;
  180. va.volume = tunevol;
  181. va.flags = 0;
  182. va.mode = VIDEO_SOUND_STEREO;
  183. ret = ioctl (fd, VIDIOCSAUDIO, &va); /* set the volume */
  184. if (!quiet) 
  185. printf ("Radio tuned to %2.1f MHz at %2.2f%% volumen", 
  186. (freq / fact), (tunevol / 655.35));
  187. return (0);
  188. }