home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / c / src_cpp / include / sb.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-14  |  4.7 KB  |  172 lines

  1. // Copyright 1993, Mark T. Pflaging
  2. // Interface for class SoundBlaster.
  3. //
  4. // Not all functions shown here are actually implemented!
  5. //
  6. // Portions were borrowed from Jeff Bird's (cejjb@marlin.jcu.edu.au)
  7. // Sound Blaster Freedom routines dated    12 Feb 92
  8. //
  9. #ifndef __SB_HPP
  10. #define __SB_HPP
  11.  
  12. #include <dos.h>
  13. #include <iostream.h>
  14. #include <stdlib.h>
  15.  
  16. #include "standard.hpp"
  17.  
  18. // Defines for Soundblaster and Soundblaster Pro IO address
  19. #define LEFT_FM_STATUS      0x00    // Pro only
  20. #define LEFT_FM_ADDRESS     0x00    // Pro only
  21. #define LEFT_FM_DATA        0x01    // Pro only
  22. #define RIGHT_FM_STATUS     0x02    // Pro only
  23. #define RIGHT_FM_ADDRESS    0x02    // Pro only
  24. #define RIGHT_FM_DATA       0x03    // Pro only
  25. #define MIXER_ADDRESS       0x04    // Pro only
  26. #define MIXER_DATA          0x05    // Pro only
  27. #define DSP_RESET           0x06
  28. #define FM_STATUS           0x08
  29. #define FM_ADDRESS          0x08
  30. #define FM_DATA             0x09
  31. #define DSP_READ_DATA       0x0A
  32. #define DSP_WRITE_DATA      0x0C
  33. #define DSP_WRITE_STATUS    0x0C
  34. #define DSP_DATA_AVAIL      0x0E
  35. #define CD_ROM_DATA         0x10    // Pro only
  36. #define CD_ROM_STATUS       0x11    // Pro only
  37. #define CD_ROM_RESET        0x12    // Pro only
  38. #define CD_ROM_ENABLE       0x13    // Pro only
  39.  
  40. #define ADLIB_FM_STATUS     0x388
  41. #define ADLIB_FM_ADDRESS    0x388
  42. #define ADLIB_FM_DATA       0x389
  43.  
  44. // Defines for 8237 DMA Controller IO addresses
  45. #define DMA         0x00
  46. #define CH0_BASE    DMA+0
  47. #define CH0_COUNT   DMA+1
  48. #define CH1_BASE    DMA+2
  49. #define CH1_COUNT   DMA+3
  50. #define CH2_BASE    DMA+4
  51. #define CH2_COUNT   DMA+5
  52. #define CH3_BASE    DMA+6
  53. #define CH3_COUNT   DMA+7
  54. #define DMA_STATUS  DMA+8
  55. #define DMA_CMD     DMA+8
  56. #define DMA_REQUEST DMA+9
  57. #define DMA_MASK    DMA+10
  58. #define DMA_MODE    DMA+11
  59. #define DMA_FF      DMA+12
  60. #define DMA_TMP     DMA+13
  61. #define DMA_CLEAR   DMA+13
  62. #define DMA_CLRMSK  DMA+14
  63. #define DMA_WRMSK   DMA+15
  64. #define DMAPAGE     0x80
  65.  
  66. // Types of Soundblaster Cards
  67. #define SB15    1
  68. #define SBPro    2
  69. #define SB20    3
  70.  
  71. // DSP Commands
  72. #define DIRECT_8_BIT_DAC    0x10
  73. #define DMA_8_BIT_DAC        0x14
  74. #define DMA_2_BIT_DAC        0x16
  75. #define DMA_2_BIT_REF_DAC   0x17
  76. #define DIRECT_ADC        0x20
  77. #define DMA_ADC         0x24
  78. #define MIDI_READ_POLL        0x30
  79. #define MIDI_READ_IRQ        0x31
  80. #define MIDI_WRITE_POLL     0x38
  81. #define TIME_CONSTANT        0x40
  82. #define DMA_4_BIT_DAC        0x74
  83. #define DMA_4_BIT_REF_DAC   0x75
  84. #define DMA_26_BIT_DAC        0x76
  85. #define DMA_26_BIT_REF_DAC  0x77
  86. #define HALT_DMA        0xD0
  87. #define CONTINUE_DMA        0xD4
  88. #define SPEAKER_ON        0xD1
  89. #define SPEAKER_OFF        0xD3
  90. #define DSP_ID            0xE0
  91. #define DSP_VER         0xE1
  92. #define MDAC1            0x61
  93. #define MDAC2            0x62
  94. #define MDAC3            0x63
  95. #define MDAC4            0x64
  96. #define MDAC5            0x65
  97. #define MDAC6            0x66
  98. #define MDAC7            0x67
  99.  
  100. // DMA routines
  101. extern "C" {
  102.     int far dma_reset(int Channel);
  103.     int far dma_setup(int Channel,char far *Buffer,unsigned Length,int Dir);
  104.     int far dma_done(int Channel);
  105. }
  106.  
  107. extern int far dma_errno;
  108. extern char far *dma_errlist[];
  109.  
  110.  
  111.  
  112. // Define a useful macro for writing data to the DAC
  113. #define writedac(x) { while(inportb(IOaddr+DSP_WRITE_STATUS) & 0x80); \
  114.               outportb(IOaddr+DSP_WRITE_DATA,(x)); }
  115.  
  116. // Write a byte to the SB Pro mixer chip
  117. #define writemixer(x,y) { outportb(IOaddr+MIXER_ADDRESS,(x)); \
  118.               outportb(IOaddr+MIXER_DATA,(y)); }
  119.  
  120. // FM Instrument definition
  121. typedef struct {
  122.     unsigned char SoundCharacteristic[2];
  123.     unsigned char Level[2];
  124.     unsigned char AttackDecay[2];
  125.     unsigned char SustainRelease[2];
  126.     unsigned char WaveSelect[2];
  127.     unsigned char Feedback;
  128.     unsigned char filler[6];
  129. } FM_Instrument;
  130.  
  131. // FM sound routines
  132. void Sb_FM_Reset(void);
  133. void Sb_FM_Key_Off(int voice);
  134. void Sb_FM_Key_On(int voice, int freq, int octave);
  135. void Sb_FM_Voice_Volume(int voice, int vol);
  136. void Sb_FM_Set_Voice(int voice_num, FM_Instrument *ins);
  137.  
  138. // MIDI routines
  139. int Sb_Read_MIDI(void);
  140. void Sb_Write_MIDI(int data);
  141.  
  142. class SoundBlaster
  143. {
  144.     // Card parameters
  145.     unsigned IOaddr;
  146.     unsigned IRQ;
  147.     unsigned DMAchan;
  148.     int    Type;
  149.  
  150.     Boolean Get_Params();
  151.  
  152. public:
  153.     SoundBlaster();
  154.     unsigned getDMAchan() { return DMAchan; }
  155.     unsigned getIRQ() { return IRQ; }
  156.     unsigned getIOaddr() { return IOaddr; }
  157.     int getType() { return Type; }
  158.  
  159.     Boolean Reset();
  160.     void Init_Voice_DMA(void interrupt (*handler)(...) = NULL);
  161.     void DeInit_Voice_DMA(void);
  162.     void Voice(Boolean state);
  163.     void Sample_Rate(unsigned long rate);
  164.     Boolean DMA_Complete(void);
  165.     void Halt_DMA(void);
  166.     void Continue_DMA(void);
  167.     void reset_DMA_Complete(void);
  168.     Boolean isValid() { return ((Type == NULL) ? False : True); }
  169. };
  170.  
  171. #endif
  172.