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 /* NTDDSND_H */
303 
304