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 Base control codes 37 */ 38 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 44 45 /* 46 Helper macros for defining control codes 47 */ 48 49 #define WAVE_CTL_CODE(subcode, iomethod, access) \ 50 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_WAVE_BASE + subcode, iomethod, access) 51 52 #define MIDI_CTL_CODE(subcode, iomethod, access) \ 53 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIDI_BASE + subcode, iomethod, access) 54 55 #define MIX_CTL_CODE(subcode, iomethod, access) \ 56 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIX_BASE + subcode, iomethod, access) 57 58 #define AUX_CTL_CODE(subcode, iomethod, access) \ 59 CTL_CODE(FILE_DEVICE_SOUND, IOCTL_AUX_BASE + subcode, iomethod, access) 60 61 /* 62 Wave device control codes 63 */ 64 65 #define IOCTL_WAVE_QUERY_FORMAT \ 66 WAVE_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 67 68 #define IOCTL_WAVE_SET_FORMAT \ 69 WAVE_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) 70 71 #define IOCTL_WAVE_GET_CAPABILITIES \ 72 WAVE_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) 73 74 #define IOCTL_WAVE_SET_STATE \ 75 WAVE_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS) 76 77 #define IOCTL_WAVE_GET_STATE \ 78 WAVE_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS) 79 80 #define IOCTL_WAVE_GET_POSITION \ 81 WAVE_CTL_CODE(0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) 82 83 #define IOCTL_WAVE_SET_VOLUME \ 84 WAVE_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) 85 86 #define IOCTL_WAVE_GET_VOLUME \ 87 WAVE_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) 88 89 #define IOCTL_WAVE_SET_PITCH \ 90 WAVE_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) 91 92 #define IOCTL_WAVE_GET_PITCH \ 93 WAVE_CTL_CODE(0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS) 94 95 #define IOCTL_WAVE_SET_PLAYBACK_RATE \ 96 WAVE_CTL_CODE(0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS) 97 98 #define IOCTL_WAVE_GET_PLAYBACK_RATE \ 99 WAVE_CTL_CODE(0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS) 100 101 #define IOCTL_WAVE_PLAY \ 102 WAVE_CTL_CODE(0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS) 103 104 #define IOCTL_WAVE_RECORD \ 105 WAVE_CTL_CODE(0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS) 106 107 #define IOCTL_WAVE_BREAK_LOOP \ 108 WAVE_CTL_CODE(0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS) 109 110 #define IOCTL_WAVE_SET_LOW_PRIORITY \ 111 WAVE_CTL_CODE(0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS) 112 113 #if DBG 114 /* Debug-only control code */ 115 #define IOCTL_WAVE_SET_DEBUG_LEVEL \ 116 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS) 117 #endif 118 119 120 /* 121 MIDI device control codes 122 */ 123 124 #define IOCTL_MIDI_GET_CAPABILITIES \ 125 MIDI_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 126 127 #define IOCTL_MIDI_SET_STATE \ 128 MIDI_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) 129 130 #define IOCTL_MIDI_GET_STATE \ 131 MIDI_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS) 132 133 #define IOCTL_MIDI_SET_VOLUME \ 134 MIDI_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) 135 136 #define IOCTL_MIDI_GET_VOLUME \ 137 MIDI_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) 138 139 #define IOCTL_MIDI_PLAY \ 140 MIDI_CTL_CODE(0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS) 141 142 #define IOCTL_MIDI_RECORD \ 143 MIDI_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) 144 145 #define IOCTL_MIDI_CACHE_PATCHES \ 146 MIDI_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) 147 148 #define IOCTL_MIDI_CACHE_DRUM_PATCHES \ 149 MIDI_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) 150 151 #if DBG 152 /* Debug-only control code */ 153 #define IOCTL_MIDI_SET_DEBUG_LEVEL \ 154 WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS) 155 #endif 156 157 /* 158 Mixer device control codes 159 */ 160 161 #define IOCTL_MIX_GET_CONFIGURATION \ 162 MIX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 163 164 #define IOCTL_MIX_GET_CONTROL_DATA \ 165 MIX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) 166 167 #define IOCTL_MIX_GET_LINE_DATA \ 168 MIX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) 169 170 #define IOCTL_MIX_REQUEST_NOTIFY \ 171 MIX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) 172 173 /* 174 Auxiliary device control codes 175 */ 176 177 #define IOCTL_AUX_GET_CAPABILITIES \ 178 AUX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 179 180 #define IOCTL_AUX_SET_VOLUME \ 181 AUX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) 182 183 #define IOCTL_AUX_GET_VOLUME \ 184 AUX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) 185 186 #define IOCTL_SOUND_GET_CHANGED_VOLUME \ 187 AUX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) 188 189 /* 190 Wave structures & states 191 */ 192 193 #define WAVE_DD_MAX_VOLUME 0xFFFFFFFF 194 195 typedef struct _WAVE_DD_VOLUME { 196 ULONG Left; 197 ULONG Right; 198 } WAVE_DD_VOLUME, *PWAVE_DD_VOLUME; 199 200 typedef struct _WAVE_DD_PITCH { 201 ULONG Pitch; 202 } WAVE_DD_PITCH, *PWAVE_DD_PITCH; 203 204 typedef struct _WAVE_DD_PLAYBACK_RATE { 205 ULONG Rate; 206 } WAVE_DD_PLAYBACK_RATE, *PWAVE_DD_PLAYBACK_RATE; 207 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 213 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 219 220 /* 221 MIDI structures & states 222 */ 223 224 typedef struct _MIDI_DD_INPUT_DATA { 225 LARGE_INTEGER Time; 226 UCHAR Data[sizeof(ULONG)]; 227 } MIDI_DD_INPUT_DATA, *PMIDI_DD_INPUT_DATA; 228 229 typedef struct _MIDI_DD_VOLUME { 230 ULONG Left; 231 ULONG Right; 232 } MIDI_DD_VOLUME, *PMIDI_DD_VOLUME; 233 234 typedef struct _MIDI_DD_CACHE_PATCHES { 235 ULONG Bank; 236 ULONG Flags; 237 ULONG Patches[128]; 238 } MIDI_DD_CACHE_PATCHES, *PMIDI_DD_CACHE_PATCHES; 239 240 typedef struct _MIDI_DD_CACHE_DRUM_PATCHES { 241 ULONG Patch; 242 ULONG Flags; 243 ULONG DrumPatches[128]; 244 } MIDI_DD_CACHE_DRUM_PATCHES, *PMIDI_DD_CACHE_DRUM_PATCHES; 245 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 251 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 257 258 /* 259 Mixer structures 260 TODO: This is incomplete (see NTDDMIX.H in NT4 DDK) 261 */ 262 263 typedef struct _MIXER_DD_READ_DATA { 264 ULONG Id; 265 } MIXER_DD_READ_DATA, *PMIXER_DD_READ_DATA; 266 267 typedef struct _MIXER_DD_LINE_DATA { 268 ULONG fdwLine; 269 } MIXER_DD_LINE_DATA, *PMIXER_DD_LINE_DATA; 270 271 /* 272 Auxiliary structures 273 */ 274 275 #define AUX_DD_MAX_VOLUME 0xFFFFFFFF 276 277 typedef struct _AUX_DD_VOLUME { 278 ULONG Left; 279 ULONG Right; 280 } AUX_DD_VOLUME, *PAUX_DD_VOLUME; 281 282 283 #endif /* NTDDSND_H */ 284