3 NT4 Multimedia Audio Support (ntddsnd.h)
5 This file is in the public domain.
8 Andrew Greenwood (andrew.greenwood@silverblade.co.uk)
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
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
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.
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
32 #define SOUND_MAX_DEVICES 100
33 #define SOUND_MAX_DEVICE_NAME 80
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
48 Helper macros for defining control codes
51 #define WAVE_CTL_CODE(subcode, iomethod, access) \
52 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_WAVE_BASE + subcode, iomethod, access)
54 #define MIDI_CTL_CODE(subcode, iomethod, access) \
55 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIDI_BASE + subcode, iomethod, access)
57 #define MIX_CTL_CODE(subcode, iomethod, access) \
58 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIX_BASE + subcode, iomethod, access)
60 #define AUX_CTL_CODE(subcode, iomethod, access) \
61 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_AUX_BASE + subcode, iomethod, access)
65 Wave device control codes
68 #define IOCTL_WAVE_QUERY_FORMAT \
69 WAVE_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
71 #define IOCTL_WAVE_SET_FORMAT \
72 WAVE_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
74 #define IOCTL_WAVE_GET_CAPABILITIES \
75 WAVE_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
77 #define IOCTL_WAVE_SET_STATE \
78 WAVE_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS)
80 #define IOCTL_WAVE_GET_STATE \
81 WAVE_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS)
83 #define IOCTL_WAVE_GET_POSITION \
84 WAVE_CTL_CODE(0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
86 #define IOCTL_WAVE_SET_VOLUME \
87 WAVE_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
89 #define IOCTL_WAVE_GET_VOLUME \
90 WAVE_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
92 #define IOCTL_WAVE_SET_PITCH \
93 WAVE_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
95 #define IOCTL_WAVE_GET_PITCH \
96 WAVE_CTL_CODE(0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS)
98 #define IOCTL_WAVE_SET_PLAYBACK_RATE \
99 WAVE_CTL_CODE(0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS)
101 #define IOCTL_WAVE_GET_PLAYBACK_RATE \
102 WAVE_CTL_CODE(0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS)
104 #define IOCTL_WAVE_PLAY \
105 WAVE_CTL_CODE(0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS)
107 #define IOCTL_WAVE_RECORD \
108 WAVE_CTL_CODE(0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS)
110 #define IOCTL_WAVE_BREAK_LOOP \
111 WAVE_CTL_CODE(0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS)
113 #define IOCTL_WAVE_SET_LOW_PRIORITY \
114 WAVE_CTL_CODE(0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS)
117 /* Debug-only control code */
118 #define IOCTL_WAVE_SET_DEBUG_LEVEL \
119 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
124 MIDI device control codes
127 #define IOCTL_MIDI_GET_CAPABILITIES \
128 MIDI_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
130 #define IOCTL_MIDI_SET_STATE \
131 MIDI_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
133 #define IOCTL_MIDI_GET_STATE \
134 MIDI_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
136 #define IOCTL_MIDI_SET_VOLUME \
137 MIDI_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
139 #define IOCTL_MIDI_GET_VOLUME \
140 MIDI_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
142 #define IOCTL_MIDI_PLAY \
143 MIDI_CTL_CODE(0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS)
145 #define IOCTL_MIDI_RECORD \
146 MIDI_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
148 #define IOCTL_MIDI_CACHE_PATCHES \
149 MIDI_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
151 #define IOCTL_MIDI_CACHE_DRUM_PATCHES \
152 MIDI_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
155 /* Debug-only control code */
156 #define IOCTL_MIDI_SET_DEBUG_LEVEL \
157 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
162 Mixer device control codes
165 #define IOCTL_MIX_GET_CONFIGURATION \
166 MIX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
168 #define IOCTL_MIX_GET_CONTROL_DATA \
169 MIX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
171 #define IOCTL_MIX_GET_LINE_DATA \
172 MIX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
174 #define IOCTL_MIX_REQUEST_NOTIFY \
175 MIX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
179 Auxiliary device control codes
182 #define IOCTL_AUX_GET_CAPABILITIES \
183 AUX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
185 #define IOCTL_AUX_SET_VOLUME \
186 AUX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
188 #define IOCTL_AUX_GET_VOLUME \
189 AUX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
191 #define IOCTL_SOUND_GET_CHANGED_VOLUME \
192 AUX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
196 Wave structures & states
199 #define WAVE_DD_MAX_VOLUME 0xFFFFFFFF
201 typedef struct _WAVE_DD_VOLUME
205 } WAVE_DD_VOLUME
, *PWAVE_DD_VOLUME
;
207 typedef struct _WAVE_DD_PITCH
210 } WAVE_DD_PITCH
, *PWAVE_DD_PITCH
;
212 typedef struct _WAVE_DD_PLAYBACK_RATE
215 } WAVE_DD_PLAYBACK_RATE
, *PWAVE_DD_PLAYBACK_RATE
;
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
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
231 MIDI structures & states
234 typedef struct _MIDI_DD_INPUT_DATA
237 UCHAR Data
[sizeof(ULONG
)];
238 } MIDI_DD_INPUT_DATA
, *PMIDI_DD_INPUT_DATA
;
240 typedef struct _MIDI_DD_VOLUME
244 } MIDI_DD_VOLUME
, *PMIDI_DD_VOLUME
;
246 typedef struct _MIDI_DD_CACHE_PATCHES
251 } MIDI_DD_CACHE_PATCHES
, *PMIDI_DD_CACHE_PATCHES
;
253 typedef struct _MIDI_DD_CACHE_DRUM_PATCHES
257 ULONG DrumPatches
[128];
258 } MIDI_DD_CACHE_DRUM_PATCHES
, *PMIDI_DD_CACHE_DRUM_PATCHES
;
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
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
275 TODO: This is incomplete (see NTDDMIX.H in NT4 DDK)
278 typedef struct _MIXER_DD_READ_DATA
281 } MIXER_DD_READ_DATA
, *PMIXER_DD_READ_DATA
;
283 typedef struct _MIXER_DD_LINE_DATA
286 } MIXER_DD_LINE_DATA
, *PMIXER_DD_LINE_DATA
;
293 #define AUX_DD_MAX_VOLUME 0xFFFFFFFF
295 typedef struct _AUX_DD_VOLUME
299 } AUX_DD_VOLUME
, *PAUX_DD_VOLUME
;