doswss.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:8k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* MikMod sound library
  2. (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for
  3. complete list.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of
  7. the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.
  16. */
  17. /*==============================================================================
  18.   $Id: doswss.h,v 1.1 2004/02/01 02:01:17 raph Exp $
  19.   Windows Sound System and compatible soundcards definitions
  20. ==============================================================================*/
  21. #ifndef __DOSWSS_H__
  22. #define __DOSWSS_H__
  23. #include "dosdma.h"
  24. #include "dosirq.h"
  25. #define WSS_ADDR (wss.port + 0x04)
  26. #define WSS_DATA (wss.port + 0x05)
  27. #define WSS_STATUS (wss.port + 0x06)
  28. #define WSS_PIO (wss.port + 0x07)
  29. /* WSS_ADDR: Bits 0-4 select an internal register to read/write */
  30. #define WSSR_INPUT_L 0x00 /* Left input control register */
  31. #define WSSR_INPUT_R 0x01 /* RIght input control register */
  32. #define WSSR_AUX1_L 0x02 /* Left Aux #1 input control */
  33. #define WSSR_AUX1_R 0x03 /* Right Aux #1 input control */
  34. #define WSSR_CD_L 0x04 /* Left Aux #2 input control */
  35. #define WSSR_CD_R 0x05 /* Right Aux #2 input control */
  36. #define WSSR_MASTER_L 0x06 /* Left output control */
  37. #define WSSR_MASTER_R 0x07 /* Right output control */
  38. #define WSSR_PLAY_FORMAT 0x08 /* Clock and data format */
  39. #define WSSR_IFACE_CTRL 0x09 /* Interface control */
  40. #define WSSR_PIN_CTRL 0x0a /* Pin control */
  41. #define WSSR_TEST_INIT 0x0b /* Test and initialization */
  42. #define WSSR_MISC_INFO 0x0c /* Miscellaneaous information */
  43. #define WSSR_LOOPBACK 0x0d /* Digital Mix */
  44. #define WSSR_COUNT_HIGH 0x0e /* Playback Upper Base Count */
  45. #define WSSR_COUNT_LOW 0x0f /* Playback Lower Base Count */
  46. #define WSSR_ALT_FEATURE_1 0x10 /* alternate #1 feature enable */
  47. #define WSSR_ALT_FEATURE_2 0x11 /* alternate #2 feature enable */
  48. #define WSSR_LINE_IN_L 0x12 /* left line input control */
  49. #define WSSR_LINE_IN_R 0x13 /* right line input control */
  50. #define WSSR_TIMER_LOW 0x14 /* timer low byte */
  51. #define WSSR_TIMER_HIGH 0x15 /* timer high byte */
  52. #define WSSR_IRQ_STATUS 0x18 /* irq status register */
  53. #define WSSR_MONO_IO_CTRL 0x1a /* mono input/output control */
  54. #define WSSR_REC_FORMAT 0x1c /* record format */
  55. #define WSSR_REC_COUNT_HIGH 0x1e /* record upper count */
  56. #define WSSR_REC_COUNT_LOW 0x1f /* record lower count */
  57. /* WSS_ADDR bits 7-5 definition */
  58. #define WSSM_INIT 0x80 /* Codec is initializing */
  59. #define WSSM_MCE 0x40 /* Mode change enable */
  60. #define WSSM_TRD 0x20 /* Transfer Request Disable */
  61. /* bits 4-0 are indirect register address (0-15) */
  62. /* WSS_STATUS bit masks */
  63. #define WSSM_CUL 0x80 /* Capture data upper/lower byte */
  64. #define WSSM_CLR 0x40 /* Capture left/right sample */
  65. #define WSSM_CRDY 0x20 /* Capture data read */
  66. #define WSSM_SOUR 0x10 /* Playback over/under run error */
  67. #define WSSM_PUL 0x08 /* Playback upper/lower byte */
  68. #define WSSM_PLR 0x04 /* Playback left/right sample */
  69. #define WSSM_PRDY 0x02 /* Playback data register read */
  70. #define WSSM_INT 0x01 /* interrupt status */
  71. /* Definitions for output level registers */
  72. #define WSSM_MUTE 0x80 /* Mute this output source */
  73. /* bits 5-0 are left output attenuation select (0-63) */
  74. /* bits 5-0 are right output attenuation select (0-63) */
  75. /* Definitions for clock and data format register (WSSR_PLAY_FORMAT) */
  76. #define WSSM_STEREO 0x10 /* stero mode */
  77. #define WSSM_ULAW_8 0x20 /* 8-bit U-law companded */
  78. #define WSSM_16BITS 0x40 /* 16 bit twos complement data - little endian */
  79. #define WSSM_ALAW_8 0x60 /* 8-bit A-law companded */
  80. #define WSSM_16BITS_BE 0xc0 /* 16-bit twos complement data - big endian */
  81. #define WSSM_ADPCM_16 0xa0 /* 16-bit ADPCM */
  82. /* Bits 3-1 define frequency divisor */
  83. #define WSSM_XTAL1 0x00 /* 24.576 crystal */
  84. #define WSSM_XTAL2 0x01 /* 16.9344 crystal */
  85. /* Definitions for interface control register (WSSR_IFACE_CTRL) */
  86. #define WSSM_CAPTURE_PIO 0x80 /* Capture PIO enable */
  87. #define WSSM_PLAYBACK_PIO 0x40 /* Playback PIO enable */
  88. #define WSSM_AUTOCALIB 0x08 /* auto calibrate */
  89. #define WSSM_SINGLE_DMA 0x04 /* Use single DMA channel */
  90. #define WSSM_PLAYBACK_ENABLE 0x01 /* playback enable */
  91. /* Definitions for Pin control register (WSSR_PIN_CTRL) */
  92. #define WSSM_IRQ_ENABLE 0x02 /* interrupt enable */
  93. #define WSSM_XCTL1 0x40 /* external control #1 */
  94. #define WSSM_XCTL0 0x80 /* external control #0 */
  95. /* Definitions for WSSR_TEST_INIT register */
  96. #define WSSM_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
  97. /* Definitions for misc control register (WSR_MISC_INFO) */
  98. #define WSSM_MODE2 0x40 /* MODE 2 */
  99. #define WSSM_MODE3 0x6c /* MODE 3 - enhanced mode */
  100. /* Definitions for codec irq status (WSSR_IRQ_STATUS) */
  101. #define WSSM_PLAYBACK_IRQ 0x10
  102. #define WSSM_RECORD_IRQ 0x20
  103. #define WSSM_TIMER_IRQ 0x40
  104. typedef unsigned char boolean;
  105. #ifndef FALSE
  106. #define FALSE 0
  107. #define TRUE 1
  108. #endif
  109. /* Play mode bits */
  110. #define WSSMODE_16BITS 0x0001
  111. #define WSSMODE_STEREO 0x0002
  112. #define WSSMODE_SIGNED 0x0004
  113. /* You can fill some members of this struct (i.e. port,irq,dma) before
  114.  * calling wss_detect() or wss_open()... this will ignore environment settings.
  115.  */
  116. typedef struct {
  117. boolean ok; /* Set if this structure is properly filled */
  118. int port; /* Base codec port */
  119. int irq; /* codec IRQ */
  120. int dma; /* codec DMA */
  121. irq_handle *irq_handle; /* The interrupt handler */
  122. dma_buffer *dma_buff; /* Pre-allocated DMA buffer */
  123. unsigned char mode; /* Current WSS mode (WSSMODE_XXX) */
  124. boolean open; /* Whenever the card has been opened */
  125. int samples; /* Number of samples in DMA buffer */
  126. unsigned char level; /* Output level (63..0): doesn't change when mute */
  127. unsigned char curlevel; /* Current output level (63(min)..0(max)) */
  128. volatile int irqcount; /* Incremented on each IRQ... for diagnostics */
  129. void (*timer_callback) (); /* Called TWICE per buffer play */
  130. } __wss_state;
  131. extern __wss_state wss;
  132. /* Wait until codec finishes initialization */
  133. static inline boolean __wss_wait()
  134. {
  135. int count;
  136. for (count = 10000; count >= 0; count--)
  137. if (!(inportb(WSS_ADDR) & WSSM_INIT))
  138. return TRUE;
  139. return FALSE;
  140. }
  141. static inline void __wss_outreg(unsigned char reg, unsigned char val)
  142. {
  143. outportb(WSS_ADDR, reg);
  144. outportb(WSS_DATA, val);
  145. }
  146. static inline unsigned char __wss_inreg(unsigned char reg)
  147. {
  148. outportb(WSS_ADDR, reg);
  149. return inportb(WSS_DATA);
  150. }
  151. /* Set some bits in a specific register */
  152. static inline void __wss_regbit_set(unsigned char reg, unsigned char mask)
  153. {
  154. outportb(WSS_ADDR, reg);
  155. outportb(WSS_DATA, inportb(WSS_DATA) | mask);
  156. }
  157. /* Reset some bits in a specific register */
  158. static inline void __wss_regbit_reset(unsigned char reg, unsigned char mask)
  159. {
  160. outportb(WSS_ADDR, reg);
  161. outportb(WSS_DATA, inportb(WSS_DATA) & ~mask);
  162. }
  163. /* Detect whenever WSS is present and fill "wss" structure */
  164. extern boolean wss_detect();
  165. /* Reset WSS */
  166. extern void wss_reset();
  167. /* Open WSS for usage */
  168. extern boolean wss_open();
  169. /* Finish working with WSS */
  170. extern boolean wss_close();
  171. /* Enable/disable speaker output */
  172. extern void wss_output(boolean enable);
  173. /* Adjust frequency rate to nearest WSS available */
  174. extern unsigned int wss_adjust_freq(unsigned int freq);
  175. /* Start playing from DMA buffer in either 8/16 bit mono/stereo */
  176. extern boolean wss_start_dma(unsigned char mode, unsigned int freq);
  177. /* Stop playing from DMA buffer */
  178. extern void wss_stop_dma();
  179. /* Query current position/total size of the DMA buffer */
  180. extern void wss_query_dma(unsigned int *dma_size, unsigned int *dma_pos);
  181. /* Set output level (0(min)-63(max)) */
  182. extern void wss_level(int level);
  183. #endif /* __DOSWSS_H__ */
  184. /* ex:set ts=4: */