Sync with trunk rev.61910 to get latest improvements and bugfixes.
[reactos.git] / dll / win32 / mmdrv / mme.c
1 /*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Multimedia
5 * FILE: dll/win32/mmdrv/mme.c
6 * PURPOSE: Multimedia User Mode Driver (MME Interface)
7 * PROGRAMMER: Andrew Greenwood
8 * Aleksey Bragin
9 * UPDATE HISTORY:
10 * Jan 14, 2007: Rewritten and tidied up
11 */
12
13 #include "mmdrv.h"
14
15 #define NDEBUG
16 #include <debug.h>
17
18 /*
19 Sends a message to the client (application), such as WOM_DONE. This
20 is just a wrapper around DriverCallback which translates the
21 parameters appropriately.
22 */
23
24 BOOL
25 NotifyClient(
26 SessionInfo* session_info,
27 DWORD message,
28 DWORD_PTR parameter1,
29 DWORD_PTR parameter2)
30 {
31 return DriverCallback(session_info->callback,
32 HIWORD(session_info->flags),
33 session_info->mme_handle,
34 message,
35 session_info->app_user_data,
36 parameter1,
37 parameter2);
38 }
39
40
41
42 /*
43 MME Driver Entrypoint
44 Wave Output
45 */
46
47 DWORD APIENTRY
48 wodMessage(
49 UINT device_id,
50 UINT message,
51 DWORD_PTR private_handle,
52 DWORD_PTR parameter1,
53 DWORD_PTR parameter2)
54 {
55 switch ( message )
56 {
57 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p80.htm */
58 case WODM_GETNUMDEVS :
59 DPRINT("WODM_GETNUMDEVS\n");
60 return GetDeviceCount(WaveOutDevice);
61
62 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6h.htm */
63 case WODM_GETDEVCAPS :
64 DPRINT("WODM_GETDEVCAPS\n");
65 return GetDeviceCapabilities(WaveOutDevice,
66 device_id,
67 parameter1,
68 parameter2);
69
70 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p85.htm */
71 case WODM_OPEN :
72 {
73 WAVEOPENDESC* open_desc = (WAVEOPENDESC*) parameter1;
74 DPRINT("WODM_OPEN\n");
75
76 if ( parameter2 && WAVE_FORMAT_QUERY )
77 return QueryWaveFormat(WaveOutDevice, open_desc->lpFormat);
78 else
79 return OpenDevice(WaveOutDevice,
80 device_id,
81 open_desc,
82 parameter2,
83 private_handle);
84 }
85
86 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6g.htm */
87 case WODM_CLOSE :
88 {
89 DPRINT("WODM_CLOSE\n");
90 return CloseDevice(private_handle);
91 }
92
93 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p9w.htm */
94 case WODM_WRITE :
95 {
96 DPRINT("WODM_WRITE\n");
97 return WriteWaveBuffer(private_handle,
98 (PWAVEHDR) parameter1,
99 parameter2);
100 }
101
102 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p86.htm */
103 case WODM_PAUSE :
104 {
105 DPRINT("WODM_PAUSE\n");
106 return HandleBySessionThread(private_handle, message, 0);
107 }
108
109 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p89.htm */
110 case WODM_RESTART :
111 {
112 DPRINT("WODM_RESTART\n");
113 return HandleBySessionThread(private_handle, message, 0);
114 }
115
116 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p88.htm */
117 case WODM_RESET :
118 {
119 DPRINT("WODM_RESET\n");
120 return HandleBySessionThread(private_handle, message, 0);
121 }
122
123 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p83.htm */
124 #if 0
125 case WODM_GETPOS :
126 {
127 DPRINT("WODM_GETPOS\n");
128 return GetPosition(private_handle,
129 (PMMTIME) parameter1,
130 parameter2);
131 }
132 #endif
133
134 /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6f.htm */
135 case WODM_BREAKLOOP :
136 {
137 DPRINT("WODM_BREAKLOOP\n");
138 return HandleBySessionThread(private_handle, message, 0);
139 }
140
141 /* TODO: Others */
142 }
143
144 DPRINT("Unsupported message\n");
145 return MMSYSERR_NOTSUPPORTED;
146 }