| 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 |  |