[WDMAUD.DRV]
[reactos.git] / reactos / lib / drivers / sound / mmebuddy / mixer / mxdMessage.c
1 /*
2 * PROJECT: ReactOS Sound System "MME Buddy" Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/sound/mmebuddy/mixer/mxdMessage.c
5 *
6 * PURPOSE: Provides the mxdMessage exported function, as required by
7 * the MME API, for mixer device support.
8 *
9 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
10 */
11
12 #include <windows.h>
13 #include <mmsystem.h>
14 #include <mmddk.h>
15
16 #include <ntddsnd.h>
17 #include <sndtypes.h>
18 #undef NDEBUG
19 #include <mmebuddy.h>
20
21
22 MMRESULT
23 MmeCloseMixerDevice(
24 IN DWORD PrivateHandle)
25 {
26 MMRESULT Result;
27 PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
28 PSOUND_DEVICE SoundDevice;
29
30 SND_TRACE(L"Closing mixer device \n");
31
32 VALIDATE_MMSYS_PARAMETER( PrivateHandle );
33 SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
34
35 if ( ! IsValidSoundDeviceInstance(SoundDeviceInstance) )
36 return MMSYSERR_INVALHANDLE;
37
38 Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
39 if ( ! MMSUCCESS(Result) )
40 return TranslateInternalMmResult(Result);
41
42
43 Result = DestroySoundDeviceInstance(SoundDeviceInstance);
44
45 return Result;
46 }
47
48 MMRESULT
49 MmeOpenMixerDevice(
50 IN MMDEVICE_TYPE DeviceType,
51 IN DWORD DeviceId,
52 IN LPMIXEROPENDESC OpenParameters,
53 IN DWORD Flags,
54 OUT DWORD* PrivateHandle)
55 {
56 MMRESULT Result;
57 PMMFUNCTION_TABLE FunctionTable;
58 PSOUND_DEVICE SoundDevice;
59 PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
60
61 SND_TRACE(L"Opening mixer device");
62
63 VALIDATE_MMSYS_PARAMETER( OpenParameters );
64
65 Result = GetSoundDevice(DeviceType, DeviceId, &SoundDevice);
66 if ( ! MMSUCCESS(Result) )
67 return TranslateInternalMmResult(Result);
68
69 /* Check that winmm gave us a private handle to fill */
70 VALIDATE_MMSYS_PARAMETER( PrivateHandle );
71
72 /* Create a sound device instance and open the sound device */
73 Result = CreateSoundDeviceInstance(SoundDevice, &SoundDeviceInstance);
74 if ( ! MMSUCCESS(Result) )
75 return TranslateInternalMmResult(Result);
76
77 Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
78 if ( ! MMSUCCESS(Result) )
79 return TranslateInternalMmResult(Result);
80
81 if ( ! FunctionTable->SetWaveFormat )
82 return MMSYSERR_NOTSUPPORTED;
83
84 Result = FunctionTable->SetWaveFormat(SoundDeviceInstance, DeviceId, NULL, 0);
85 if ( ! MMSUCCESS(Result) )
86 {
87 /* TODO: Destroy sound instance */
88 return TranslateInternalMmResult(Result);
89 }
90
91 /* Store the device instance pointer in the private handle - is DWORD safe here? */
92 *PrivateHandle = (DWORD) SoundDeviceInstance;
93
94 /* Store the additional information we were given - FIXME: Need flags! */
95 SetSoundDeviceInstanceMmeData(SoundDeviceInstance,
96 (HDRVR)OpenParameters->hmx,
97 OpenParameters->dwCallback,
98 OpenParameters->dwInstance,
99 Flags);
100
101 /* Let the application know the device is open */
102 ReleaseEntrypointMutex(DeviceType);
103 #if 0
104 NotifyMmeClient(SoundDeviceInstance,
105 DeviceType == WAVE_OUT_DEVICE_TYPE ? WOM_OPEN : WIM_OPEN,
106 0);
107 #endif
108 AcquireEntrypointMutex(DeviceType);
109
110 SND_TRACE(L"Mixer device now open\n");
111
112 return MMSYSERR_NOERROR;
113 }
114
115 /*
116 Standard MME driver entry-point for messages relating to mixers.
117 */
118 DWORD
119 APIENTRY
120 mxdMessage(
121 DWORD DeviceId,
122 DWORD Message,
123 DWORD PrivateHandle,
124 DWORD Parameter1,
125 DWORD Parameter2)
126 {
127 MMRESULT Result = MMSYSERR_NOTSUPPORTED;
128
129 AcquireEntrypointMutex(MIXER_DEVICE_TYPE);
130
131 SND_TRACE(L"mxdMessage - Message type %d\n", Message);
132
133 switch ( Message )
134 {
135 case MXDM_GETNUMDEVS :
136 {
137 Result = GetSoundDeviceCount(MIXER_DEVICE_TYPE);
138 break;
139 }
140
141 case MXDM_GETDEVCAPS :
142 {
143 Result = MmeGetSoundDeviceCapabilities(MIXER_DEVICE_TYPE,
144 DeviceId,
145 (PVOID) Parameter1,
146 Parameter2);
147 break;
148 }
149
150 case MXDM_INIT :
151 {
152 break;
153 }
154
155 case MXDM_OPEN :
156 {
157 Result = MmeOpenMixerDevice(MIXER_DEVICE_TYPE,
158 DeviceId,
159 (LPMIXEROPENDESC) Parameter1,
160 Parameter2,
161 (DWORD*) PrivateHandle);
162
163 break;
164 }
165
166 case MXDM_CLOSE :
167 {
168 Result = MmeCloseMixerDevice(PrivateHandle);
169
170 break;
171 }
172
173 case MXDM_GETCONTROLDETAILS :
174 {
175 break;
176 }
177
178 case MXDM_SETCONTROLDETAILS :
179 {
180 break;
181 }
182
183 case MXDM_GETLINECONTROLS :
184 {
185 break;
186 }
187
188 case MXDM_GETLINEINFO :
189 {
190 break;
191 }
192 }
193
194 SND_TRACE(L"mxdMessage returning MMRESULT %d\n", Result);
195
196 ReleaseEntrypointMutex(MIXER_DEVICE_TYPE);
197
198 return Result;
199 }