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
)
27 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
;
28 PSOUND_DEVICE SoundDevice
;
30 SND_TRACE(L
"Closing mixer device \n");
32 VALIDATE_MMSYS_PARAMETER( PrivateHandle
);
33 SoundDeviceInstance
= (PSOUND_DEVICE_INSTANCE
) PrivateHandle
;
35 if ( ! IsValidSoundDeviceInstance(SoundDeviceInstance
) )
36 return MMSYSERR_INVALHANDLE
;
38 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
39 if ( ! MMSUCCESS(Result
) )
40 return TranslateInternalMmResult(Result
);
43 Result
= DestroySoundDeviceInstance(SoundDeviceInstance
);
50 IN MMDEVICE_TYPE DeviceType
,
52 IN LPMIXEROPENDESC OpenParameters
,
54 OUT DWORD
* PrivateHandle
)
57 PMMFUNCTION_TABLE FunctionTable
;
58 PSOUND_DEVICE SoundDevice
;
59 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
;
61 SND_TRACE(L
"Opening mixer device");
63 VALIDATE_MMSYS_PARAMETER( OpenParameters
);
65 Result
= GetSoundDevice(DeviceType
, DeviceId
, &SoundDevice
);
66 if ( ! MMSUCCESS(Result
) )
67 return TranslateInternalMmResult(Result
);
69 /* Check that winmm gave us a private handle to fill */
70 VALIDATE_MMSYS_PARAMETER( PrivateHandle
);
72 /* Create a sound device instance and open the sound device */
73 Result
= CreateSoundDeviceInstance(SoundDevice
, &SoundDeviceInstance
);
74 if ( ! MMSUCCESS(Result
) )
75 return TranslateInternalMmResult(Result
);
77 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
78 if ( ! MMSUCCESS(Result
) )
79 return TranslateInternalMmResult(Result
);
81 if ( ! FunctionTable
->SetWaveFormat
)
82 return MMSYSERR_NOTSUPPORTED
;
84 Result
= FunctionTable
->SetWaveFormat(SoundDeviceInstance
, DeviceId
, NULL
, 0);
85 if ( ! MMSUCCESS(Result
) )
87 /* TODO: Destroy sound instance */
88 return TranslateInternalMmResult(Result
);
91 /* Store the device instance pointer in the private handle - is DWORD safe here? */
92 *PrivateHandle
= (DWORD
) SoundDeviceInstance
;
94 /* Store the additional information we were given - FIXME: Need flags! */
95 SetSoundDeviceInstanceMmeData(SoundDeviceInstance
,
96 (HDRVR
)OpenParameters
->hmx
,
97 OpenParameters
->dwCallback
,
98 OpenParameters
->dwInstance
,
101 /* Let the application know the device is open */
102 ReleaseEntrypointMutex(DeviceType
);
104 NotifyMmeClient(SoundDeviceInstance
,
105 DeviceType
== WAVE_OUT_DEVICE_TYPE
? WOM_OPEN
: WIM_OPEN
,
108 AcquireEntrypointMutex(DeviceType
);
110 SND_TRACE(L
"Mixer device now open\n");
112 return MMSYSERR_NOERROR
;
116 Standard MME driver entry-point for messages relating to mixers.
127 MMRESULT Result
= MMSYSERR_NOTSUPPORTED
;
129 AcquireEntrypointMutex(MIXER_DEVICE_TYPE
);
131 SND_TRACE(L
"mxdMessage - Message type %d\n", Message
);
135 case MXDM_GETNUMDEVS
:
137 Result
= GetSoundDeviceCount(MIXER_DEVICE_TYPE
);
141 case MXDM_GETDEVCAPS
:
143 Result
= MmeGetSoundDeviceCapabilities(MIXER_DEVICE_TYPE
,
157 Result
= MmeOpenMixerDevice(MIXER_DEVICE_TYPE
,
159 (LPMIXEROPENDESC
) Parameter1
,
161 (DWORD
*) PrivateHandle
);
168 Result
= MmeCloseMixerDevice(PrivateHandle
);
173 case MXDM_GETCONTROLDETAILS
:
178 case MXDM_SETCONTROLDETAILS
:
183 case MXDM_GETLINECONTROLS
:
188 case MXDM_GETLINEINFO
:
194 SND_TRACE(L
"mxdMessage returning MMRESULT %d\n", Result
);
196 ReleaseEntrypointMutex(MIXER_DEVICE_TYPE
);