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

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.  *  This program is free software; you can redistribute it and/or modify
  3.  *  it under the terms of the GNU General Public License as published by
  4.  *  the Free Software Foundation; either version 2 of the License, or
  5.  *  (at your option) any later version.
  6.  *
  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 Library General Public License for more details.
  11.  *
  12.  *  You should have received a copy of the GNU General Public License
  13.  *  along with this program; if not, write to the Free Software
  14.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15.  */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <unistd.h>
  19. #include <string.h>
  20. #include <math.h>
  21. #include <fcntl.h>
  22. #include <sys/ioctl.h>
  23. #include <assert.h>
  24. #include <linux/videodev.h>
  25. #include <sys/soundcard.h>
  26. #include "tech.h"
  27. static int freq_fact, fd = -1, mixer_fd = -1, mixer_src = -1;
  28. static char *devices[] = SOUND_DEVICE_NAMES;
  29. /*
  30.  * These functions handle the mixer device
  31.  */
  32.  
  33. int mixer_init(char *mixer_device, char *mixer_source)
  34. {
  35. int i;
  36. mixer_src = -1;
  37. for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
  38. if (strcmp(mixer_source, devices[i]) == 0) 
  39. mixer_src = i;
  40. mixer_fd = open(mixer_device, O_RDWR);
  41. if (mixer_src < 0)
  42. return -1;
  43. if (mixer_fd < 0)
  44. return 0;
  45. return 1;
  46. }
  47. char* mixer_get_sndcard_name(void)
  48. {
  49. mixer_info info;
  50. char *result = NULL;
  51. if (ioctl(mixer_fd, SOUND_MIXER_INFO, &info) == -1)
  52. return NULL;
  53. result = strdup(info.name);
  54. return result;
  55. }
  56. char** mixer_get_rec_devices(void)
  57. {
  58. int i, o, devmask, res;
  59. char** result;
  60. if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
  61. return NULL;
  62. else
  63. {
  64. result = malloc(sizeof(char*)*SOUND_MIXER_NRDEVICES);
  65. o = 0;
  66. for (i=0;i<SOUND_MIXER_NRDEVICES;i++)
  67. {
  68. res = (devmask >> i)%2;
  69. if (res)
  70. {
  71. result[o] = malloc(strlen(devices[i])+1);
  72. sprintf(result[o], "%s", devices[i]); 
  73. o++;
  74. }
  75. result[o] = NULL;
  76. }
  77. }
  78. return result;
  79. }
  80. int mixer_set_rec_device(void)
  81. {
  82. int devmask, recmask;
  83. if (mixer_fd <= 0)
  84. return 0;
  85. if (mixer_src < 0)
  86. return 0;
  87. if ((ioctl(mixer_fd, SOUND_MIXER_READ_RECMASK, &devmask)) == -1)
  88. return 0;
  89. recmask = 1 << mixer_src;
  90. if (!(recmask & devmask))
  91. return 0;
  92. if ((ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC, &recmask)) == -1)
  93. return 0;
  94. return 1;
  95. }
  96. int mixer_close(void)
  97. {
  98. if (mixer_fd > 0)
  99. close(mixer_fd);
  100. return 1;
  101. }
  102. int mixer_set_volume(int volume)
  103. {
  104. int i_vol;
  105. if (mixer_fd<0)
  106. return -1;
  107. assert(volume <= 100);
  108. assert(volume >= 0);
  109. if (mixer_src<0) 
  110. return -1;
  111. i_vol = volume;  
  112. i_vol += volume << 8;
  113. /*printf("Setting %s to vol %in", devices[mixer_src], volume);*/
  114. if ((ioctl(mixer_fd, MIXER_WRITE(mixer_src), &i_vol)) < 0)
  115. return 0;
  116. return 1;
  117. }
  118. int mixer_get_volume(void)
  119. {
  120. int i_vol = 0, r, l, volume;
  121. if (mixer_fd<0)
  122. return -1;
  123. if (mixer_src<0) 
  124. return -1;
  125. if ((ioctl(mixer_fd, MIXER_READ(mixer_src), &i_vol)) < 0)
  126. return 0;
  127. r = i_vol >> 8;
  128. l = i_vol % (1 << 8);
  129. volume = (r + l)/2;
  130. /*printf("%d %d %d %dn", r, l, volume, i_vol);*/
  131. assert((volume >= 0) && (volume <= 100));
  132. return volume;
  133. }
  134. /*
  135.  * These functions handle the radio device
  136.  */
  137.  
  138. int radio_init(char *device)
  139. {
  140. struct video_tuner tuner;
  141. if ((fd = open(device, O_RDONLY))< 0)
  142. return 0;
  143. tuner.tuner = 0;
  144. if (ioctl (fd, VIDIOCGTUNER, &tuner) < 0)
  145. freq_fact = 16;
  146. else
  147. {
  148. if ((tuner.flags & VIDEO_TUNER_LOW) == 0)
  149. freq_fact = 16;
  150. else 
  151. freq_fact = 16000;
  152. }
  153. radio_unmute();
  154. return 1;
  155. }
  156. int radio_is_init(void)
  157. {
  158. return (fd >= 0);
  159. }
  160. void radio_stop(void)
  161. {
  162. radio_mute();
  163. if (fd >= 0)
  164. close(fd);
  165. }
  166. int radio_setfreq(float freq)
  167. {
  168.     int ifreq = (freq+1.0/32)*freq_fact;
  169.     if (fd<0)
  170.      return 0;
  171.     
  172. #if 0
  173. printf("Setting to %i (= %.2f)n", ifreq, freq);
  174. #endif
  175. if ((freq > 108) || (freq < 65))
  176. return 1;
  177. assert ((freq <= 108) && (freq > 65));
  178.     return ioctl(fd, VIDIOCSFREQ, &ifreq);
  179. }
  180. int radio_check_station(float freq)
  181. {
  182. static int a, b;
  183. static float last;
  184. int signal;
  185. signal = radio_getsignal();
  186. if (last == 0.0f)
  187. last = freq;
  188. if ((a + b + signal > 8) && (fabsf(freq - last) > 0.25f)) {
  189. a = b = 0;
  190. last = freq;
  191. return 1;
  192. }
  193. a = b;
  194. b = signal;
  195. return 0;
  196. }
  197. void radio_unmute(void)
  198. {
  199.     struct video_audio vid_aud;
  200.     if (fd<0)
  201.      return;
  202.     if (ioctl(fd, VIDIOCGAUDIO, &vid_aud))
  203. perror("VIDIOCGAUDIO");
  204.     /*if (vid_aud.volume == 0)*/
  205. vid_aud.volume = 0xFFFF;
  206.     vid_aud.flags &= ~VIDEO_AUDIO_MUTE;
  207. vid_aud.mode = VIDEO_SOUND_STEREO;
  208.     if (ioctl(fd, VIDIOCSAUDIO, &vid_aud))
  209. perror("VIDIOCSAUDIO");
  210. }
  211. void radio_mute(void)
  212. {
  213.     struct video_audio vid_aud;
  214.     if (fd<0)
  215.      return;
  216.     if (ioctl(fd, VIDIOCGAUDIO, &vid_aud))
  217. perror("VIDIOCGAUDIO");
  218.     vid_aud.flags |= VIDEO_AUDIO_MUTE;
  219.     if (ioctl(fd, VIDIOCSAUDIO, &vid_aud))
  220. perror("VIDIOCSAUDIO");
  221. }
  222. int radio_getstereo()
  223. {
  224.     struct video_audio va;
  225.     va.mode=-1;
  226.     if (fd<0)
  227.      return -1;
  228.     
  229.     if (ioctl (fd, VIDIOCGAUDIO, &va) < 0)
  230. return -1;
  231. if (va.mode == VIDEO_SOUND_STEREO)
  232. return 1;
  233. else 
  234. return 0;
  235. }
  236. int radio_getsignal()
  237. {
  238.     struct video_tuner vt;
  239.     int signal;
  240.     if (fd<0)
  241.      return -1;
  242.     memset(&vt,0,sizeof(vt));
  243.     ioctl (fd, VIDIOCGTUNER, &vt);
  244.     signal=vt.signal>>13;
  245.     return signal;
  246. }