[ARMDDK]
[reactos.git] / include / ddk / ntddsnd.h
1 /*
2 ReactOS Sound System
3 NT4 Multimedia Audio Support (ntddsnd.h)
4
5 This file is in the public domain.
6
7 Author:
8 Andrew Greenwood (andrew.greenwood@silverblade.co.uk)
9
10 History:
11 24 May 2008 - Created
12 2 July 2008 - Added device names as seen from user-mode
13 5 July 2008 - Added macros for checking device type
14 14 Feb 2009 - Added base control codes for nonstandard extensions
15
16 This file contains definitions and structures for Windows NT4 style
17 multimedia drivers. The NT4 DDK has these split across multiple header
18 files: NTDDSND.H, NTDDWAVE.H, NTDDMIDI.H, NTDDMIX.H and NTDDAUX.H
19
20 Should you have an unstoppable urge to build an NT4 multimedia driver
21 against these headers, just create the other files listed above and make
22 them #include this one.
23
24 There are also a number of additional enhancements within this file
25 not found in the originals (such as DOS device name strings and device
26 type IDs).
27 */
28
29 #ifndef NTDDSND_H
30 #define NTDDSND_H
31
32 #define SOUND_MAX_DEVICES 100
33 #define SOUND_MAX_DEVICE_NAME 80
34
35
36 /*
37 Base control codes
38 */
39
40 #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
41 #define IOCTL_WAVE_BASE 0x0000
42 #define IOCTL_MIDI_BASE 0x0080
43 #define IOCTL_AUX_BASE 0x0100
44 #define IOCTL_MIX_BASE 0x0180
45
46
47 /*
48 Helper macros for defining control codes
49 */
50
51 #define WAVE_CTL_CODE(subcode, iomethod, access) \
52 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_WAVE_BASE + subcode, iomethod, access)
53
54 #define MIDI_CTL_CODE(subcode, iomethod, access) \
55 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIDI_BASE + subcode, iomethod, access)
56
57 #define MIX_CTL_CODE(subcode, iomethod, access) \
58 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIX_BASE + subcode, iomethod, access)
59
60 #define AUX_CTL_CODE(subcode, iomethod, access) \
61 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_AUX_BASE + subcode, iomethod, access)
62
63
64 /*
65 Wave device control codes
66 */
67
68 #define IOCTL_WAVE_QUERY_FORMAT \
69 WAVE_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
70
71 #define IOCTL_WAVE_SET_FORMAT \
72 WAVE_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
73
74 #define IOCTL_WAVE_GET_CAPABILITIES \
75 WAVE_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
76
77 #define IOCTL_WAVE_SET_STATE \
78 WAVE_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS)
79
80 #define IOCTL_WAVE_GET_STATE \
81 WAVE_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS)
82
83 #define IOCTL_WAVE_GET_POSITION \
84 WAVE_CTL_CODE(0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
85
86 #define IOCTL_WAVE_SET_VOLUME \
87 WAVE_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
88
89 #define IOCTL_WAVE_GET_VOLUME \
90 WAVE_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
91
92 #define IOCTL_WAVE_SET_PITCH \
93 WAVE_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
94
95 #define IOCTL_WAVE_GET_PITCH \
96 WAVE_CTL_CODE(0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS)
97
98 #define IOCTL_WAVE_SET_PLAYBACK_RATE \
99 WAVE_CTL_CODE(0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS)
100
101 #define IOCTL_WAVE_GET_PLAYBACK_RATE \
102 WAVE_CTL_CODE(0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS)
103
104 #define IOCTL_WAVE_PLAY \
105 WAVE_CTL_CODE(0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS)
106
107 #define IOCTL_WAVE_RECORD \
108 WAVE_CTL_CODE(0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS)
109
110 #define IOCTL_WAVE_BREAK_LOOP \
111 WAVE_CTL_CODE(0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS)
112
113 #define IOCTL_WAVE_SET_LOW_PRIORITY \
114 WAVE_CTL_CODE(0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS)
115
116 #if DBG
117 /* Debug-only control code */
118 #define IOCTL_WAVE_SET_DEBUG_LEVEL \
119 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
120 #endif
121
122
123 /*
124 MIDI device control codes
125 */
126
127 #define IOCTL_MIDI_GET_CAPABILITIES \
128 MIDI_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
129
130 #define IOCTL_MIDI_SET_STATE \
131 MIDI_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
132
133 #define IOCTL_MIDI_GET_STATE \
134 MIDI_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
135
136 #define IOCTL_MIDI_SET_VOLUME \
137 MIDI_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
138
139 #define IOCTL_MIDI_GET_VOLUME \
140 MIDI_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
141
142 #define IOCTL_MIDI_PLAY \
143 MIDI_CTL_CODE(0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS)
144
145 #define IOCTL_MIDI_RECORD \
146 MIDI_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
147
148 #define IOCTL_MIDI_CACHE_PATCHES \
149 MIDI_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
150
151 #define IOCTL_MIDI_CACHE_DRUM_PATCHES \
152 MIDI_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
153
154 #if DBG
155 /* Debug-only control code */
156 #define IOCTL_MIDI_SET_DEBUG_LEVEL \
157 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
158 #endif
159
160
161 /*
162 Mixer device control codes
163 */
164
165 #define IOCTL_MIX_GET_CONFIGURATION \
166 MIX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
167
168 #define IOCTL_MIX_GET_CONTROL_DATA \
169 MIX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
170
171 #define IOCTL_MIX_GET_LINE_DATA \
172 MIX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
173
174 #define IOCTL_MIX_REQUEST_NOTIFY \
175 MIX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
176
177
178 /*
179 Auxiliary device control codes
180 */
181
182 #define IOCTL_AUX_GET_CAPABILITIES \
183 AUX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
184
185 #define IOCTL_AUX_SET_VOLUME \
186 AUX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
187
188 #define IOCTL_AUX_GET_VOLUME \
189 AUX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
190
191 #define IOCTL_SOUND_GET_CHANGED_VOLUME \
192 AUX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
193
194
195 /*
196 Wave structures & states
197 */
198
199 #define WAVE_DD_MAX_VOLUME 0xFFFFFFFF
200
201 typedef struct _WAVE_DD_VOLUME
202 {
203 ULONG Left;
204 ULONG Right;
205 } WAVE_DD_VOLUME, *PWAVE_DD_VOLUME;
206
207 typedef struct _WAVE_DD_PITCH
208 {
209 ULONG Pitch;
210 } WAVE_DD_PITCH, *PWAVE_DD_PITCH;
211
212 typedef struct _WAVE_DD_PLAYBACK_RATE
213 {
214 ULONG Rate;
215 } WAVE_DD_PLAYBACK_RATE, *PWAVE_DD_PLAYBACK_RATE;
216
217 /* IOCTL_WAVE_SET_STATE commands */
218 #define WAVE_DD_STOP 0x0001
219 #define WAVE_DD_PLAY 0x0002
220 #define WAVE_DD_RECORD 0x0003
221 #define WAVE_DD_RESET 0x0004
222
223 /* IOCTL_WAVE_GET_STATE responses */
224 #define WAVE_DD_IDLE 0x0000
225 #define WAVE_DD_STOPPED 0x0001
226 #define WAVE_DD_PLAYING 0x0002
227 #define WAVE_DD_RECORDING 0x0003
228
229
230 /*
231 MIDI structures & states
232 */
233
234 typedef struct _MIDI_DD_INPUT_DATA
235 {
236 LARGE_INTEGER Time;
237 UCHAR Data[sizeof(ULONG)];
238 } MIDI_DD_INPUT_DATA, *PMIDI_DD_INPUT_DATA;
239
240 typedef struct _MIDI_DD_VOLUME
241 {
242 ULONG Left;
243 ULONG Right;
244 } MIDI_DD_VOLUME, *PMIDI_DD_VOLUME;
245
246 typedef struct _MIDI_DD_CACHE_PATCHES
247 {
248 ULONG Bank;
249 ULONG Flags;
250 ULONG Patches[128];
251 } MIDI_DD_CACHE_PATCHES, *PMIDI_DD_CACHE_PATCHES;
252
253 typedef struct _MIDI_DD_CACHE_DRUM_PATCHES
254 {
255 ULONG Patch;
256 ULONG Flags;
257 ULONG DrumPatches[128];
258 } MIDI_DD_CACHE_DRUM_PATCHES, *PMIDI_DD_CACHE_DRUM_PATCHES;
259
260 /* IOCTL_MIDI_SET_STATE commands */
261 #define MIDI_DD_STOP 0x0001
262 #define MIDI_DD_PLAY 0x0002
263 #define MIDI_DD_RECORD 0x0003
264 #define MIDI_DD_RESET 0x0004
265
266 /* IOCTL_MIDI_GET_STATE responses */
267 #define MIDI_DD_IDLE 0x0000
268 #define MIDI_DD_STOPPED 0x0001
269 #define MIDI_DD_PLAYING 0x0002
270 #define MIDI_DD_RECORDING 0x0003
271
272
273 /*
274 Mixer structures
275 TODO: This is incomplete (see NTDDMIX.H in NT4 DDK)
276 */
277
278 typedef struct _MIXER_DD_READ_DATA
279 {
280 ULONG Id;
281 } MIXER_DD_READ_DATA, *PMIXER_DD_READ_DATA;
282
283 typedef struct _MIXER_DD_LINE_DATA
284 {
285 ULONG fdwLine;
286 } MIXER_DD_LINE_DATA, *PMIXER_DD_LINE_DATA;
287
288
289 /*
290 Auxiliary structures
291 */
292
293 #define AUX_DD_MAX_VOLUME 0xFFFFFFFF
294
295 typedef struct _AUX_DD_VOLUME
296 {
297 ULONG Left;
298 ULONG Right;
299 } AUX_DD_VOLUME, *PAUX_DD_VOLUME;
300
301
302 #endif