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 "precomp.h"
13
14 MMRESULT
MmeGetLineInfo(IN UINT DeviceId,IN UINT Message,IN DWORD_PTR PrivateHandle,IN DWORD_PTR Parameter1,IN DWORD_PTR Parameter2)15 MmeGetLineInfo(
16 IN UINT DeviceId,
17 IN UINT Message,
18 IN DWORD_PTR PrivateHandle,
19 IN DWORD_PTR Parameter1,
20 IN DWORD_PTR Parameter2)
21 {
22 MMRESULT Result;
23 PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
24 PSOUND_DEVICE SoundDevice;
25 PMMFUNCTION_TABLE FunctionTable;
26
27 //SND_TRACE(L"Getting mixer info %u\n", Message);
28
29 if ( PrivateHandle == 0 )
30 {
31 Result = GetSoundDevice(MIXER_DEVICE_TYPE, DeviceId, &SoundDevice);
32
33 if ( ! MMSUCCESS(Result) )
34 return TranslateInternalMmResult(Result);
35
36 Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
37 if ( ! MMSUCCESS(Result) )
38 return TranslateInternalMmResult(Result);
39
40 Result = FunctionTable->QueryMixerInfo(NULL, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
41 return Result;
42 }
43
44 VALIDATE_MMSYS_PARAMETER( PrivateHandle );
45 SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
46
47 Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
48 if ( ! MMSUCCESS(Result) )
49 return TranslateInternalMmResult(Result);
50
51 Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
52 if ( ! MMSUCCESS(Result) )
53 return TranslateInternalMmResult(Result);
54
55 if ( ! FunctionTable->QueryMixerInfo )
56 return MMSYSERR_NOTSUPPORTED;
57
58 Result = FunctionTable->QueryMixerInfo(SoundDeviceInstance, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
59
60 return Result;
61 }
62
63
64 /*
65 Standard MME driver entry-point for messages relating to mixers.
66 */
67 DWORD
68 APIENTRY
mxdMessage(UINT DeviceId,UINT Message,DWORD_PTR PrivateHandle,DWORD_PTR Parameter1,DWORD_PTR Parameter2)69 mxdMessage(
70 UINT DeviceId,
71 UINT Message,
72 DWORD_PTR PrivateHandle,
73 DWORD_PTR Parameter1,
74 DWORD_PTR Parameter2)
75 {
76 MMRESULT Result = MMSYSERR_NOTSUPPORTED;
77
78 AcquireEntrypointMutex(MIXER_DEVICE_TYPE);
79
80 //SND_TRACE(L"mxdMessage - Message type %d\n", Message);
81
82 switch ( Message )
83 {
84 case MXDM_GETNUMDEVS :
85 {
86 Result = GetSoundDeviceCount(MIXER_DEVICE_TYPE);
87 break;
88 }
89
90 case MXDM_GETDEVCAPS :
91 {
92 Result = MmeGetSoundDeviceCapabilities(MIXER_DEVICE_TYPE,
93 DeviceId,
94 (PVOID) Parameter1,
95 Parameter2);
96 break;
97 }
98
99 case MXDM_INIT :
100 {
101 Result = MMSYSERR_NOERROR;
102 break;
103 }
104
105 case MXDM_OPEN :
106 {
107 Result = MmeOpenDevice(MIXER_DEVICE_TYPE,
108 DeviceId,
109 (LPWAVEOPENDESC) Parameter1, /* unused */
110 Parameter2,
111 (DWORD_PTR*) PrivateHandle);
112 VALIDATE_MMSYS_PARAMETER(*(DWORD_PTR*)PrivateHandle);
113 break;
114 }
115
116 case MXDM_CLOSE :
117 {
118 Result = MmeCloseDevice(PrivateHandle);
119
120 break;
121 }
122
123 case MXDM_GETCONTROLDETAILS :
124 {
125 Result = MmeGetLineInfo(DeviceId,
126 Message,
127 PrivateHandle,
128 Parameter1,
129 Parameter2);
130
131 break;
132 }
133
134 case MXDM_SETCONTROLDETAILS :
135 {
136 Result = MmeGetLineInfo(DeviceId,
137 Message,
138 PrivateHandle,
139 Parameter1,
140 Parameter2);
141
142 break;
143 }
144
145 case MXDM_GETLINECONTROLS :
146 {
147 Result = MmeGetLineInfo(DeviceId,
148 Message,
149 PrivateHandle,
150 Parameter1,
151 Parameter2);
152
153 break;
154 }
155
156 case MXDM_GETLINEINFO :
157 {
158 Result = MmeGetLineInfo(DeviceId,
159 Message,
160 PrivateHandle,
161 Parameter1,
162 Parameter2);
163
164 break;
165 }
166
167 case DRV_QUERYDEVICEINTERFACESIZE :
168 {
169 Result = MmeGetDeviceInterfaceString(MIXER_DEVICE_TYPE, DeviceId, NULL, 0, (DWORD*)Parameter1); //FIXME DWORD_PTR
170 break;
171 }
172
173 case DRV_QUERYDEVICEINTERFACE :
174 {
175 Result = MmeGetDeviceInterfaceString(MIXER_DEVICE_TYPE, DeviceId, (LPWSTR)Parameter1, Parameter2, NULL); //FIXME DWORD_PTR
176 break;
177 }
178
179 }
180
181 //SND_TRACE(L"mxdMessage returning MMRESULT %d\n", Result);
182
183 ReleaseEntrypointMutex(MIXER_DEVICE_TYPE);
184
185 return Result;
186 }
187