[MMEBUDDY]
[reactos.git] / reactos / include / reactos / libs / sound / mmebuddy.h
1 /*
2 * PROJECT: ReactOS Sound System "MME Buddy" Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: include/reactos/libs/sound/mmebuddy.h
5 *
6 * PURPOSE: Header for the "MME Buddy" helper library (located in
7 * lib/drivers/sound/mmebuddy)
8 *
9 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
10 *
11 * HISTORY: 4 July 2008 - Created
12 * 31 Dec 2008 - Split off NT4-specific code into a separate library
13 *
14 * NOTES: MME Buddy was the best name I could come up with...
15 * The structures etc. here should be treated as internal to the
16 * library so should not be directly accessed elsewhere. Perhaps they
17 * can be moved to an internal header?
18 */
19
20 #ifndef ROS_AUDIO_MMEBUDDY_H
21 #define ROS_AUDIO_MMEBUDDY_H
22
23 /*
24 Hacky debug macro
25 */
26
27 #define POPUP(...) \
28 { \
29 WCHAR dbg_popup_msg[1024], dbg_popup_title[256]; \
30 wsprintf(dbg_popup_title, L"%hS(%d)", __FILE__, __LINE__); \
31 wsprintf(dbg_popup_msg, __VA_ARGS__); \
32 MessageBox(0, dbg_popup_msg, dbg_popup_title, MB_OK | MB_TASKMODAL); \
33 }
34
35 #ifndef NDEBUG
36 #define SND_ERR(...) \
37 { \
38 WCHAR dbg_popup_msg[1024]; \
39 wsprintf(dbg_popup_msg, __VA_ARGS__); \
40 OutputDebugString(dbg_popup_msg); \
41 }
42 #define SND_WARN(...) \
43 { \
44 WCHAR dbg_popup_msg[1024]; \
45 wsprintf(dbg_popup_msg, __VA_ARGS__); \
46 OutputDebugString(dbg_popup_msg); \
47 }
48 #define SND_TRACE(...) \
49 { \
50 WCHAR dbg_popup_msg[1024]; \
51 wsprintf(dbg_popup_msg, __VA_ARGS__); \
52 OutputDebugString(dbg_popup_msg); \
53 }
54
55 #define SND_ASSERT(condition) \
56 { \
57 if ( ! ( condition ) ) \
58 { \
59 SND_ERR(L"ASSERT FAILED: %hS File %hS Line %u\n", #condition, __FILE__, __LINE__); \
60 POPUP(L"ASSERT FAILED: %hS\n", #condition); \
61 ExitProcess(1); \
62 } \
63 }
64
65 #define DUMP_WAVEHDR_QUEUE(sound_device_instance) \
66 { \
67 PWAVEHDR CurrDumpHdr = sound_device_instance->HeadWaveHeader; \
68 SND_TRACE(L"-- Current wave header list --\n"); \
69 while ( CurrDumpHdr ) \
70 { \
71 SND_TRACE(L"%x | %d bytes | flags: %x\n", CurrDumpHdr->lpData, \
72 CurrDumpHdr->dwBufferLength, \
73 CurrDumpHdr->dwFlags); \
74 CurrDumpHdr = CurrDumpHdr->lpNext; \
75 } \
76 }
77
78 #else
79 #define SND_ERR(...) do {} while ( 0 )
80 #define SND_WARN(...) do {} while ( 0 )
81 #define SND_TRACE(...) do {} while ( 0 )
82 #define SND_ASSERT(condition) do {} while ( 0 )
83 #define DUMP_WAVEHDR_QUEUE(condition) do {} while ( 0 )
84 #endif
85
86 /*
87 Some memory allocation helper macros
88 */
89
90 #define AllocateStruct(thing) \
91 (thing*) AllocateMemory(sizeof(thing))
92
93 #define StringLengthToBytes(chartype, string_length) \
94 ( ( string_length + 1 ) * sizeof(chartype) )
95
96 #define AllocateWideString(string_length) \
97 (PWSTR) AllocateMemory(StringLengthToBytes(WCHAR, string_length))
98
99 #define ZeroWideString(string) \
100 ZeroMemory(string, StringLengthToBytes(WCHAR, wcslen(string)))
101
102 #define CopyWideString(dest, source) \
103 CopyMemory(dest, source, StringLengthToBytes(WCHAR, wcslen(source)))
104
105
106 /*
107 Helps find the minimum/maximum of two values
108 */
109
110 #define MinimumOf(value_a, value_b) \
111 ( value_a < value_b ? value_a : value_b )
112
113 #define MaximumOf(value_a, value_b) \
114 ( value_a > value_b ? value_a : value_b )
115
116
117 /*
118 Convert a device type into a zero-based array index
119 */
120
121 #define SOUND_DEVICE_TYPE_TO_INDEX(x) \
122 ( x - MIN_SOUND_DEVICE_TYPE )
123
124 #define INDEX_TO_SOUND_DEVICE_TYPE(x) \
125 ( x + MIN_SOUND_DEVICE_TYPE )
126
127
128 /*
129 Validation
130 */
131
132 #define IsValidSoundDeviceType IS_VALID_SOUND_DEVICE_TYPE
133
134 #define VALIDATE_MMSYS_PARAMETER(parameter_condition) \
135 { \
136 if ( ! (parameter_condition) ) \
137 { \
138 SND_ERR(L"FAILED parameter check: %hS\n", #parameter_condition); \
139 return MMSYSERR_INVALPARAM; \
140 } \
141 }
142
143 #define MMSUCCESS(result) \
144 ( result == MMSYSERR_NOERROR )
145
146
147 /*
148 Types and Structures
149 */
150
151 typedef UCHAR MMDEVICE_TYPE, *PMMDEVICE_TYPE;
152 struct _SOUND_DEVICE;
153 struct _SOUND_DEVICE_INSTANCE;
154
155
156 #define DEFINE_GETCAPS_FUNCTYPE(func_typename, caps_type) \
157 typedef MMRESULT (*func_typename)( \
158 IN struct _SOUND_DEVICE* SoundDevice, \
159 IN DWORD DeviceId, \
160 OUT caps_type Capabilities, \
161 IN DWORD CapabilitiesSize);
162
163 /* This one is for those of us who don't care */
164 DEFINE_GETCAPS_FUNCTYPE(MMGETCAPS_FUNC, PVOID);
165
166 /* These are for those of us that do */
167 DEFINE_GETCAPS_FUNCTYPE(MMGETWAVEOUTCAPS_FUNC, LPWAVEOUTCAPS);
168 DEFINE_GETCAPS_FUNCTYPE(MMGETWAVEINCAPS_FUNC, LPWAVEINCAPS );
169 DEFINE_GETCAPS_FUNCTYPE(MMGETMIDIOUTCAPS_FUNC, LPMIDIOUTCAPS);
170 DEFINE_GETCAPS_FUNCTYPE(MMGETMIDIINCAPS_FUNC, LPMIDIINCAPS );
171
172 struct _SOUND_DEVICE;
173 struct _SOUND_DEVICE_INSTANCE;
174
175
176 /*
177 By extending the OVERLAPPED structure, it becomes possible to provide the
178 I/O completion routines with additional information.
179 */
180
181 typedef struct _SOUND_OVERLAPPED
182 {
183 OVERLAPPED Standard;
184 struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance;
185 PWAVEHDR Header;
186 BOOL PerformCompletion;
187
188 DWORD OriginalBufferSize;
189 LPOVERLAPPED_COMPLETION_ROUTINE OriginalCompletionRoutine;
190
191 } SOUND_OVERLAPPED, *PSOUND_OVERLAPPED;
192
193 typedef MMRESULT (*WAVE_COMMIT_FUNC)(
194 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
195 IN PVOID OffsetPtr,
196 IN DWORD Bytes,
197 IN PSOUND_OVERLAPPED Overlap,
198 IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
199
200 typedef MMRESULT (*MMMIXERQUERY_FUNC) (
201 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
202 IN UINT uMsg,
203 IN LPVOID Parameter,
204 IN DWORD Flags);
205
206
207 typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
208 IN struct _SOUND_DEVICE* Device,
209 IN PWAVEFORMATEX WaveFormat,
210 IN DWORD WaveFormatSize);
211
212 typedef MMRESULT (*MMWAVESETFORMAT_FUNC)(
213 IN struct _SOUND_DEVICE_INSTANCE* Instance,
214 IN DWORD DeviceId,
215 IN PWAVEFORMATEX WaveFormat,
216 IN DWORD WaveFormatSize);
217
218 typedef MMRESULT (*MMOPEN_FUNC)(
219 IN struct _SOUND_DEVICE* SoundDevice,
220 OUT PVOID* Handle);
221
222 typedef MMRESULT (*MMCLOSE_FUNC)(
223 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
224 IN PVOID Handle); /* not sure about this */
225
226 typedef MMRESULT (*MMWAVEHEADER_FUNC)(
227 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
228 IN PWAVEHDR WaveHeader);
229
230 typedef MMRESULT (*MMBUFFER_FUNC)(
231 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
232 IN PVOID Buffer,
233 IN DWORD Length);
234
235 typedef MMRESULT(*MMGETPOS_FUNC)(
236 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
237 IN MMTIME* Time);
238
239
240 typedef MMRESULT(*MMSETSTATE_FUNC)(
241 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
242 IN BOOL bStart);
243
244
245 typedef MMRESULT(*MMQUERYDEVICEINTERFACESTRING_FUNC)(
246 IN MMDEVICE_TYPE DeviceType,
247 IN DWORD DeviceId,
248 IN LPWSTR Interface,
249 IN DWORD InterfaceLength,
250 OUT DWORD * InterfaceSize);
251
252 typedef MMRESULT(*MMRESETSTREAM_FUNC)(
253 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
254 IN MMDEVICE_TYPE DeviceType,
255 IN BOOLEAN bStartReset);
256
257 typedef struct _MMFUNCTION_TABLE
258 {
259 union
260 {
261 MMGETCAPS_FUNC GetCapabilities;
262 MMGETWAVEOUTCAPS_FUNC GetWaveOutCapabilities;
263 MMGETWAVEINCAPS_FUNC GetWaveInCapabilities;
264 MMGETMIDIOUTCAPS_FUNC GetMidiOutCapabilities;
265 MMGETMIDIINCAPS_FUNC GetMidiInCapabilities;
266 };
267
268 MMOPEN_FUNC Open;
269 MMCLOSE_FUNC Close;
270
271 MMWAVEQUERYFORMATSUPPORT_FUNC QueryWaveFormatSupport;
272 MMWAVESETFORMAT_FUNC SetWaveFormat;
273
274 MMMIXERQUERY_FUNC QueryMixerInfo;
275
276 WAVE_COMMIT_FUNC CommitWaveBuffer;
277
278 MMGETPOS_FUNC GetPos;
279 MMSETSTATE_FUNC SetState;
280 MMQUERYDEVICEINTERFACESTRING_FUNC GetDeviceInterfaceString;
281 MMRESETSTREAM_FUNC ResetStream;
282
283 // Redundant
284 //MMWAVEHEADER_FUNC PrepareWaveHeader;
285 //MMWAVEHEADER_FUNC UnprepareWaveHeader;
286 //MMWAVEHEADER_FUNC WriteWaveHeader;
287
288 //MMWAVEHEADER_FUNC SubmitWaveHeaderToDevice;
289 //MMBUFFER_FUNC CompleteBuffer;
290 } MMFUNCTION_TABLE, *PMMFUNCTION_TABLE;
291
292
293
294 typedef MMRESULT (*SOUND_THREAD_REQUEST_HANDLER)(
295 IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
296 IN PVOID Parameter);
297
298 typedef struct _SOUND_THREAD
299 {
300 HANDLE Handle;
301 BOOL Running;
302
303 struct
304 {
305 HANDLE Ready;
306 HANDLE Request;
307 HANDLE Done;
308 } Events;
309
310 struct
311 {
312 SOUND_THREAD_REQUEST_HANDLER Handler;
313 struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance;
314 PVOID Parameter;
315 MMRESULT Result;
316 } Request;
317 } SOUND_THREAD, *PSOUND_THREAD;
318
319 typedef struct _SOUND_DEVICE
320 {
321 struct _SOUND_DEVICE* Next;
322 struct _SOUND_DEVICE_INSTANCE* HeadInstance;
323 struct _SOUND_DEVICE_INSTANCE* TailInstance;
324 MMDEVICE_TYPE Type;
325 PVOID Identifier; /* Path for NT4 drivers */
326 /*PWSTR Path;*/
327 MMFUNCTION_TABLE FunctionTable;
328 } SOUND_DEVICE, *PSOUND_DEVICE;
329
330 typedef struct _SOUND_DEVICE_INSTANCE
331 {
332 struct _SOUND_DEVICE_INSTANCE* Next;
333 struct _SOUND_DEVICE* Device;
334 PVOID Handle;
335 struct _SOUND_THREAD* Thread;
336
337 /* Stuff generously donated to us from WinMM */
338 struct
339 {
340 HDRVR Handle;
341 DWORD Flags;
342 DWORD_PTR ClientCallback;
343 DWORD_PTR ClientCallbackInstanceData;
344 } WinMM;
345
346 /* DO NOT TOUCH THESE OUTSIDE OF THE SOUND THREAD */
347
348 union
349 {
350 PWAVEHDR HeadWaveHeader;
351 };
352
353 union
354 {
355 PWAVEHDR TailWaveHeader;
356 };
357
358 PWAVEHDR WaveLoopStart;
359 //PWAVEHDR CurrentWaveHeader;
360 DWORD OutstandingBuffers;
361 DWORD LoopsRemaining;
362 DWORD FrameSize;
363 DWORD BufferCount;
364 WAVEFORMATEX WaveFormatEx;
365 HANDLE hNotifyEvent;
366 HANDLE hStopEvent;
367 } SOUND_DEVICE_INSTANCE, *PSOUND_DEVICE_INSTANCE;
368
369 /* This lives in WAVEHDR.reserved */
370 typedef struct _WAVEHDR_EXTENSION
371 {
372 DWORD BytesCommitted;
373 DWORD BytesCompleted;
374 } WAVEHDR_EXTENSION, *PWAVEHDR_EXTENSION;
375
376
377 /*
378 reentrancy.c
379 */
380
381 MMRESULT
382 InitEntrypointMutexes();
383
384 VOID
385 CleanupEntrypointMutexes();
386
387 VOID
388 AcquireEntrypointMutex(
389 IN MMDEVICE_TYPE DeviceType);
390
391 VOID
392 ReleaseEntrypointMutex(
393 IN MMDEVICE_TYPE DeviceType);
394
395
396 /*
397 mme.c
398 */
399
400 VOID
401 NotifyMmeClient(
402 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
403 IN UINT Message,
404 IN DWORD_PTR Parameter);
405
406 MMRESULT
407 MmeGetSoundDeviceCapabilities(
408 IN MMDEVICE_TYPE DeviceType,
409 IN DWORD DeviceId,
410 IN PVOID Capabilities,
411 IN DWORD CapabilitiesSize);
412
413 MMRESULT
414 MmeOpenWaveDevice(
415 IN MMDEVICE_TYPE DeviceType,
416 IN UINT DeviceId,
417 IN LPWAVEOPENDESC OpenParameters,
418 IN DWORD Flags,
419 OUT DWORD_PTR* PrivateHandle);
420
421 MMRESULT
422 MmeCloseDevice(
423 IN DWORD_PTR PrivateHandle);
424
425 MMRESULT
426 MmeGetPosition(
427 IN MMDEVICE_TYPE DeviceType,
428 IN DWORD DeviceId,
429 IN DWORD_PTR PrivateHandle,
430 IN MMTIME* Time,
431 IN DWORD Size);
432
433 MMRESULT
434 MmeGetDeviceInterfaceString(
435 IN MMDEVICE_TYPE DeviceType,
436 IN DWORD DeviceId,
437 IN LPWSTR Interface,
438 IN DWORD InterfaceLength,
439 OUT DWORD * InterfaceSize);
440
441
442 MMRESULT
443 MmeSetState(
444 IN DWORD_PTR PrivateHandle,
445 IN BOOL bStart);
446
447
448 #define MmePrepareWaveHeader(private_handle, header) \
449 PrepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header)
450
451 #define MmeUnprepareWaveHeader(private_handle, header) \
452 UnprepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header)
453
454 #define MmeWriteWaveHeader(private_handle, header) \
455 WriteWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header)
456
457 MMRESULT
458 MmeResetWavePlayback(
459 IN DWORD_PTR PrivateHandle);
460
461
462 /*
463 capabilities.c
464 */
465
466 MMRESULT
467 GetSoundDeviceCapabilities(
468 IN PSOUND_DEVICE SoundDevice,
469 IN DWORD DeviceId,
470 OUT PVOID Capabilities,
471 IN DWORD CapabilitiesSize);
472
473
474 /*
475 devicelist.c
476 */
477
478 ULONG
479 GetSoundDeviceCount(
480 IN MMDEVICE_TYPE DeviceType);
481
482 BOOLEAN
483 IsValidSoundDevice(
484 IN PSOUND_DEVICE SoundDevice);
485
486 MMRESULT
487 ListSoundDevice(
488 IN MMDEVICE_TYPE DeviceType,
489 IN PVOID Identifier OPTIONAL,
490 OUT PSOUND_DEVICE* SoundDevice OPTIONAL);
491
492 MMRESULT
493 UnlistSoundDevice(
494 IN MMDEVICE_TYPE DeviceType,
495 IN PSOUND_DEVICE SoundDevice);
496
497 MMRESULT
498 UnlistSoundDevices(
499 IN MMDEVICE_TYPE DeviceType);
500
501 VOID
502 UnlistAllSoundDevices();
503
504 MMRESULT
505 GetSoundDevice(
506 IN MMDEVICE_TYPE DeviceType,
507 IN DWORD DeviceIndex,
508 OUT PSOUND_DEVICE* Device);
509
510 MMRESULT
511 GetSoundDeviceIdentifier(
512 IN PSOUND_DEVICE SoundDevice,
513 OUT PVOID* Identifier);
514
515 MMRESULT
516 GetSoundDeviceType(
517 IN PSOUND_DEVICE SoundDevice,
518 OUT PMMDEVICE_TYPE DeviceType);
519
520
521 /*
522 functiontable.c
523 */
524
525 MMRESULT
526 SetSoundDeviceFunctionTable(
527 IN PSOUND_DEVICE SoundDevice,
528 IN PMMFUNCTION_TABLE FunctionTable);
529
530 MMRESULT
531 GetSoundDeviceFunctionTable(
532 IN PSOUND_DEVICE SoundDevice,
533 OUT PMMFUNCTION_TABLE* FunctionTable);
534
535
536 /*
537 deviceinstance.c
538 */
539
540 BOOLEAN
541 IsValidSoundDeviceInstance(
542 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
543
544 MMRESULT
545 CreateSoundDeviceInstance(
546 IN PSOUND_DEVICE SoundDevice,
547 OUT PSOUND_DEVICE_INSTANCE* SoundDeviceInstance);
548
549 MMRESULT
550 DestroySoundDeviceInstance(
551 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
552
553 MMRESULT
554 DestroyAllSoundDeviceInstances(
555 IN PSOUND_DEVICE SoundDevice);
556
557 MMRESULT
558 GetSoundDeviceFromInstance(
559 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
560 OUT PSOUND_DEVICE* SoundDevice);
561
562 MMRESULT
563 GetSoundDeviceInstanceHandle(
564 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
565 OUT PVOID* Handle);
566
567 MMRESULT
568 SetSoundDeviceInstanceMmeData(
569 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
570 IN HDRVR MmeHandle,
571 IN DWORD_PTR ClientCallback,
572 IN DWORD_PTR ClientCallbackData,
573 IN DWORD Flags);
574
575
576 /*
577 thread.c
578 */
579
580 MMRESULT
581 CreateSoundThread(
582 OUT PSOUND_THREAD* Thread);
583
584 MMRESULT
585 DestroySoundThread(
586 IN PSOUND_THREAD Thread);
587
588 MMRESULT
589 CallSoundThread(
590 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
591 IN SOUND_THREAD_REQUEST_HANDLER RequestHandler,
592 IN PVOID Parameter OPTIONAL);
593
594
595 /*
596 utility.c
597 */
598
599 PVOID
600 AllocateMemory(
601 IN UINT Size);
602
603 VOID
604 FreeMemory(
605 IN PVOID Pointer);
606
607 UINT
608 GetMemoryAllocationCount();
609
610 UINT
611 GetDigitCount(
612 IN UINT Number);
613
614 MMRESULT
615 Win32ErrorToMmResult(
616 IN UINT ErrorCode);
617
618 MMRESULT
619 TranslateInternalMmResult(
620 IN MMRESULT Result);
621
622
623 /*
624 wave/format.c
625 */
626
627 MMRESULT
628 QueryWaveDeviceFormatSupport(
629 IN PSOUND_DEVICE SoundDevice,
630 IN LPWAVEFORMATEX Format,
631 IN DWORD FormatSize);
632
633 MMRESULT
634 SetWaveDeviceFormat(
635 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
636 IN DWORD DeviceId,
637 IN LPWAVEFORMATEX Format,
638 IN DWORD FormatSize);
639
640
641 /*
642 wave/header.c
643 */
644
645 MMRESULT
646 EnqueueWaveHeader(
647 PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
648 IN PVOID Parameter);
649
650 VOID
651 CompleteWaveHeader(
652 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
653 IN PWAVEHDR Header);
654
655 MMRESULT
656 PrepareWaveHeader(
657 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
658 IN PWAVEHDR Header);
659
660 MMRESULT
661 UnprepareWaveHeader(
662 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
663 IN PWAVEHDR Header);
664
665 MMRESULT
666 WriteWaveHeader(
667 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
668 IN PWAVEHDR Header);
669
670
671 /*
672 wave/streaming.c
673 */
674
675 VOID
676 DoWaveStreaming(
677 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
678
679 VOID CALLBACK
680 CompleteIO(
681 IN DWORD dwErrorCode,
682 IN DWORD dwNumberOfBytesTransferred,
683 IN LPOVERLAPPED lpOverlapped);
684
685 MMRESULT
686 CommitWaveHeaderToKernelDevice(
687 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
688 IN PWAVEHDR Header,
689 IN WAVE_COMMIT_FUNC CommitFunction);
690
691 MMRESULT
692 WriteFileEx_Committer(
693 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
694 IN PVOID OffsetPtr,
695 IN DWORD Length,
696 IN PSOUND_OVERLAPPED Overlap,
697 IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
698
699 MMRESULT
700 StopStreaming(
701 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
702
703
704 /*
705 kernel.c
706 */
707
708 MMRESULT
709 OpenKernelSoundDeviceByName(
710 IN PWSTR DevicePath,
711 IN BOOLEAN ReadOnly,
712 OUT PHANDLE Handle);
713
714 MMRESULT
715 OpenKernelSoundDevice(
716 IN PSOUND_DEVICE SoundDevice,
717 IN BOOLEAN ReadOnly,
718 OUT PHANDLE Handle);
719
720 MMRESULT
721 CloseKernelSoundDevice(
722 IN HANDLE Handle);
723
724 MMRESULT
725 SyncOverlappedDeviceIoControl(
726 IN HANDLE SoundDeviceInstance,
727 IN DWORD IoControlCode,
728 IN LPVOID InBuffer,
729 IN DWORD InBufferSize,
730 OUT LPVOID OutBuffer,
731 IN DWORD OutBufferSize,
732 OUT LPDWORD BytesTransferred OPTIONAL);
733
734
735 #endif