xref: /reactos/sdk/include/reactos/libs/sound/sbdsp.h (revision c2c66aff)
1 /*
2     ReactOS Sound System
3     Sound Blaster DSP support
4 
5     Author:
6         Andrew Greenwood (silverblade@reactos.org)
7 
8     History:
9         26 May 2008 - Created
10 
11     Notes:
12         Where timeouts are concerned, a value of 0 is interpreted as "forever".
13 */
14 
15 #ifndef ROS_SOUND_SBDSP_H
16 #define ROS_SOUND_SBDSP_H
17 
18 /*
19     Product versions
20     DSP 1.0, 1.5, 2.0, 2.01 correspond with respective Sound Blaster versions.
21     DSP 3.xx is Sound Blaster Pro
22     DSP 4.xx is Sound Blaster 16
23 */
24 
25 #define SOUND_BLASTER_1_0       L"Sound Blaster 1.0"
26 #define SOUND_BLASTER_1_5       L"Sound Blaster 1.5"
27 #define SOUND_BLASTER_2_0       L"Sound Blaster 2.0"
28 #define SOUND_BLASTER_PRO       L"Sound Blaster Pro"
29 #define SOUND_BLASTER_16        L"Sound Blaster 16"
30 
31 
32 /*
33     Sound Blaster ports I/O
34 */
35 #define READ_SB_FM1_STATUS(bp)          READ_PORT_UCHAR((PUCHAR) bp)
36 #define WRITE_SB_FM1_REGISTER(bp, x)    WRITE_PORT_UCHAR((PUCHAR) bp, x)
37 #define WRITE_SB_FM1_DATA(bp, x)        WRITE_PORT_UCHAR((PUCHAR) bp+0x01, x)
38 
39 #define READ_SB_AFM_STATUS(bp)          READ_PORT_UCHAR((PUCHAR) bp+0x02)
40 #define WRITE_SB_AFM_REGISTER(bp, x)    WRITE_PORT_UCHAR((PUCHAR) bp+0x02, x)
41 #define WRITE_SB_AFM_DATA(bp, x)        WRITE_PORT_UCHAR((PUCHAR) bp+0x03, x)
42 
43 #define WRITE_SB_MIXER_REGISTER(bp, x)  WRITE_PORT_UCHAR((PUCHAR) bp+0x04, x)
44 #define READ_SB_MIXER_DATA(bp)          READ_PORT_UCHAR((PUCHAR) bp+0x05)
45 #define WRITE_SB_MIXER_DATA(bp, x)      WRITE_PORT_UCHAR((PUCHAR) bp+0x05, x)
46 
47 #define WRITE_SB_DSP_RESET(bp, x)       WRITE_PORT_UCHAR((PUCHAR) bp+0x06, x)
48 
49 #define READ_SB_FM2_STATUS(bp)          READ_PORT_UCHAR((PUCHAR) bp+0x08)
50 #define WRITE_SB_FM2_REGISTER(bp, x)    WRITE_PORT_UCHAR((PUCHAR) bp+0x08, x)
51 #define WRITE_SB_FM2_DATA(bp, x)        WRITE_PORT_UCHAR((PUCHAR) bp+0x09, x)
52 
53 #define READ_SB_DSP_DATA(bp)            READ_PORT_UCHAR((PUCHAR) bp+0x0A)
54 #define WRITE_SB_DSP_DATA(bp, x)        WRITE_PORT_UCHAR((PUCHAR) bp+0x0C, x)
55 #define WRITE_SB_DSP_COMMAND(bp, x)     WRITE_PORT_UCHAR((PUCHAR) bp+0x0C, x)
56 
57 /* Clear to send */
58 #define SB_DSP_CLEAR_TO_SEND(bp) \
59     ( ! (READ_PORT_UCHAR((PUCHAR) bp+0x0C) & 0x80 ) )
60 
61 /* Data available for reading */
62 #define SB_DSP_DATA_AVAILABLE(bp) \
63     ( READ_PORT_UCHAR((PUCHAR) bp+0x0E) & 0x80 )
64 
65 
66 #define SB_DSP_READY            0xAA
67 
68 /*
69     Sound Blaster DSP commands
70     (partial list)
71 */
72 #define SB_DSP_OUTPUT_RATE      0x41
73 #define SB_DSP_INPUT_RATE       0x42
74 #define SB_DSP_BLOCK_SIZE       0x48
75 #define SB_DSP_SPEAKER_ON       0xD1
76 #define SB_DSP_SPEAKER_OFF      0xD3
77 #define SB_DSP_SPEAKER_STATUS   0xD8
78 #define SB_DSP_VERSION          0xE1
79 
80 /*
81     Mixer lines (legacy)
82 */
83 #define SB_MIX_VOC_LEVEL        0x04
84 #define SB_MIX_LEGACY_MIC_LEVEL 0x0A
85 #define SB_MIX_MASTER_LEVEL     0x22
86 #define SB_MIX_FM_LEVEL         0x26
87 #define SB_MIX_CD_LEVEL         0x28
88 #define SB_MIX_LINE_LEVEL       0x2E
89 
90 /*
91     Mixer lines
92 */
93 #define SB_MIX_RESET                0x00
94 #define SB_MIX_MASTER_LEFT_LEVEL    0x30
95 #define SB_MIX_MASTER_RIGHT_LEVEL   0x31
96 #define SB_MIX_VOC_LEFT_LEVEL       0x32
97 #define SB_MIX_VOC_RIGHT_LEVEL      0x33
98 #define SB_MIX_MIDI_LEFT_LEVEL      0x34
99 #define SB_MIX_MIDI_RIGHT_LEVEL     0x35
100 #define SB_MIX_CD_LEFT_LEVEL        0x36
101 #define SB_MIX_CD_RIGHT_LEVEL       0x37
102 #define SB_MIX_LINE_LEFT_LEVEL      0x38
103 #define SB_MIX_LINE_RIGHT_LEVEL     0x39
104 #define SB_MIX_MIC_LEVEL            0x3A
105 #define SB_MIX_PC_SPEAKER_LEVEL     0x3B
106 #define SB_MIX_OUTPUT_SWITCHES      0x3C
107 #define SB_MIX_INPUT_LEFT_SWITCHES  0x3D
108 #define SB_MIX_INPUT_RIGHT_SWITCHES 0x3E
109 #define SB_MIX_INPUT_LEFT_GAIN      0x3F
110 #define SB_MIX_INPUT_RIGHT_GAIN     0x40
111 #define SB_MIX_OUTPUT_LEFT_GAIN     0x41
112 #define SB_MIX_OUTPUT_RIGHT_GAIN    0x42
113 #define SB_MIX_AGC                  0x43
114 #define SB_MIX_TREBLE_LEFT_LEVEL    0x44
115 #define SB_MIX_TREBLE_RIGHT_LEVEL   0x45
116 #define SB_MIX_BASS_LEFT_LEVEL      0x46
117 #define SB_MIX_BASS_RIGHT_LEVEL     0x47
118 
119 /*
120     Mixer switches
121     (are these correct?)
122 */
123 #define SB_MIX_MIDI_LEFT_SWITCH     0x01
124 #define SB_MIX_MIDI_RIGHT_SWITCH    0x02
125 #define SB_MIX_LINE_LEFT_SWITCH     0x04
126 #define SB_MIX_LINE_RIGHT_SWITCH    0x08
127 #define SB_MIX_CD_LEFT_SWITCH       0x10
128 #define SB_MIX_CD_RIGHT_SWITCH      0x20
129 #define SB_MIX_MIC_SWITCH           0x40
130 
131 
132 /*
133     Reset the Sound Blaster DSP.
134 */
135 NTSTATUS
136 SbDspReset(
137     IN  PUCHAR BasePort,
138     IN  ULONG Timeout);
139 
140 /*
141     Wait for the Sound Blaster DSP to be ready for data to be written to it.
142 */
143 NTSTATUS
144 SbDspWaitToWrite(
145     IN  PUCHAR BasePort,
146     IN  ULONG Timeout);
147 
148 /*
149     Wait for data to be ready for reading from the Sound Blaster DSP.
150 */
151 NTSTATUS
152 SbDspWaitToRead(
153     IN  PUCHAR BasePort,
154     IN  ULONG Timeout);
155 
156 /*
157     Wait for the Sound Blaster DSP to be ready for data to be written to it,
158     then (providing it becomes ready within the timeout period), write the
159     data to it.
160 */
161 NTSTATUS
162 SbDspWrite(
163     IN  PUCHAR BasePort,
164     IN  UCHAR DataByte,
165     IN  ULONG Timeout);
166 
167 /*
168     Wait for the Sound Blaster DSP to be ready for data to be read from it,
169     then read the data from it into the pointer supplied as DataByte. If
170     the timeout is exceeded, DataByte will not be modified.
171 */
172 NTSTATUS
173 SbDspRead(
174     IN  PUCHAR BasePort,
175     OUT PUCHAR DataByte,
176     IN  ULONG Timeout);
177 
178 /*
179     This can only be called immediately after a reset has been issued. The
180     major version and minor version are returned in MajorVersion and
181     MinorVersion, respectively.
182 
183     The timeout applies to each DSP read/write performed. Note that the
184     data pointed to by MajorVersion may still fail if the retrieval of
185     MinorVersion times out.
186 */
187 NTSTATUS
188 SbDspGetVersion(
189     IN  PUCHAR BasePort,
190     OUT PUCHAR MajorVersion,
191     OUT PUCHAR MinorVersion,
192     IN  ULONG Timeout);
193 
194 /*
195     Turn the speaker on.
196 */
197 NTSTATUS
198 SbDspEnableSpeaker(
199     IN  PUCHAR BasePort,
200     IN  ULONG Timeout);
201 
202 /*
203     Turn the speaker off.
204 */
205 NTSTATUS
206 SbDspDisableSpeaker(
207     IN  PUCHAR BasePort,
208     IN  ULONG Timeout);
209 
210 /*
211     Obtains the speaker status, storing the result in IsEnabled. This will be
212     TRUE if the speaker is enabled, otherwise FALSE.
213 */
214 NTSTATUS
215 SbDspIsSpeakerEnabled(
216     IN  PUCHAR BasePort,
217     OUT PBOOLEAN IsEnabled,
218     IN  ULONG Timeout);
219 
220 /*
221     Validate the input sample rate. The major and minor versions are required
222     to determine the capabilities of the card.
223 */
224 BOOLEAN
225 SbDspIsValidInputRate(
226     IN  UCHAR MajorVersion,
227     IN  UCHAR MinorVersion,
228     IN  USHORT Rate,
229     IN  BOOLEAN Stereo);
230 
231 /*
232     Validate the output sample rate. The major and minor versions are required
233     to determine the capabilities of the card.
234 */
235 BOOLEAN
236 SbDspIsValidOutputRate(
237     IN  UCHAR MajorVersion,
238     IN  UCHAR MinorVersion,
239     IN  USHORT Rate,
240     IN  BOOLEAN Stereo);
241 
242 /*
243     Set the output/playback rate
244     * DSP 4.xx only
245 */
246 NTSTATUS
247 SbDsp4SetOutputRate(
248     IN  PUCHAR BasePort,
249     IN  USHORT Rate,
250     IN  ULONG Timeout);
251 
252 /*
253     Set the input/record rate
254     * DSP 4.xx only
255 */
256 NTSTATUS
257 SbDsp4SetInputRate(
258     IN  PUCHAR BasePort,
259     IN  USHORT Rate,
260     IN  ULONG Timeout);
261 
262 
263 /*
264     Reset the mixer
265 */
266 VOID
267 SbMixerReset(IN PUCHAR BasePort);
268 
269 /*
270     Pack mixer level data
271 */
272 NTSTATUS
273 SbMixerPackLevelData(
274     IN  UCHAR Line,
275     IN  UCHAR Level,
276     OUT PUCHAR PackedLevel);
277 
278 /*
279     Unpack mixer level data
280 */
281 NTSTATUS
282 SbMixerUnpackLevelData(
283     IN  UCHAR Line,
284     IN  UCHAR PackedLevel,
285     OUT PUCHAR Level);
286 
287 /*
288     Set a mixer line level
289 */
290 NTSTATUS
291 SbMixerSetLevel(
292     IN  PUCHAR BasePort,
293     IN  UCHAR Line,
294     IN  UCHAR Level);
295 
296 /*
297     Get a mixer line level
298 */
299 NTSTATUS
300 SbMixerGetLevel(
301     IN  PUCHAR BasePort,
302     IN  UCHAR Line,
303     OUT PUCHAR Level);
304 
305 /*
306     Enable automatic gain control
307 */
308 VOID
309 SbMixerEnableAGC(IN PUCHAR BasePort);
310 
311 /*
312     Disable automatic gain control
313 */
314 VOID
315 SbMixerDisableAGC(IN PUCHAR BasePort);
316 
317 /*
318     Retrieve the current state of the automatic gain control
319 */
320 BOOLEAN
321 SbMixerIsAGCEnabled(IN PUCHAR BasePort);
322 
323 
324 #endif
325