dmasound.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _dmasound_h_
  2. /*
  3.  *  linux/drivers/sound/dmasound/dmasound.h
  4.  *
  5.  *
  6.  *  Minor numbers for the sound driver.
  7.  *
  8.  *  Unfortunately Creative called the codec chip of SB as a DSP. For this
  9.  *  reason the /dev/dsp is reserved for digitized audio use. There is a
  10.  *  device for true DSP processors but it will be called something else.
  11.  *  In v3.0 it's /dev/sndproc but this could be a temporary solution.
  12.  */
  13. #define _dmasound_h_
  14. #include <linux/types.h>
  15. #include <linux/config.h>
  16. #define SND_NDEVS 256 /* Number of supported devices */
  17. #define SND_DEV_CTL 0 /* Control port /dev/mixer */
  18. #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM
  19.    synthesizer and MIDI output) */
  20. #define SND_DEV_MIDIN 2 /* Raw midi access */
  21. #define SND_DEV_DSP 3 /* Digitized voice /dev/dsp */
  22. #define SND_DEV_AUDIO 4 /* Sparc compatible /dev/audio */
  23. #define SND_DEV_DSP16 5 /* Like /dev/dsp but 16 bits/sample */
  24. #define SND_DEV_STATUS 6 /* /dev/sndstat */
  25. /* #7 not in use now. Was in 2.4. Free for use after v3.0. */
  26. #define SND_DEV_SEQ2 8 /* /dev/sequencer, level 2 interface */
  27. #define SND_DEV_SNDPROC 9 /* /dev/sndproc for programmable devices */
  28. #define SND_DEV_PSS SND_DEV_SNDPROC
  29. /* switch on various prinks */
  30. #define DEBUG_DMASOUND 1
  31. #define MAX_AUDIO_DEV 5
  32. #define MAX_MIXER_DEV 4
  33. #define MAX_SYNTH_DEV 3
  34. #define MAX_MIDI_DEV 6
  35. #define MAX_TIMER_DEV 3
  36. #define MAX_CATCH_RADIUS 10
  37. #define le2be16(x) (((x)<<8 & 0xff00) | ((x)>>8 & 0x00ff))
  38. #define le2be16dbl(x) (((x)<<8 & 0xff00ff00) | ((x)>>8 & 0x00ff00ff))
  39. #define IOCTL_IN(arg, ret) 
  40. do { int error = get_user(ret, (int *)(arg)); 
  41. if (error) return error; 
  42. } while (0)
  43. #define IOCTL_OUT(arg, ret) ioctl_return((int *)(arg), ret)
  44. static inline int ioctl_return(int *addr, int value)
  45. {
  46. return value < 0 ? value : put_user(value, addr);
  47. }
  48.     /*
  49.      *  Configuration
  50.      */
  51. #undef HAS_8BIT_TABLES
  52. #undef HAS_RECORD
  53. #if defined(CONFIG_DMASOUND_ATARI) || defined(CONFIG_DMASOUND_ATARI_MODULE) ||
  54.     defined(CONFIG_DMASOUND_PAULA) || defined(CONFIG_DMASOUND_PAULA_MODULE) ||
  55.     defined(CONFIG_DMASOUND_Q40) || defined(CONFIG_DMASOUND_Q40_MODULE)
  56. #define HAS_8BIT_TABLES
  57. #define MIN_BUFFERS 4
  58. #define MIN_BUFSIZE (1<<12) /* in bytes (- where does this come from ?) */
  59. #define MIN_FRAG_SIZE 8 /* not 100% sure about this */
  60. #define MAX_BUFSIZE (1<<17) /* Limit for Amiga is 128 kb */
  61. #define MAX_FRAG_SIZE 15 /* allow *4 for mono-8 => stereo-16 (for multi) */
  62. #else /* is pmac and multi is off */
  63. #define MIN_BUFFERS 2
  64. #define MIN_BUFSIZE (1<<8) /* in bytes */
  65. #define MIN_FRAG_SIZE 8
  66. #define MAX_BUFSIZE (1<<18) /* this is somewhat arbitrary for pmac */
  67. #define MAX_FRAG_SIZE 16 /* need to allow *4 for mono-8 => stereo-16 */
  68. #endif
  69. #define DEFAULT_N_BUFFERS 4
  70. #define DEFAULT_BUFF_SIZE (1<<15)
  71. #if defined(CONFIG_DMASOUND_PMAC) || defined(CONFIG_DMASOUND_PMAC_MODULE)
  72. #define HAS_RECORD
  73. #endif
  74.     /*
  75.      *  Initialization
  76.      */
  77. extern int dmasound_init(void);
  78. #ifdef MODULE
  79. extern void dmasound_deinit(void);
  80. #else
  81. #define dmasound_deinit() do { } while (0)
  82. #endif
  83. /* description of the set-up applies to either hard or soft settings */
  84. typedef struct {
  85.     int format; /* AFMT_* */
  86.     int stereo; /* 0 = mono, 1 = stereo */
  87.     int size; /* 8/16 bit*/
  88.     int speed; /* speed */
  89. } SETTINGS;
  90.     /*
  91.      *  Machine definitions
  92.      */
  93. typedef struct {
  94.     const char *name;
  95.     const char *name2;
  96.     void (*open)(void);
  97.     void (*release)(void);
  98.     void *(*dma_alloc)(unsigned int, int);
  99.     void (*dma_free)(void *, unsigned int);
  100.     int (*irqinit)(void);
  101. #ifdef MODULE
  102.     void (*irqcleanup)(void);
  103. #endif
  104.     void (*init)(void);
  105.     void (*silence)(void);
  106.     int (*setFormat)(int);
  107.     int (*setVolume)(int);
  108.     int (*setBass)(int);
  109.     int (*setTreble)(int);
  110.     int (*setGain)(int);
  111.     void (*play)(void);
  112.     void (*record)(void); /* optional */
  113.     void (*mixer_init)(void); /* optional */
  114.     int (*mixer_ioctl)(u_int, u_long); /* optional */
  115.     int (*write_sq_setup)(void); /* optional */
  116.     int (*read_sq_setup)(void); /* optional */
  117.     int (*sq_open)(mode_t); /* optional */
  118.     int (*state_info)(char *, size_t); /* optional */
  119.     void (*abort_read)(void); /* optional */
  120.     int min_dsp_speed;
  121.     int max_dsp_speed;
  122.     int version ;
  123.     int hardware_afmts ; /* OSS says we only return h'ware info */
  124. /* when queried via SNDCTL_DSP_GETFMTS */
  125.     int capabilities ; /* low-level reply to SNDCTL_DSP_GETCAPS */
  126.     SETTINGS default_hard ; /* open() or init() should set something valid */
  127.     SETTINGS default_soft ; /* you can make it look like old OSS, if you want to */
  128. } MACHINE;
  129.     /*
  130.      *  Low level stuff
  131.      */
  132. typedef struct {
  133.     ssize_t (*ct_ulaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  134.     ssize_t (*ct_alaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  135.     ssize_t (*ct_s8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  136.     ssize_t (*ct_u8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  137.     ssize_t (*ct_s16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  138.     ssize_t (*ct_u16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  139.     ssize_t (*ct_s16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  140.     ssize_t (*ct_u16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
  141. } TRANS;
  142. struct sound_settings {
  143.     MACHINE mach; /* machine dependent things */
  144.     SETTINGS hard; /* hardware settings */
  145.     SETTINGS soft; /* software settings */
  146.     SETTINGS dsp; /* /dev/dsp default settings */
  147.     TRANS *trans_write; /* supported translations */
  148. #ifdef HAS_RECORD
  149.     TRANS *trans_read; /* supported translations */
  150. #endif
  151.     int volume_left; /* volume (range is machine dependent) */
  152.     int volume_right;
  153.     int bass; /* tone (range is machine dependent) */
  154.     int treble;
  155.     int gain;
  156.     int minDev; /* minor device number currently open */
  157. };
  158. extern struct sound_settings dmasound;
  159. #ifdef HAS_8BIT_TABLES
  160. extern char dmasound_ulaw2dma8[];
  161. extern char dmasound_alaw2dma8[];
  162. #endif
  163.     /*
  164.      *  Mid level stuff
  165.      */
  166. static inline int dmasound_set_volume(int volume)
  167. {
  168. return dmasound.mach.setVolume(volume);
  169. }
  170. static inline int dmasound_set_bass(int bass)
  171. {
  172. return dmasound.mach.setBass ? dmasound.mach.setBass(bass) : 50;
  173. }
  174. static inline int dmasound_set_treble(int treble)
  175. {
  176. return dmasound.mach.setTreble ? dmasound.mach.setTreble(treble) : 50;
  177. }
  178. static inline int dmasound_set_gain(int gain)
  179. {
  180. return dmasound.mach.setGain ? dmasound.mach.setGain(gain) : 100;
  181. }
  182.     /*
  183.      * Sound queue stuff, the heart of the driver
  184.      */
  185. struct sound_queue {
  186.     /* buffers allocated for this queue */
  187.     int numBufs; /* real limits on what the user can have */
  188.     int bufSize; /* in bytes */
  189.     char **buffers;
  190.     /* current parameters */
  191.     int locked ; /* params cannot be modified when != 0 */
  192.     int user_frags ; /* user requests this many */
  193.     int user_frag_size ; /* of this size */
  194.     int max_count; /* actual # fragments <= numBufs */
  195.     int block_size; /* internal block size in bytes */
  196.     int max_active; /* in-use fragments <= max_count */
  197.     /* it shouldn't be necessary to declare any of these volatile */
  198.     int front, rear, count;
  199.     int rear_size;
  200.     /*
  201.      * The use of the playing field depends on the hardware
  202.      *
  203.      * Atari, PMac: The number of frames that are loaded/playing
  204.      *
  205.      * Amiga: Bit 0 is set: a frame is loaded
  206.      *        Bit 1 is set: a frame is playing
  207.      */
  208.     int active;
  209.     wait_queue_head_t action_queue, open_queue, sync_queue;
  210.     int open_mode;
  211.     int busy, syncing, xruns, died;
  212. };
  213. #define SLEEP(queue) interruptible_sleep_on_timeout(&queue, HZ)
  214. #define WAKE_UP(queue) (wake_up_interruptible(&queue))
  215. extern struct sound_queue dmasound_write_sq;
  216. #define write_sq dmasound_write_sq
  217. #ifdef HAS_RECORD
  218. extern struct sound_queue dmasound_read_sq;
  219. #define read_sq dmasound_read_sq
  220. #endif
  221. extern int dmasound_catchRadius;
  222. #define catchRadius dmasound_catchRadius
  223. /* define the value to be put in the byte-swap reg in mac-io
  224.    when we want it to swap for us.
  225. */
  226. #define BS_VAL 1
  227. static inline void wait_ms(unsigned int ms)
  228. {
  229. current->state = TASK_UNINTERRUPTIBLE;
  230. schedule_timeout(1 + ms * HZ / 1000);
  231. }
  232. #endif /* _dmasound_h_ */