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
39 #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
40 #define IOCTL_WAVE_BASE 0x0000
41 #define IOCTL_MIDI_BASE 0x0080
42 #define IOCTL_AUX_BASE 0x0100
43 #define IOCTL_MIX_BASE 0x0180
46 Helper macros for defining control codes
49 #define WAVE_CTL_CODE(subcode, iomethod, access) \
50 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_WAVE_BASE + subcode, iomethod, access)
52 #define MIDI_CTL_CODE(subcode, iomethod, access) \
53 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIDI_BASE + subcode, iomethod, access)
55 #define MIX_CTL_CODE(subcode, iomethod, access) \
56 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIX_BASE + subcode, iomethod, access)
58 #define AUX_CTL_CODE(subcode, iomethod, access) \
59 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_AUX_BASE + subcode, iomethod, access)
62 Wave device control codes
65 #define IOCTL_WAVE_QUERY_FORMAT \
66 WAVE_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
68 #define IOCTL_WAVE_SET_FORMAT \
69 WAVE_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
71 #define IOCTL_WAVE_GET_CAPABILITIES \
72 WAVE_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
74 #define IOCTL_WAVE_SET_STATE \
75 WAVE_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS)
77 #define IOCTL_WAVE_GET_STATE \
78 WAVE_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS)
80 #define IOCTL_WAVE_GET_POSITION \
81 WAVE_CTL_CODE(0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
83 #define IOCTL_WAVE_SET_VOLUME \
84 WAVE_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
86 #define IOCTL_WAVE_GET_VOLUME \
87 WAVE_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
89 #define IOCTL_WAVE_SET_PITCH \
90 WAVE_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
92 #define IOCTL_WAVE_GET_PITCH \
93 WAVE_CTL_CODE(0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS)
95 #define IOCTL_WAVE_SET_PLAYBACK_RATE \
96 WAVE_CTL_CODE(0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS)
98 #define IOCTL_WAVE_GET_PLAYBACK_RATE \
99 WAVE_CTL_CODE(0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS)
101 #define IOCTL_WAVE_PLAY \
102 WAVE_CTL_CODE(0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS)
104 #define IOCTL_WAVE_RECORD \
105 WAVE_CTL_CODE(0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS)
107 #define IOCTL_WAVE_BREAK_LOOP \
108 WAVE_CTL_CODE(0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS)
110 #define IOCTL_WAVE_SET_LOW_PRIORITY \
111 WAVE_CTL_CODE(0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS)
114 /* Debug-only control code */
115 #define IOCTL_WAVE_SET_DEBUG_LEVEL \
116 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
121 MIDI device control codes
124 #define IOCTL_MIDI_GET_CAPABILITIES \
125 MIDI_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
127 #define IOCTL_MIDI_SET_STATE \
128 MIDI_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
130 #define IOCTL_MIDI_GET_STATE \
131 MIDI_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
133 #define IOCTL_MIDI_SET_VOLUME \
134 MIDI_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
136 #define IOCTL_MIDI_GET_VOLUME \
137 MIDI_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
139 #define IOCTL_MIDI_PLAY \
140 MIDI_CTL_CODE(0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS)
142 #define IOCTL_MIDI_RECORD \
143 MIDI_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
145 #define IOCTL_MIDI_CACHE_PATCHES \
146 MIDI_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
148 #define IOCTL_MIDI_CACHE_DRUM_PATCHES \
149 MIDI_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
152 /* Debug-only control code */
153 #define IOCTL_MIDI_SET_DEBUG_LEVEL \
154 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS)
158 Mixer device control codes
161 #define IOCTL_MIX_GET_CONFIGURATION \
162 MIX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
164 #define IOCTL_MIX_GET_CONTROL_DATA \
165 MIX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
167 #define IOCTL_MIX_GET_LINE_DATA \
168 MIX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
170 #define IOCTL_MIX_REQUEST_NOTIFY \
171 MIX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
174 Auxiliary device control codes
177 #define IOCTL_AUX_GET_CAPABILITIES \
178 AUX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
180 #define IOCTL_AUX_SET_VOLUME \
181 AUX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
183 #define IOCTL_AUX_GET_VOLUME \
184 AUX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
186 #define IOCTL_SOUND_GET_CHANGED_VOLUME \
187 AUX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
190 Wave structures & states
193 #define WAVE_DD_MAX_VOLUME 0xFFFFFFFF
195 typedef struct _WAVE_DD_VOLUME
{
198 } WAVE_DD_VOLUME
, *PWAVE_DD_VOLUME
;
200 typedef struct _WAVE_DD_PITCH
{
202 } WAVE_DD_PITCH
, *PWAVE_DD_PITCH
;
204 typedef struct _WAVE_DD_PLAYBACK_RATE
{
206 } WAVE_DD_PLAYBACK_RATE
, *PWAVE_DD_PLAYBACK_RATE
;
208 /* IOCTL_WAVE_SET_STATE commands */
209 #define WAVE_DD_STOP 0x0001
210 #define WAVE_DD_PLAY 0x0002
211 #define WAVE_DD_RECORD 0x0003
212 #define WAVE_DD_RESET 0x0004
214 /* IOCTL_WAVE_GET_STATE responses */
215 #define WAVE_DD_IDLE 0x0000
216 #define WAVE_DD_STOPPED 0x0001
217 #define WAVE_DD_PLAYING 0x0002
218 #define WAVE_DD_RECORDING 0x0003
221 MIDI structures & states
224 typedef struct _MIDI_DD_INPUT_DATA
{
226 UCHAR Data
[sizeof(ULONG
)];
227 } MIDI_DD_INPUT_DATA
, *PMIDI_DD_INPUT_DATA
;
229 typedef struct _MIDI_DD_VOLUME
{
232 } MIDI_DD_VOLUME
, *PMIDI_DD_VOLUME
;
234 typedef struct _MIDI_DD_CACHE_PATCHES
{
238 } MIDI_DD_CACHE_PATCHES
, *PMIDI_DD_CACHE_PATCHES
;
240 typedef struct _MIDI_DD_CACHE_DRUM_PATCHES
{
243 ULONG DrumPatches
[128];
244 } MIDI_DD_CACHE_DRUM_PATCHES
, *PMIDI_DD_CACHE_DRUM_PATCHES
;
246 /* IOCTL_MIDI_SET_STATE commands */
247 #define MIDI_DD_STOP 0x0001
248 #define MIDI_DD_PLAY 0x0002
249 #define MIDI_DD_RECORD 0x0003
250 #define MIDI_DD_RESET 0x0004
252 /* IOCTL_MIDI_GET_STATE responses */
253 #define MIDI_DD_IDLE 0x0000
254 #define MIDI_DD_STOPPED 0x0001
255 #define MIDI_DD_PLAYING 0x0002
256 #define MIDI_DD_RECORDING 0x0003
260 TODO: This is incomplete (see NTDDMIX.H in NT4 DDK)
263 typedef struct _MIXER_DD_READ_DATA
{
265 } MIXER_DD_READ_DATA
, *PMIXER_DD_READ_DATA
;
267 typedef struct _MIXER_DD_LINE_DATA
{
269 } MIXER_DD_LINE_DATA
, *PMIXER_DD_LINE_DATA
;
275 #define AUX_DD_MAX_VOLUME 0xFFFFFFFF
277 typedef struct _AUX_DD_VOLUME
{
280 } AUX_DD_VOLUME
, *PAUX_DD_VOLUME
;
283 #endif /* NTDDSND_H */