3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Multimedia
5 * FILE: lib/wdmaud/wdmaud.h
6 * PURPOSE: WDM Audio Support - Common header
7 * PROGRAMMER: Andrew Greenwood
9 * Nov 12, 2005: Declarations for debugging + interface
12 #ifndef __WDMAUD_PRIVATE_H__
13 #define __WDMAUD_PRIVATE_H__
19 Some of this stuff belongs in ksmedia.h or other such global includes.
25 #include <ddk/ntddk.h>
32 #define DbgPrint printf
34 /* TODO: Put elsewhere */
36 typedef struct tagWAVEOUTCAPS2A
{
37 WORD wMid
; /* manufacturer ID */
38 WORD wPid
; /* product ID */
39 MMVERSION vDriverVersion
; /* version of the driver */
40 CHAR szPname
[MAXPNAMELEN
]; /* product name (NULL terminated string) */
41 DWORD dwFormats
; /* formats supported */
42 WORD wChannels
; /* number of sources supported */
43 WORD wReserved1
; /* packing */
44 DWORD dwSupport
; /* functionality supported by driver */
45 GUID ManufacturerGuid
; /* for extensible MID mapping */
46 GUID ProductGuid
; /* for extensible PID mapping */
47 GUID NameGuid
; /* for name lookup in registry */
48 } WAVEOUTCAPS2A
, *PWAVEOUTCAPS2A
, *NPWAVEOUTCAPS2A
, *LPWAVEOUTCAPS2A
;
49 typedef struct tagWAVEOUTCAPS2W
{
50 WORD wMid
; /* manufacturer ID */
51 WORD wPid
; /* product ID */
52 MMVERSION vDriverVersion
; /* version of the driver */
53 WCHAR szPname
[MAXPNAMELEN
]; /* product name (NULL terminated string) */
54 DWORD dwFormats
; /* formats supported */
55 WORD wChannels
; /* number of sources supported */
56 WORD wReserved1
; /* packing */
57 DWORD dwSupport
; /* functionality supported by driver */
58 GUID ManufacturerGuid
; /* for extensible MID mapping */
59 GUID ProductGuid
; /* for extensible PID mapping */
60 GUID NameGuid
; /* for name lookup in registry */
61 } WAVEOUTCAPS2W
, *PWAVEOUTCAPS2W
, *NPWAVEOUTCAPS2W
, *LPWAVEOUTCAPS2W
;
63 typedef WAVEOUTCAPS2W WAVEOUTCAPS2
;
64 typedef PWAVEOUTCAPS2W PWAVEOUTCAPS2
;
65 typedef NPWAVEOUTCAPS2W NPWAVEOUTCAPS2
;
66 typedef LPWAVEOUTCAPS2W LPWAVEOUTCAPS2
;
68 typedef WAVEOUTCAPS2A WAVEOUTCAPS2
;
69 typedef PWAVEOUTCAPS2A PWAVEOUTCAPS2
;
70 typedef NPWAVEOUTCAPS2A NPWAVEOUTCAPS2
;
71 typedef LPWAVEOUTCAPS2A LPWAVEOUTCAPS2
;
81 #define REPORT_MM_RESULT(message, success) \
82 DPRINT("%s %s\n", message, success == MMSYSERR_NOERROR ? "succeeded" : "failed")
86 Private IOCTLs shared between wdmaud.sys and wdmaud.drv
90 IOCTL_WDMAUD_WAVE_OUT_WRITE_PIN
91 IOCTL_WDMAUD_WAVE_IN_READ_PIN
92 IOCTL_WDMAUD_MIXER_CLOSE
93 IOCTL_WDMAUD_MIXER_OPEN
94 IOCTL_WDMAUD_MIDI_IN_READ_PIN
95 IOCTL_WDMAUD_MIXER_GETLINEINFO
96 IOCTL_WDMAUD_MIXER_GETHARDWAREEVENTDATA
97 IOCTL_WDMAUD_MIXER_SETCONTROLDETAILS
98 IOCTL_WDMAUD_MIXER_GETCONTROLDETAILS
99 IOCTL_WDMAUD_MIXER_GETLINECONTROLS
103 #define IOCTL_WDMAUD_HELLO \
104 CTL_CODE(FILE_DEVICE_SOUND, 0x0000, METHOD_BUFFERED, FILE_WRITE_ACCESS)
106 #define IOCTL_WDMAUD_ADD_DEVICE 0x1d8004
107 #define IOCTL_WDMAUD_REMOVE_DEVICE 0x1d8008
108 #define IOCTL_WDMAUD_GET_CAPABILITIES 0x1d800c
109 #define IOCTL_WDMAUD_GET_DEVICE_COUNT 0x1d8010
110 #define IOCTL_WDMAUD_OPEN_DEVICE 0x1d8014
111 #define IOCTL_WDMAUD_CLOSE_DEVICE 0x1d8018
112 #define IOCTL_WDMAUD_AUX_GET_VOLUME 0x1d801c
113 #define IOCTL_WDMAUD_AUX_SET_VOLUME 0x1d8020
116 #define IOCTL_WDMAUD_GOODBYE \
117 CTL_CODE(FILE_DEVICE_SOUND, 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
119 #define IOCTL_WDMAUD_SET_PREFERRED 0x1d8028
121 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN1 0x1d8100
122 #define IOCTL_WDMAUD_WAVE_OUT_START 0x1d8104 /* Reset wave in? */
123 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN3 0x1d8108 /* Start wave in? */
124 #define IOCTL_WDMAUD_BREAK_LOOP 0x1d810c
126 #define IOCTL_WDMAUD_GET_WAVE_OUT_POS 0x1d8110 /* Does something funky */
127 #define IOCTL_WDMAUD_SET_VOLUME 0x1d8114 /* Hasn't this already been covered? */
128 #define IOCTL_WDMAUD_UNKNOWN1 0x1d8018 /* Not used by wdmaud.drv */
129 #define IOCTL_WDMAUD_SUBMIT_WAVE_HDR 0x1d811c
131 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN4 0x1d8140
132 #define IOCTL_WDMAUD_WAVE_IN_START 0x1d8144 /* Reset wave out? */
133 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN6 0x1d8148 /* Start wave out? */
135 #define IOCTL_WDMAUD_MIDI_OUT_SHORT_MESSAGE \
136 0x1d8204 /* Wrong description? */
138 #define IOCTL_WDMAUD_UNKNOWN2 0x1d8208
140 #define IOCTL_WDMAUD_MIDI_OUT_LONG_MESSAGE \
143 #define IOCTL_WDMAUD_SUBMIT_MIDI_HDR 0x1d8210
145 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN7 0x1d8240
146 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN8 0x1d8244
147 #define IOCTL_WDMAUD_SET_STATE_UNKNOWN9 0x1d8248
149 #define IOCTL_WDMAUD_READ_MIDI_DATA 0x1d824c
150 #define IOCTL_WDMAUD_MIDI_MESSAGE 0x1d8300 /* Wrong description? */
152 #define IOCTL_WDMAUD_MIXER_UNKNOWN1 0x1d8310
153 #define IOCTL_WDMAUD_MIXER_UNKNOWN2 0x1d8314
154 #define IOCTL_WDMAUD_MIXER_UNKNOWN3 0x1d8318
173 /* For range checking */
174 WDMAUD_MIN_DEVICE_TYPE
= WDMAUD_WAVE_IN
,
175 WDMAUD_MAX_DEVICE_TYPE
= WDMAUD_AUX
179 Some macros for device type matching and checking
182 #define IsWaveInDeviceType(device_type) (device_type == WDMAUD_WAVE_IN)
183 #define IsWaveOutDeviceType(device_type) (device_type == WDMAUD_WAVE_OUT)
184 #define IsMidiInDeviceType(device_type) (device_type == WDMAUD_MIDI_IN)
185 #define IsMidiOutDeviceType(device_type) (device_type == WDMAUD_MIDI_OUT)
186 #define IsMixerDeviceType(device_type) (device_type == WDMAUD_MIXER)
187 #define IsAuxDeviceType(device_type) (device_type == WDMAUD_AUX)
189 #define IsWaveDeviceType(device_type) \
190 (IsWaveInDeviceType(device_type) || IsWaveOutDeviceType(device_type))
191 #define IsMidiDeviceType(device_type) \
192 (IsMidiInDeviceType(device_type) || IsMidiOutDeviceType(device_type))
194 #define IsValidDeviceType(device_type) \
195 (device_type >= WDMAUD_MIN_DEVICE_TYPE && \
196 device_type <= WDMAUD_MAX_DEVICE_TYPE)
199 The various "caps" (capabilities) structures begin with the same members,
200 so a generic structure is defined here which can be accessed independently
208 MMVERSION vDriverVersion
;
209 WCHAR szPname
[MAXPNAMELEN
];
210 } COMMONCAPSW
, *LPCOMMONCAPSW
;
212 /* Unicode, anyone? */
213 typedef COMMONCAPSW COMMONCAPS
;
214 typedef LPCOMMONCAPSW LPCOMMONCAPS
;
216 /* More abstraction */
217 typedef LPVOID PWDMAUD_HEADER
;
220 There are also various "opendesc" structures, but these don't have any
221 common members. Regardless, this typedef simply serves as a placeholder
222 to indicate that to access the members, it should be cast accordingly.
224 typedef struct OPENDESC
*LPOPENDESC
;
233 LPWAVEOPENDESC open_descriptor
;
234 LPWAVEHDR wave_header
;
236 DWORD unknown_10
; /* pointer to something */
238 LPCRITICAL_SECTION queue_critical_section
;
240 HANDLE exit_thread_event
;
248 } WDMAUD_DEVICE_STATE
, *PWDMAUD_DEVICE_STATE
;
256 DWORD client_instance
;
257 DWORD client_callback
;
262 DWORD with_critical_section
;
274 PWDMAUD_DEVICE_STATE state
;
277 } WDMAUD_DEVICE_INFO
, *PWDMAUD_DEVICE_INFO
;
281 PWDMAUD_DEVICE_INFO offspring
; /* not sure about this */
282 LPOVERLAPPED overlapped
;
284 } WDMAUD_WAVE_PREPARATION_DATA
, *PWDMAUD_WAVE_PREPARATION_DATA
;
290 DWORD cbSize
; /* Maybe? */
292 } WDMAUD_CAPS
, *PWDMAUD_CAPS
;
295 Not quite sure what these are/do yet
298 #define MAGIC_42 0x42424242 /* Queue critical section */
299 #define MAGIC_43 0x43434343 /* Queue critical section */
300 #define MAGIC_48 0x48484848 /* Exit-thread event */
302 #define IsQueueMagic(test_value) \
303 ( ( (DWORD)test_value == MAGIC_42 ) || ( (DWORD)test_value == MAGIC_43) )
307 This should eventually be removed, but is used so we can be nosey and see
308 what the kernel-mode wdmaud.sys is doing with our structures!
311 #ifdef DUMP_WDMAUD_STRUCTURES
313 #define DUMP_MEMBER(struct, member) \
314 DPRINT("%s : %d [0x%x]\n", #member, (int) struct->member, (int) struct->member);
316 #define DUMP_WDMAUD_DEVICE_INFO(info) \
318 DPRINT("-- %s --\n", #info); \
319 DUMP_MEMBER(info, unknown_00); \
320 DUMP_MEMBER(info, id); \
321 DUMP_MEMBER(info, type); \
322 DUMP_MEMBER(info, wave_handle); \
323 DUMP_MEMBER(info, client_instance); \
324 DUMP_MEMBER(info, client_callback); \
325 DUMP_MEMBER(info, unknown_18); \
326 DUMP_MEMBER(info, flags); \
327 DUMP_MEMBER(info, ioctl_param2); \
328 DUMP_MEMBER(info, ioctl_param1); \
329 DUMP_MEMBER(info, with_critical_section); \
330 DUMP_MEMBER(info, string_2c); \
331 DUMP_MEMBER(info, unknown_30); \
332 DUMP_MEMBER(info, playing_notes); \
333 DUMP_MEMBER(info, unknown_38); \
334 DUMP_MEMBER(info, unknown_3c); \
335 DUMP_MEMBER(info, unknown_40); \
336 DUMP_MEMBER(info, unknown_44); \
337 DUMP_MEMBER(info, unknown_48); \
338 DUMP_MEMBER(info, unknown_4C); \
339 DUMP_MEMBER(info, unknown_50); \
340 DUMP_MEMBER(info, beef); \
341 DUMP_MEMBER(info, state); \
342 DUMP_MEMBER(info, signature); \
347 #define DUMP_MEMBER(struct, member)
348 #define DUMP_WDMAUD_DEVICE_INFO(info)
353 /* Helper (helper.c) funcs */
355 MMRESULT
TranslateWinError(DWORD error
);
356 #define GetLastMmError() TranslateWinError(GetLastError());
361 PWDMAUD_DEVICE_INFO device
,
366 /* #define NotifyClient(device, message, p1, p2) ? */
371 BOOL
EnableKernelInterface();
372 BOOL
DisableKernelInterface();
373 HANDLE
GetKernelInterface();
375 MMRESULT
CallKernelDevice(
376 PWDMAUD_DEVICE_INFO device
,
382 BOOL
IsValidDevicePath(WCHAR
* path
);
383 MMRESULT
ValidateDeviceInfo(PWDMAUD_DEVICE_INFO info
);
384 MMRESULT
ValidateDeviceState(PWDMAUD_DEVICE_STATE state
);
385 MMRESULT
ValidateDeviceStateEvents(PWDMAUD_DEVICE_STATE state
);
386 MMRESULT
ValidateDeviceInfoAndState(PWDMAUD_DEVICE_INFO device_info
);
388 PWDMAUD_DEVICE_INFO
CreateDeviceData(CHAR device_type
, WCHAR
* device_path
);
389 PWDMAUD_DEVICE_INFO
CloneDeviceData(PWDMAUD_DEVICE_INFO original
);
390 void DeleteDeviceData(PWDMAUD_DEVICE_INFO device_data
);
393 MMRESULT
ModifyDevicePresence(
398 #define AddDevice(device_type, device_path) \
399 ModifyDevicePresence(device_type, device_path, TRUE)
401 #define AddWaveInDevice(device_path) \
402 AddDevice(WDMAUD_WAVE_IN, device_path)
403 #define AddWaveOutDevice(device_path) \
404 AddDevice(WDMAUD_WAVE_OUT, device_path)
405 #define AddMidiInDevice(device_path) \
406 AddDevice(WDMAUD_MIDI_IN, device_path)
407 #define AddMidiOutDevice(device_path) \
408 AddDevice(WDMAUD_MIDI_OUT, device_path)
409 #define AddMixerDevice(device_path) \
410 AddDevice(WDMAUD_MIXER, device_path)
411 #define AddAuxDevice(device_path) \
412 AddDevice(WDMAUD_AUX, device_path)
414 #define RemoveDevice(device_type, device_path) \
415 ModifyDevicePresence(device_type, device_path, FALSE)
417 #define RemoveWaveInDevice(device_path) \
418 RemoveDevice(WDMAUD_WAVE_IN, device_path)
419 #define RemoveWaveOutDevice(device_path) \
420 RemoveDevice(WDMAUD_WAVE_OUT, device_path)
421 #define RemoveMidiInDevice(device_path) \
422 RemoveDevice(WDMAUD_MIDI_IN, device_path)
423 #define RemoveMidiOutDevice(device_path) \
424 RemoveDevice(WDMAUD_MIDI_OUT, device_path)
425 #define RemoveMixerDevice(device_path) \
426 RemoveDevice(WDMAUD_MIXER, device_path)
427 #define RemoveAuxDevice(device_path) \
428 RemoveDevice(WDMAUD_AUX, device_path)
431 DWORD
GetDeviceCount(CHAR device_type
, WCHAR
* device_path
);
432 #define GetWaveInCount(device_path) GetDeviceCount(WDMAUD_WAVE_IN, device_path)
433 #define GetWaveOutCount(device_path) GetDeviceCount(WDMAUD_WAVE_OUT, device_path)
434 #define GetMidiInCount(device_path) GetDeviceCount(WDMAUD_MIDI_IN, device_path)
435 #define GetMidiOutCount(device_path) GetDeviceCount(WDMAUD_MIDI_OUT, device_path)
436 #define GetMixerCount(device_path) GetDeviceCount(WDMAUD_MIXER, device_path)
437 #define GetAuxCount(device_path) GetDeviceCount(WDMAUD_AUX, device_path)
439 MMRESULT
GetDeviceCapabilities(
445 #define GetWaveInCapabilities(id, device_path, caps) \
446 GetDeviceCapabilities(id, WDMAUD_WAVE_IN, device_path, caps);
447 #define GetWaveOutCapabilities(id, device_path, caps) \
448 GetDeviceCapabilities(id, WDMAUD_WAVE_OUT, device_path, caps);
449 #define GetMidiInCapabilities(id, device_path, caps) \
450 GetDeviceCapabilities(id, WDMAUD_MIDI_IN, device_path, caps);
451 #define GetMidiOutCapabilities(id, device_path, caps) \
452 GetDeviceCapabilities(id, WDMAUD_MIDI_OUT, device_path, caps);
453 #define GetMixerCapabilities(id, device_path, caps) \
454 GetDeviceCapabilities(id, WDMAUD_MIXER, device_path, caps);
455 #define GetAuxCapabilities(id, device_path, caps) \
456 GetDeviceCapabilities(id, WDMAUD_AUX, device_path, caps);
458 MMRESULT
OpenWaveDevice(
461 LPWAVEOPENDESC open_details
,
465 #define OpenWaveOut(id, open_details, flags, user_data) \
466 OpenWaveDevice(WDMAUD_WAVE_OUT, id, open_details, flags, user_data);
468 MMRESULT
CloseDevice(
469 PWDMAUD_DEVICE_INFO device
475 #define SET_WAVEHDR_FLAG(header, flag) \
476 header->dwFlags |= flag
478 #define CLEAR_WAVEHDR_FLAG(header, flag) \
479 header->dwFlags &= ~flag
481 MMRESULT
ValidateWavePreparationData(PWDMAUD_WAVE_PREPARATION_DATA prep_data
);
483 MMRESULT
ValidateWaveHeader(PWAVEHDR header
);
485 MMRESULT
PrepareWaveHeader(
486 PWDMAUD_DEVICE_INFO device
,
490 MMRESULT
UnprepareWaveHeader(PWAVEHDR header
);
492 #define IsHeaderPrepared(header) \
493 ( header->reserved != 0 )
495 MMRESULT
CompleteWaveHeader(PWAVEHDR header
);
497 MMRESULT
WriteWaveData(PWDMAUD_DEVICE_INFO device
, PWAVEHDR header
);
502 BOOL
CreateCompletionThread(PWDMAUD_DEVICE_INFO device
);