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
6 * PURPOSE: Provides the mxdMessage exported function, as required by
7 * the MME API, for mixer device support.
9 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
24 IN DWORD PrivateHandle
,
29 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
;
30 PSOUND_DEVICE SoundDevice
;
31 PMMFUNCTION_TABLE FunctionTable
;
33 //SND_TRACE(L"Getting mixer info %u\n", Message);
35 VALIDATE_MMSYS_PARAMETER( PrivateHandle
);
36 SoundDeviceInstance
= (PSOUND_DEVICE_INSTANCE
) PrivateHandle
;
38 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
39 if ( ! MMSUCCESS(Result
) )
40 return TranslateInternalMmResult(Result
);
42 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
43 if ( ! MMSUCCESS(Result
) )
44 return TranslateInternalMmResult(Result
);
46 if ( ! FunctionTable
->QueryMixerInfo
)
47 return MMSYSERR_NOTSUPPORTED
;
49 Result
= FunctionTable
->QueryMixerInfo(SoundDeviceInstance
, Message
, (LPVOID
)Parameter1
, Parameter2
);
57 IN DWORD PrivateHandle
)
60 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
;
61 PSOUND_DEVICE SoundDevice
;
63 SND_TRACE(L
"Closing mixer device \n");
65 VALIDATE_MMSYS_PARAMETER( PrivateHandle
);
66 SoundDeviceInstance
= (PSOUND_DEVICE_INSTANCE
) PrivateHandle
;
68 if ( ! IsValidSoundDeviceInstance(SoundDeviceInstance
) )
69 return MMSYSERR_INVALHANDLE
;
71 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
72 if ( ! MMSUCCESS(Result
) )
73 return TranslateInternalMmResult(Result
);
76 Result
= DestroySoundDeviceInstance(SoundDeviceInstance
);
83 IN MMDEVICE_TYPE DeviceType
,
85 IN LPMIXEROPENDESC OpenParameters
,
87 OUT DWORD
* PrivateHandle
)
90 PMMFUNCTION_TABLE FunctionTable
;
91 PSOUND_DEVICE SoundDevice
;
92 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
;
94 SND_TRACE(L
"Opening mixer device");
96 VALIDATE_MMSYS_PARAMETER( OpenParameters
);
98 Result
= GetSoundDevice(DeviceType
, DeviceId
, &SoundDevice
);
99 if ( ! MMSUCCESS(Result
) )
100 return TranslateInternalMmResult(Result
);
102 /* Check that winmm gave us a private handle to fill */
103 VALIDATE_MMSYS_PARAMETER( PrivateHandle
);
105 /* Create a sound device instance and open the sound device */
106 Result
= CreateSoundDeviceInstance(SoundDevice
, &SoundDeviceInstance
);
107 if ( ! MMSUCCESS(Result
) )
108 return TranslateInternalMmResult(Result
);
110 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
111 if ( ! MMSUCCESS(Result
) )
112 return TranslateInternalMmResult(Result
);
114 if ( ! FunctionTable
->SetWaveFormat
)
115 return MMSYSERR_NOTSUPPORTED
;
117 Result
= FunctionTable
->SetWaveFormat(SoundDeviceInstance
, DeviceId
, NULL
, 0);
118 if ( ! MMSUCCESS(Result
) )
120 /* TODO: Destroy sound instance */
121 return TranslateInternalMmResult(Result
);
124 /* Store the device instance pointer in the private handle - is DWORD safe here? */
125 *PrivateHandle
= (DWORD
) SoundDeviceInstance
;
127 /* Store the additional information we were given - FIXME: Need flags! */
128 SetSoundDeviceInstanceMmeData(SoundDeviceInstance
,
129 (HDRVR
)OpenParameters
->hmx
,
130 OpenParameters
->dwCallback
,
131 OpenParameters
->dwInstance
,
134 /* Let the application know the device is open */
135 ReleaseEntrypointMutex(DeviceType
);
137 NotifyMmeClient(SoundDeviceInstance
,
138 DeviceType
== WAVE_OUT_DEVICE_TYPE
? WOM_OPEN
: WIM_OPEN
,
141 AcquireEntrypointMutex(DeviceType
);
143 SND_TRACE(L
"Mixer device now open\n");
145 return MMSYSERR_NOERROR
;
149 Standard MME driver entry-point for messages relating to mixers.
160 MMRESULT Result
= MMSYSERR_NOTSUPPORTED
;
162 AcquireEntrypointMutex(MIXER_DEVICE_TYPE
);
164 //SND_TRACE(L"mxdMessage - Message type %d\n", Message);
168 case MXDM_GETNUMDEVS
:
170 Result
= GetSoundDeviceCount(MIXER_DEVICE_TYPE
);
174 case MXDM_GETDEVCAPS
:
176 Result
= MmeGetSoundDeviceCapabilities(MIXER_DEVICE_TYPE
,
185 Result
= MMSYSERR_NOERROR
;
191 Result
= MmeOpenMixerDevice(MIXER_DEVICE_TYPE
,
193 (LPMIXEROPENDESC
) Parameter1
,
195 (DWORD
*) PrivateHandle
);
202 Result
= MmeCloseMixerDevice(PrivateHandle
);
207 case MXDM_GETCONTROLDETAILS
:
209 Result
= MmeGetLineInfo(Message
,
217 case MXDM_SETCONTROLDETAILS
:
219 Result
= MmeGetLineInfo(Message
,
227 case MXDM_GETLINECONTROLS
:
229 Result
= MmeGetLineInfo(Message
,
237 case MXDM_GETLINEINFO
:
239 Result
= MmeGetLineInfo(Message
,
247 case DRV_QUERYDEVICEINTERFACESIZE
:
249 Result
= MmeGetDeviceInterfaceString(MIXER_DEVICE_TYPE
, DeviceId
, NULL
, 0, (DWORD
*)Parameter1
); //FIXME DWORD_PTR
253 case DRV_QUERYDEVICEINTERFACE
:
255 Result
= MmeGetDeviceInterfaceString(MIXER_DEVICE_TYPE
, DeviceId
, (LPWSTR
)Parameter1
, Parameter2
, NULL
); //FIXME DWORD_PTR
261 //SND_TRACE(L"mxdMessage returning MMRESULT %d\n", Result);
263 ReleaseEntrypointMutex(MIXER_DEVICE_TYPE
);