dev_table.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * sound/dev_table.c
  3.  *
  4.  * Device call tables.
  5.  *
  6.  *
  7.  * Copyright (C) by Hannu Savolainen 1993-1997
  8.  *
  9.  * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10.  * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11.  * for more info.
  12.  */
  13. #include <linux/init.h>
  14. #define _DEV_TABLE_C_
  15. #include "sound_config.h"
  16. int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver,
  17. int driver_size, int flags, unsigned int format_mask,
  18. void *devc, int dma1, int dma2)
  19. {
  20. struct audio_driver *d;
  21. struct audio_operations *op;
  22. int l, num;
  23. if (vers != AUDIO_DRIVER_VERSION || driver_size > sizeof(struct audio_driver)) {
  24. printk(KERN_ERR "Sound: Incompatible audio driver for %sn", name);
  25. return -(EINVAL);
  26. }
  27. num = sound_alloc_audiodev();
  28. if (num == -1) {
  29. printk(KERN_ERR "sound: Too many audio driversn");
  30. return -(EBUSY);
  31. }
  32. d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver)));
  33. if (sound_nblocks < 1024)
  34. sound_nblocks++;
  35. op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations)));
  36. if (sound_nblocks < 1024)
  37. sound_nblocks++;
  38. if (d == NULL || op == NULL) {
  39. printk(KERN_ERR "Sound: Can't allocate driver for (%s)n", name);
  40. sound_unload_audiodev(num);
  41. return -(ENOMEM);
  42. }
  43. memset((char *) op, 0, sizeof(struct audio_operations));
  44. init_waitqueue_head(&op->in_sleeper);
  45. init_waitqueue_head(&op->out_sleeper);
  46. init_waitqueue_head(&op->poll_sleeper);
  47. if (driver_size < sizeof(struct audio_driver))
  48. memset((char *) d, 0, sizeof(struct audio_driver));
  49. memcpy((char *) d, (char *) driver, driver_size);
  50. op->d = d;
  51. l = strlen(name) + 1;
  52. if (l > sizeof(op->name))
  53. l = sizeof(op->name);
  54. strncpy(op->name, name, l);
  55. op->name[l - 1] = 0;
  56. op->flags = flags;
  57. op->format_mask = format_mask;
  58. op->devc = devc;
  59. /*
  60.  *    Hardcoded defaults
  61.  */
  62. audio_devs[num] = op;
  63. DMAbuf_init(num, dma1, dma2);
  64. audio_init_devices();
  65. return num;
  66. }
  67. int sound_install_mixer(int vers, char *name, struct mixer_operations *driver,
  68. int driver_size, void *devc)
  69. {
  70. struct mixer_operations *op;
  71. int l;
  72. int n = sound_alloc_mixerdev();
  73. if (n == -1) {
  74. printk(KERN_ERR "Sound: Too many mixer driversn");
  75. return -EBUSY;
  76. }
  77. if (vers != MIXER_DRIVER_VERSION ||
  78. driver_size > sizeof(struct mixer_operations)) {
  79. printk(KERN_ERR "Sound: Incompatible mixer driver for %sn", name);
  80. return -EINVAL;
  81. }
  82. /* FIXME: This leaks a mixer_operations struct every time its called
  83.    until you unload sound! */
  84.    
  85. op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations)));
  86. if (sound_nblocks < 1024)
  87. sound_nblocks++;
  88. if (op == NULL) {
  89. printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)n", name);
  90. return -ENOMEM;
  91. }
  92. memset((char *) op, 0, sizeof(struct mixer_operations));
  93. memcpy((char *) op, (char *) driver, driver_size);
  94. l = strlen(name) + 1;
  95. if (l > sizeof(op->name))
  96. l = sizeof(op->name);
  97. strncpy(op->name, name, l);
  98. op->name[l - 1] = 0;
  99. op->devc = devc;
  100. mixer_devs[n] = op;
  101. return n;
  102. }
  103. void sound_unload_audiodev(int dev)
  104. {
  105. if (dev != -1) {
  106. DMAbuf_deinit(dev);
  107. audio_devs[dev] = NULL;
  108. unregister_sound_dsp((dev<<4)+3);
  109. }
  110. }
  111. int sound_alloc_audiodev(void)
  112. int i = register_sound_dsp(&oss_sound_fops, -1);
  113. if(i==-1)
  114. return i;
  115. i>>=4;
  116. if(i>=num_audiodevs)
  117. num_audiodevs = i + 1;
  118. return i;
  119. }
  120. int sound_alloc_mididev(void)
  121. {
  122. int i = register_sound_midi(&oss_sound_fops, -1);
  123. if(i==-1)
  124. return i;
  125. i>>=4;
  126. if(i>=num_midis)
  127. num_midis = i + 1;
  128. return i;
  129. }
  130. int sound_alloc_synthdev(void)
  131. {
  132. int i;
  133. for (i = 0; i < MAX_SYNTH_DEV; i++) {
  134. if (synth_devs[i] == NULL) {
  135. if (i >= num_synths)
  136. num_synths++;
  137. return i;
  138. }
  139. }
  140. return -1;
  141. }
  142. int sound_alloc_mixerdev(void)
  143. {
  144. int i = register_sound_mixer(&oss_sound_fops, -1);
  145. if(i==-1)
  146. return -1;
  147. i>>=4;
  148. if(i>=num_mixers)
  149. num_mixers = i + 1;
  150. return i;
  151. }
  152. int sound_alloc_timerdev(void)
  153. {
  154. int i;
  155. for (i = 0; i < MAX_TIMER_DEV; i++) {
  156. if (sound_timer_devs[i] == NULL) {
  157. if (i >= num_sound_timers)
  158. num_sound_timers++;
  159. return i;
  160. }
  161. }
  162. return -1;
  163. }
  164. void sound_unload_mixerdev(int dev)
  165. {
  166. if (dev != -1) {
  167. mixer_devs[dev] = NULL;
  168. unregister_sound_mixer(dev<<4);
  169. num_mixers--;
  170. }
  171. }
  172. void sound_unload_mididev(int dev)
  173. {
  174. if (dev != -1) {
  175. midi_devs[dev] = NULL;
  176. unregister_sound_midi((dev<<4)+2);
  177. }
  178. }
  179. void sound_unload_synthdev(int dev)
  180. {
  181. if (dev != -1)
  182. synth_devs[dev] = NULL;
  183. }
  184. void sound_unload_timerdev(int dev)
  185. {
  186. if (dev != -1)
  187. sound_timer_devs[dev] = NULL;
  188. }