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

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: dossb.h,v 1.1 2004/02/01 02:01:17 raph Exp $
  19.   SoundBlaster and compatible soundcards definitions
  20. ==============================================================================*/
  21. #ifndef __DOSSB_H__
  22. #define __DOSSB_H__
  23. #include "dosdma.h"
  24. #include "dosirq.h"
  25. #define SB_FM_LEFT_STATUS (sb.port + 0x00) /* (r) Left FM status */
  26. #define SB_FM_LEFT_REGSEL (sb.port + 0x00) /* (w) Left FM register select */
  27. #define SB_FM_LEFT_DATA (sb.port + 0x01) /* (w) Left FM data */
  28. #define SB_FM_RIGHT_STATUS (sb.port + 0x02) /* (r) Right FM status */
  29. #define SB_FM_RIGHT_REGSEL (sb.port + 0x02) /* (w) Right FM register select */
  30. #define SB_FM_RIGHT_DATA (sb.port + 0x03) /* (w) Right FM data */
  31. #define SB_MIXER_REGSEL (sb.port + 0x04) /* (w) Mixer register select */
  32. #define SB_MIXER_DATA (sb.port + 0x05) /* (rw)Mixer data */
  33. #define SB_DSP_RESET (sb.port + 0x06) /* (w) DSP reset */
  34. #define SB_FM_STATUS (sb.port + 0x08) /* (r) FM status */
  35. #define SB_FM_REGSEL (sb.port + 0x08) /* (w) FM register select */
  36. #define SB_FM_DATA (sb.port + 0x09) /* (w) FM data */
  37. #define SB_DSP_DATA_IN (sb.port + 0x0a) /* (r) DSP data input */
  38. #define SB_DSP_DATA_OUT (sb.port + 0x0c) /* (w) DSP data output */
  39. #define SB_DSP_DATA_OUT_STATUS (sb.port + 0x0c) /* (r) DSP data output status */
  40. #define SB_DSP_TIMER_IRQ (sb.port + 0x0d) /* (r) clear timer IRQ? */
  41. #define SB_DSP_DATA_IN_STATUS (sb.port + 0x0e) /* (r) DSP data input status */
  42. #define SB_DSP_DMA8_IRQ (sb.port + 0x0e) /* (r) Acknowledge 8-bit DMA transfer */
  43. #define SB_DSP_DMA16_IRQ (sb.port + 0x0f) /* (r) Acknowledge 16-bit DMA transfer */
  44. /* DSP commands */
  45. #define SBDSP_ASP_STATUS 0x03 /* ASP Status (SB16ASP) */
  46. #define SBDSP_STATUS_OLD 0x04 /* DSP Status (Obsolete) (SB2.0-Pro2) */
  47. #define SBDSP_DIRECT_DAC 0x10 /* Direct DAC, 8-bit (SB) */
  48. #define SBDSP_DMA_PCM8 0x14 /* DMA DAC, 8-bit (SB) */
  49. #define SBDSP_DMA_ADPCM2 0x16 /* DMA DAC, 2-bit ADPCM (SB) */
  50. #define SBDSP_DMA_ADPCM2R 0x17 /* DMA DAC, 2-bit ADPCM Reference (SB) */
  51. #define SBDSP_DMA_PCM8_AUTO 0x1C /* Auto-Initialize DMA DAC, 8-bit (SB2.0) */
  52. #define SBDSP_DMA_ADPCM2R_AUTO 0x1F /* Auto-Initialize DMA DAC, 2-bit ADPCM Reference (SB2.0) */
  53. #define SBDSP_DIRECT_ADC 0x20 /* Direct ADC, 8-bit (SB) */
  54. #define SBDSP_DMA_ADC8 0x24 /* DMA ADC, 8-bit (SB) */
  55. #define SBDSP_DIRECT_ADC8_BURST 0x28 /* Direct ADC, 8-bit (Burst) (SB-Pro2) */
  56. #define SBDSP_DMA_ADC8_AUTO 0x2C /* Auto-Initialize DMA ADC, 8-bit (SB2.0) */
  57. #define SBDSP_MIDI_READ_POLL 0x30 /* MIDI Read Poll (SB) */
  58. #define SBDSP_MIDI_READ_IRQ 0x31 /* MIDI Read Interrupt (SB) */
  59. #define SBDSP_MIDI_READ_TIME 0x32 /* MIDI Read Timestamp Poll (SB???) */
  60. #define SBDSP_MIDI_READ_TIME_IRQ 0x33 /* MIDI Read Timestamp Interrupt (SB???) */
  61. #define SBDSP_MIDI_RW_POLL 0x34 /* MIDI Read Poll + Write Poll (UART) (SB2.0) */
  62. #define SBDSP_MIDI_RW_IRQ 0x35 /* MIDI Read Interrupt + Write Poll (UART) (SB2.0???) */
  63. #define SBDSP_MIDI_RW_TIME_IRQ 0x37 /* MIDI Read Timestamp Interrupt + Write Poll (UART) (SB2.0???) */
  64. #define SBDSP_MIDI_WRITE_POLL 0x38 /* MIDI Write Poll (SB) */
  65. #define SBDSP_SET_TIMING 0x40 /* Set Time Constant (SB) */
  66. #define SBDSP_SET_RATE 0x41 /* Set Sample Rate, Hz (SB16) */
  67. #define SBDSP_DMA_CONT8_AUTO 0x45 /* Continue Auto-Initialize DMA, 8-bit (SB16) */
  68. #define SBDSP_DMA_CONT16_AUTO 0x47 /* Continue Auto-Initialize DMA, 16-bit (SB16) */
  69. #define SBDSP_SET_DMA_BLOCK 0x48 /* Set DMA Block Size (SB2.0) */
  70. #define SBDSP_DMA_ADPCM4 0x74 /* DMA DAC, 4-bit ADPCM (SB) */
  71. #define SBDSP_DMA_ADPCM4_REF 0x75 /* DMA DAC, 4-bit ADPCM Reference (SB) */
  72. #define SBDSP_DMA_ADPCM26 0x76 /* DMA DAC, 2.6-bit ADPCM (SB) */
  73. #define SBDSP_DMA_ADPCM26_REF 0x77 /* DMA DAC, 2.6-bit ADPCM Reference (SB) */
  74. #define SBDSP_DMA_ADPCM4R_AUTO 0x7D /* Auto-Initialize DMA DAC, 4-bit ADPCM Reference (SB2.0) */
  75. #define SBDSP_DMA_ADPCM26R_AUTO 0x7F /* Auto-Initialize DMA DAC, 2.6-bit ADPCM Reference (SB2.0) */
  76. #define SBDSP_DISABLE_DAC 0x80 /* Silence DAC (SB) */
  77. #define SBDSP_HS_DMA_DAC8_AUTO 0x90 /* Auto-Initialize DMA DAC, 8-bit (High Speed) (SB2.0-Pro2) */
  78. #define SBDSP_HS_DMA_ADC8_AUTO 0x98 /* Auto-Initialize DMA ADC, 8-bit (High Speed) (SB2.0-Pro2) */
  79. #define SBDSP_STEREO_ADC_DIS 0xA0 /* Disable Stereo Input Mode (SBPro Only) */
  80. #define SBDSP_STEREO_ADC_ENA 0xA8 /* Enable Stereo Input Mode (SBPro Only) */
  81. #define SBDSP_DMA_GENERIC16 0xB0 /* Generic DAC/ADC DMA (16-bit) (SB16) */
  82. #define SBDSP_DMA_GENERIC8 0xC0 /* Generic DAC/ADC DMA (8-bit) (SB16) */
  83. #define SBDSP_DMA_HALT8 0xD0 /* Halt DMA Operation, 8-bit (SB) */
  84. #define SBDSP_SPEAKER_ENA 0xD1 /* Enable Speaker (SB) */
  85. #define SBDSP_SPEAKER_DIS 0xD3 /* Disable Speaker (SB) */
  86. #define SBDSP_DMA_CONT8 0xD4 /* Continue DMA Operation, 8-bit (SB) */
  87. #define SBDSP_DMA_HALT16 0xD5 /* Halt DMA Operation, 16-bit (SB16) */
  88. #define SBDSP_DMA_CONT16 0xD6 /* Continue DMA Operation, 16-bit (SB16) */
  89. #define SBDSP_SPEAKER_STATUS 0xD8 /* Speaker Status (SB) */
  90. #define SBDSP_DMA_EXIT16_AUTO 0xD9 /* Exit Auto-Initialize DMA Operation, 16-bit (SB16) */
  91. #define SBDSP_DMA_EXIT8_AUTO 0xDA /* Exit Auto-Initialize DMA Operation, 8-bit (SB2.0) */
  92. #define SBDSP_IDENTIFY 0xE0 /* DSP Identification (SB2.0) */
  93. #define SBDSP_VERSION 0xE1 /* DSP Version (SB) */
  94. #define SBDSP_COPYRIGHT 0xE3 /* DSP Copyright (SBPro2???) */
  95. #define SBDSP_WRITE_TEST 0xE4 /* Write Test Register (SB2.0) */
  96. #define SBDSP_READ_TEST 0xE8 /* Read Test Register (SB2.0) */
  97. #define SBDSP_SINE_GEN 0xF0 /* Sine Generator (SB) */
  98. #define SBDSP_AUX_STATUS_PRO 0xF1 /* DSP Auxiliary Status (Obsolete) (SB-Pro2) */
  99. #define SBDSP_GEN_IRQ8 0xF2 /* IRQ Request, 8-bit (SB) */
  100. #define SBDSP_GEN_IRQ16 0xF3 /* IRQ Request, 16-bit (SB16) */
  101. #define SBDSP_STATUS 0xFB /* DSP Status (SB16) */
  102. #define SBDSP_AUX_STATUS_16 0xFC /* DSP Auxiliary Status (SB16) */
  103. #define SBDSP_CMD_STATUS 0xFD /* DSP Command Status (SB16) */
  104. /* Mixer commands */
  105. #define SBMIX_RESET 0x00 /* Reset                        Write       SBPro */
  106. #define SBMIX_STATUS 0x01 /* Status                       Read        SBPro */
  107. #define SBMIX_MASTER_LEVEL1 0x02 /* Master Volume                Read/Write  SBPro Only */
  108. #define SBMIX_DAC_LEVEL 0x04 /* DAC Level                    Read/Write  SBPro */
  109. #define SBMIX_FM_OUTPUT 0x06 /* FM Output Control            Read/Write  SBPro Only */
  110. #define SBMIX_MIC_LEVEL 0x0A /* Microphone Level             Read/Write  SBPro */
  111. #define SBMIX_INPUT_SELECT 0x0C /* Input/Filter Select          Read/Write  SBPro Only */
  112. #define SBMIX_OUTPUT_SELECT 0x0E /* Output/Stereo Select         Read/Write  SBPro Only */
  113. #define SBMIX_FM_LEVEL 0x22 /* Master Volume                Read/Write  SBPro */
  114. #define SBMIX_MASTER_LEVEL 0x26 /* FM Level                     Read/Write  SBPro */
  115. #define SBMIX_CD_LEVEL 0x28 /* CD Audio Level               Read/Write  SBPro */
  116. #define SBMIX_LINEIN_LEVEL 0x2E /* Line In Level                Read/Write  SBPro */
  117. #define SBMIX_MASTER_LEVEL_L 0x30 /* Master Volume Left           Read/Write  SB16 */
  118. #define SBMIX_MASTER_LEVEL_R 0x31 /* Master Volume Right          Read/Write  SB16 */
  119. #define SBMIX_DAC_LEVEL_L 0x32 /* DAC Level Left               Read/Write  SB16 */
  120. #define SBMIX_DAC_LEVEL_R 0x33 /* DAC Level Right              Read/Write  SB16 */
  121. #define SBMIX_FM_LEVEL_L 0x34 /* FM Level Left                Read/Write  SB16 */
  122. #define SBMIX_FM_LEVEL_R 0x35 /* FM Level Right               Read/Write  SB16 */
  123. #define SBMIX_CD_LEVEL_L 0x36 /* CD Audio Level Left          Read/Write  SB16 */
  124. #define SBMIX_CD_LEVEL_R 0x37 /* CD Audio Level Right         Read/Write  SB16 */
  125. #define SBMIX_LINEIN_LEVEL_L 0x38 /* Line In Level Left           Read/Write  SB16 */
  126. #define SBMIX_LINEIN_LEVEL_R 0x39 /* Line In Level Right          Read/Write  SB16 */
  127. #define SBMIX_MIC_LEVEL_16 0x3A /* Microphone Level             Read/Write  SB16 */
  128. #define SBMIX_PCSPK_LEVEL 0x3B /* PC Speaker Level             Read/Write  SB16 */
  129. #define SBMIX_OUTPUT_CONTROL 0x3C /* Output Control               Read/Write  SB16 */
  130. #define SBMIX_INPUT_CONTROL_L 0x3D /* Input Control Left           Read/Write  SB16 */
  131. #define SBMIX_INPUT_CONTROL_R 0x3E /* Input Control Right          Read/Write  SB16 */
  132. #define SBMIX_INPUT_GAIN_L 0x3F /* Input Gain Control Left      Read/Write  SB16 */
  133. #define SBMIX_INPUT_GAIN_R 0x40 /* Input Gain Control Right     Read/Write  SB16 */
  134. #define SBMIX_OUTPUT_GAIN_L 0x41 /* Output Gain Control Left     Read/Write  SB16 */
  135. #define SBMIX_OUTPUT_GAIN_R 0x42 /* Output Gain Control Right    Read/Write  SB16 */
  136. #define SBMIX_AGC_CONTROL 0x43 /* Automatic Gain Control (AGC) Read/Write  SB16 */
  137. #define SBMIX_TREBLE_L 0x44 /* Treble Left                  Read/Write  SB16 */
  138. #define SBMIX_TREBLE_R 0x45 /* Treble Right                 Read/Write  SB16 */
  139. #define SBMIX_BASS_L 0x46 /* Bass Left                    Read/Write  SB16 */
  140. #define SBMIX_BASS_R 0x47 /* Bass Right                   Read/Write  SB16 */
  141. #define SBMIX_IRQ_SELECT 0x80 /* IRQ Select                   Read/Write  SB16 */
  142. #define SBMIX_DMA_SELECT 0x81 /* DMA Select                   Read/Write  SB16 */
  143. #define SBMIX_IRQ_STATUS 0x82 /* IRQ Status                   Read        SB16 */
  144. /* SB_DSP_DATA_OUT_STATUS and SB_DSP_DATA_IN_STATUS bits */
  145. #define SBM_DSP_READY 0x80
  146. /* SB_DSP_RESET / SBMIX_RESET */
  147. #define SBM_DSP_RESET 0x01
  148. /* SBMIX_OUTPUT_SELECT */
  149. #define SBM_MIX_STEREO 0x02
  150. #define SBM_MIX_FILTER 0x20
  151. /* SBDSP_DMA_GENERIC16/SBDSP_DMA_GENERIC8 */
  152. #define SBM_GENDAC_FIFO 0x02
  153. #define SBM_GENDAC_AUTOINIT 0x04
  154. #define SBM_GENDAC_ADC 0x08
  155. /* Second (mode) byte */
  156. #define SBM_GENDAC_SIGNED 0x20
  157. #define SBM_GENDAC_STEREO 0x40
  158. /* DSP version masks */
  159. #define SBVER_10 0x0100 /* Original SoundBlaster */
  160. #define SBVER_15 0x0105 /* SoundBlaster 1.5 */
  161. #define SBVER_20 0x0200 /* SoundBlaster 2.0 */
  162. #define SBVER_PRO 0x0300 /* SoundBlaster Pro */
  163. #define SBVER_PRO2 0x0301 /* SoundBlaster Pro 2 */
  164. #define SBVER_16 0x0400 /* SoundBlaster 16 */
  165. #define SBVER_AWE32 0x040c /* SoundBlaster AWE32 */
  166. typedef unsigned char boolean;
  167. #ifndef FALSE
  168. #define FALSE 0
  169. #define TRUE 1
  170. #endif
  171. /* Play mode bits */
  172. #define SBMODE_16BITS 0x0001
  173. #define SBMODE_STEREO 0x0002
  174. #define SBMODE_SIGNED 0x0004
  175. /* Mask for capabilities that never change */
  176. #define SBMODE_MASK (SBMODE_16BITS | SBMODE_STEREO)
  177. /* You can fill some members of this struct (i.e. port,irq,dma) before
  178.  * calling sb_detect() or sb_open()... this will ignore environment settings.
  179.  */
  180. typedef struct {
  181. boolean ok; /* Are structure contents valid? */
  182. int port, aweport; /* sb/awe32 base port */
  183. int irq; /* SoundBlaster IRQ */
  184. int dma8, dma16; /* 8-bit and 16-bit DMAs */
  185. int maxfreq_mono; /* Maximum discretization frequency / mono mode */
  186. int maxfreq_stereo; /* Maximum discretization frequency / stereo mode */
  187. unsigned short dspver; /* DSP version number */
  188. irq_handle *irq_handle; /* The interrupt handler */
  189. dma_buffer *dma_buff; /* Pre-allocated DMA buffer */
  190. unsigned char caps; /* SoundBlaster capabilities (SBMODE_XXX) */
  191. unsigned char mode; /* Current SB mode (SBMODE_XXX) */
  192. boolean open; /* Whenever the card has been opened */
  193. volatile int irqcount; /* Incremented on each IRQ... for diagnostics */
  194. void (*timer_callback) (); /* Called TWICE per buffer play */
  195. } __sb_state;
  196. extern __sb_state sb;
  197. extern void __sb_wait();
  198. static inline boolean __sb_dsp_ready_in()
  199. {
  200. int count;
  201. for (count = 10000; count >= 0; count--)
  202. if (inportb(SB_DSP_DATA_IN_STATUS) & SBM_DSP_READY)
  203. return TRUE;
  204. return FALSE;
  205. }
  206. static inline boolean __sb_dsp_ready_out()
  207. {
  208. int count;
  209. for (count = 10000; count >= 0; count--)
  210. if ((inportb(SB_DSP_DATA_OUT_STATUS) & SBM_DSP_READY) == 0)
  211. return TRUE;
  212. return FALSE;
  213. }
  214. static inline void __sb_dsp_out(unsigned char reg)
  215. {
  216. __sb_dsp_ready_out();
  217. outportb(SB_DSP_DATA_OUT, reg);
  218. }
  219. static inline unsigned char __sb_dsp_in()
  220. {
  221. __sb_dsp_ready_in();
  222. return inportb(SB_DSP_DATA_IN);
  223. }
  224. static inline void __sb_dspreg_out(unsigned char reg, unsigned char val)
  225. {
  226. __sb_dsp_out(reg);
  227. __sb_dsp_out(val);
  228. }
  229. static inline void __sb_dspreg_outwlh(unsigned char reg, unsigned short val)
  230. {
  231. __sb_dsp_out(reg);
  232. __sb_dsp_out(val);
  233. __sb_dsp_out(val >> 8);
  234. }
  235. static inline void __sb_dspreg_outwhl(unsigned char reg, unsigned short val)
  236. {
  237. __sb_dsp_out(reg);
  238. __sb_dsp_out(val >> 8);
  239. __sb_dsp_out(val);
  240. }
  241. static inline unsigned char __sb_dspreg_in(unsigned char reg)
  242. {
  243. __sb_dsp_out(reg);
  244. return __sb_dsp_in();
  245. }
  246. static inline void __sb_dsp_ack_dma8()
  247. {
  248. inportb(SB_DSP_DMA8_IRQ);
  249. }
  250. static inline void __sb_dsp_ack_dma16()
  251. {
  252. inportb(SB_DSP_DMA16_IRQ);
  253. }
  254. static inline unsigned short __sb_dsp_version()
  255. {
  256. unsigned short ver;
  257. __sb_dsp_out(SBDSP_VERSION);
  258. __sb_dsp_ready_in();
  259. ver = ((unsigned short)__sb_dsp_in()) << 8;
  260. ver |= __sb_dsp_in();
  261. return ver;
  262. }
  263. static inline void __sb_mixer_out(unsigned char reg, unsigned char val)
  264. {
  265. outportb(SB_MIXER_REGSEL, reg);
  266. outportb(SB_MIXER_DATA, val);
  267. }
  268. static inline unsigned char __sb_mixer_in(unsigned char reg)
  269. {
  270. outportb(SB_MIXER_REGSEL, reg);
  271. return inportb(SB_MIXER_DATA);
  272. }
  273. /* Enable stereo transfers: sbpro mode only */
  274. static inline void __sb_stereo(boolean stereo)
  275. {
  276. unsigned char val = __sb_mixer_in(SBMIX_OUTPUT_SELECT);
  277. if (stereo)
  278. val |= SBM_MIX_STEREO;
  279. else
  280. val &= ~SBM_MIX_STEREO;
  281. __sb_mixer_out(SBMIX_OUTPUT_SELECT, val);
  282. }
  283. /* Detect whenever SoundBlaster is present and fill "sb" structure */
  284. extern boolean sb_detect();
  285. /* Reset SoundBlaster */
  286. extern void sb_reset();
  287. /* Start working with SoundBlaster */
  288. extern boolean sb_open();
  289. /* Finish working with SoundBlaster */
  290. extern boolean sb_close();
  291. /* Enable/disable speaker output */
  292. extern void sb_output(boolean enable);
  293. /* Start playing from DMA buffer in either 8/16 bit mono/stereo */
  294. extern boolean sb_start_dma(unsigned char mode, unsigned int freq);
  295. /* Stop playing from DMA buffer */
  296. extern void sb_stop_dma();
  297. /* Query current position/total size of the DMA buffer */
  298. extern void sb_query_dma(unsigned int *dma_size, unsigned int *dma_pos);
  299. #endif /* __DOSSB_H__ */
  300. /* ex:set ts=4: */