mirror of
https://github.com/reactos/reactos.git
synced 2025-07-23 08:24:01 +00:00
[AUDIO-BRINGUP]
- Pass audio device id to wdmaud.drv callback functions - Extend VALIDATE_MMSYS_PARAMETER macro - Handle case when the caller does not pass handle of mixer, but a device id - Pass device id to mmixer library - Remove dead code - MS sndvol32.exe now gets further, but crashes in user32 IntCallMessageProc svn path=/branches/audio-bringup/; revision=49931
This commit is contained in:
parent
6c8e7899a9
commit
6cee9e1837
6 changed files with 114 additions and 107 deletions
|
@ -384,7 +384,7 @@ WdmAudCleanupByMMixer()
|
|||
|
||||
MMRESULT
|
||||
WdmAudGetMixerCapabilties(
|
||||
IN ULONG DeviceId,
|
||||
IN ULONG DeviceId,
|
||||
LPMIXERCAPSW Capabilities)
|
||||
{
|
||||
if (MMixerGetCapabilities(&MixerContext, DeviceId, Capabilities) == MM_STATUS_SUCCESS)
|
||||
|
@ -396,10 +396,11 @@ WdmAudGetMixerCapabilties(
|
|||
MMRESULT
|
||||
WdmAudGetLineInfo(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERLINEW MixLine,
|
||||
IN ULONG Flags)
|
||||
{
|
||||
if (MMixerGetLineInfo(&MixerContext, hMixer, Flags, MixLine) == MM_STATUS_SUCCESS)
|
||||
if (MMixerGetLineInfo(&MixerContext, hMixer, MixerId, Flags, MixLine) == MM_STATUS_SUCCESS)
|
||||
return MMSYSERR_NOERROR;
|
||||
|
||||
return MMSYSERR_ERROR;
|
||||
|
@ -408,10 +409,11 @@ WdmAudGetLineInfo(
|
|||
MMRESULT
|
||||
WdmAudGetLineControls(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERLINECONTROLSW MixControls,
|
||||
IN ULONG Flags)
|
||||
{
|
||||
if (MMixerGetLineControls(&MixerContext, hMixer, Flags, MixControls) == MM_STATUS_SUCCESS)
|
||||
if (MMixerGetLineControls(&MixerContext, hMixer, MixerId, Flags, MixControls) == MM_STATUS_SUCCESS)
|
||||
return MMSYSERR_NOERROR;
|
||||
|
||||
return MMSYSERR_ERROR;
|
||||
|
@ -420,10 +422,11 @@ WdmAudGetLineControls(
|
|||
MMRESULT
|
||||
WdmAudSetControlDetails(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||
IN ULONG Flags)
|
||||
{
|
||||
if (MMixerSetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||
if (MMixerSetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||
return MMSYSERR_NOERROR;
|
||||
|
||||
return MMSYSERR_ERROR;
|
||||
|
@ -433,10 +436,11 @@ WdmAudSetControlDetails(
|
|||
MMRESULT
|
||||
WdmAudGetControlDetails(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||
IN ULONG Flags)
|
||||
{
|
||||
if (MMixerGetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||
if (MMixerGetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||
return MMSYSERR_NOERROR;
|
||||
|
||||
return MMSYSERR_ERROR;
|
||||
|
@ -610,6 +614,7 @@ WdmAudGetNumWdmDevsByMMixer(
|
|||
MMRESULT
|
||||
WdmAudQueryMixerInfoByMMixer(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN DWORD MixerId,
|
||||
IN UINT uMsg,
|
||||
IN LPVOID Parameter,
|
||||
IN DWORD Flags)
|
||||
|
@ -617,6 +622,7 @@ WdmAudQueryMixerInfoByMMixer(
|
|||
LPMIXERLINEW MixLine;
|
||||
LPMIXERLINECONTROLSW MixControls;
|
||||
LPMIXERCONTROLDETAILS MixDetails;
|
||||
HANDLE hMixer = NULL;
|
||||
|
||||
MixLine = (LPMIXERLINEW)Parameter;
|
||||
MixControls = (LPMIXERLINECONTROLSW)Parameter;
|
||||
|
@ -624,19 +630,23 @@ WdmAudQueryMixerInfoByMMixer(
|
|||
|
||||
/* FIXME param checks */
|
||||
|
||||
if (SoundDeviceInstance)
|
||||
{
|
||||
hMixer = SoundDeviceInstance->Handle;
|
||||
}
|
||||
|
||||
switch(uMsg)
|
||||
{
|
||||
case MXDM_GETLINEINFO:
|
||||
return WdmAudGetLineInfo(SoundDeviceInstance->Handle, MixLine, Flags);
|
||||
return WdmAudGetLineInfo(hMixer, MixerId, MixLine, Flags);
|
||||
case MXDM_GETLINECONTROLS:
|
||||
return WdmAudGetLineControls(SoundDeviceInstance->Handle, MixControls, Flags);
|
||||
return WdmAudGetLineControls(hMixer, MixerId, MixControls, Flags);
|
||||
case MXDM_SETCONTROLDETAILS:
|
||||
return WdmAudSetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
|
||||
break;
|
||||
return WdmAudSetControlDetails(hMixer, MixerId, MixDetails, Flags);
|
||||
case MXDM_GETCONTROLDETAILS:
|
||||
return WdmAudGetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
|
||||
break;
|
||||
return WdmAudGetControlDetails(hMixer, MixerId, MixDetails, Flags);
|
||||
default:
|
||||
DPRINT1("MixerId %lu, uMsg %lu, Parameter %p, Flags %lu\n", MixerId, uMsg, Parameter, Flags);
|
||||
SND_ASSERT(0);
|
||||
return MMSYSERR_NOTSUPPORTED;
|
||||
}
|
||||
|
|
|
@ -69,24 +69,28 @@ WdmAudCloseSoundDeviceByMMixer(
|
|||
MMRESULT
|
||||
WdmAudGetLineInfo(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERLINEW MixLine,
|
||||
IN ULONG Flags);
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetLineControls(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERLINECONTROLSW MixControls,
|
||||
IN ULONG Flags);
|
||||
|
||||
MMRESULT
|
||||
WdmAudSetControlDetails(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||
IN ULONG Flags);
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetControlDetails(
|
||||
IN HANDLE hMixer,
|
||||
IN DWORD MixerId,
|
||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||
IN ULONG Flags);
|
||||
|
||||
|
@ -115,6 +119,7 @@ WdmAudSetMixerDeviceFormatByMMixer(
|
|||
MMRESULT
|
||||
WdmAudQueryMixerInfoByMMixer(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN DWORD MixerId,
|
||||
IN UINT uMsg,
|
||||
IN LPVOID Parameter,
|
||||
IN DWORD Flags);
|
||||
|
@ -146,87 +151,4 @@ WdmAudCommitWaveBufferByMMixer(
|
|||
MMRESULT
|
||||
WdmAudCleanupByMMixer();
|
||||
|
||||
/* legacy.c */
|
||||
|
||||
MMRESULT
|
||||
WdmAudCleanupByLegacy();
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetCapabilitiesByLegacy(
|
||||
IN PSOUND_DEVICE SoundDevice,
|
||||
IN DWORD DeviceId,
|
||||
OUT PVOID Capabilities,
|
||||
IN DWORD CapabilitiesSize);
|
||||
|
||||
MMRESULT
|
||||
WdmAudOpenSoundDeviceByLegacy();
|
||||
|
||||
MMRESULT
|
||||
WdmAudCloseSoundDeviceByLegacy(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN PVOID Handle);
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetDeviceInterfaceStringByLegacy(
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN DWORD DeviceId,
|
||||
IN LPWSTR Interface,
|
||||
IN DWORD InterfaceLength,
|
||||
OUT DWORD * InterfaceSize);
|
||||
|
||||
MMRESULT
|
||||
WdmAudSetMixerDeviceFormatByLegacy(
|
||||
IN PSOUND_DEVICE_INSTANCE Instance,
|
||||
IN DWORD DeviceId,
|
||||
IN PWAVEFORMATEX WaveFormat,
|
||||
IN DWORD WaveFormatSize);
|
||||
|
||||
MMRESULT
|
||||
WdmAudQueryMixerInfoByLegacy(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN UINT uMsg,
|
||||
IN LPVOID Parameter,
|
||||
IN DWORD Flags);
|
||||
|
||||
MMRESULT
|
||||
WdmAudSetWaveDeviceFormatByLegacy(
|
||||
IN PSOUND_DEVICE_INSTANCE Instance,
|
||||
IN DWORD DeviceId,
|
||||
IN PWAVEFORMATEX WaveFormat,
|
||||
IN DWORD WaveFormatSize);
|
||||
|
||||
MMRESULT
|
||||
WdmAudSetWaveStateByLegacy(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN BOOL bStart);
|
||||
|
||||
MMRESULT
|
||||
WdmAudResetStreamByLegacy(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN BOOLEAN bStartReset);
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetWavePositionByLegacy(
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN MMTIME* Time);
|
||||
|
||||
MMRESULT
|
||||
WriteFileEx_Committer2(
|
||||
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
|
||||
IN PVOID OffsetPtr,
|
||||
IN DWORD Length,
|
||||
IN PSOUND_OVERLAPPED Overlap,
|
||||
IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
|
||||
|
||||
MMRESULT
|
||||
WdmAudGetNumWdmDevsByLegacy(
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
OUT DWORD* DeviceCount);
|
||||
|
||||
DWORD
|
||||
WINAPI
|
||||
MixerEventThreadRoutine(
|
||||
LPVOID Parameter);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
{ \
|
||||
if ( ! (parameter_condition) ) \
|
||||
{ \
|
||||
SND_ERR(L"FAILED parameter check: %hS\n", #parameter_condition); \
|
||||
SND_ERR(L"FAILED parameter check: %hS at File %S Line %lu\n", #parameter_condition, __FILE__, __LINE__); \
|
||||
return MMSYSERR_INVALPARAM; \
|
||||
} \
|
||||
}
|
||||
|
@ -199,11 +199,11 @@ typedef MMRESULT (*WAVE_COMMIT_FUNC)(
|
|||
|
||||
typedef MMRESULT (*MMMIXERQUERY_FUNC) (
|
||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||
IN DWORD DeviceId,
|
||||
IN UINT uMsg,
|
||||
IN LPVOID Parameter,
|
||||
IN DWORD Flags);
|
||||
|
||||
|
||||
typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
|
||||
IN struct _SOUND_DEVICE* Device,
|
||||
IN PWAVEFORMATEX WaveFormat,
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
MMRESULT
|
||||
MmeGetLineInfo(
|
||||
IN UINT DeviceId,
|
||||
IN UINT Message,
|
||||
IN DWORD_PTR PrivateHandle,
|
||||
IN DWORD_PTR Parameter1,
|
||||
|
@ -32,6 +33,21 @@ MmeGetLineInfo(
|
|||
|
||||
//SND_TRACE(L"Getting mixer info %u\n", Message);
|
||||
|
||||
if ( PrivateHandle == 0 )
|
||||
{
|
||||
Result = GetSoundDevice(MIXER_DEVICE_TYPE, DeviceId, &SoundDevice);
|
||||
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
Result = FunctionTable->QueryMixerInfo(NULL, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
|
||||
return Result;
|
||||
}
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( PrivateHandle );
|
||||
SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
|
||||
|
||||
|
@ -46,7 +62,7 @@ MmeGetLineInfo(
|
|||
if ( ! FunctionTable->QueryMixerInfo )
|
||||
return MMSYSERR_NOTSUPPORTED;
|
||||
|
||||
Result = FunctionTable->QueryMixerInfo(SoundDeviceInstance, Message, (LPVOID)Parameter1, Parameter2);
|
||||
Result = FunctionTable->QueryMixerInfo(SoundDeviceInstance, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
@ -100,7 +116,7 @@ mxdMessage(
|
|||
(LPWAVEOPENDESC) Parameter1, /* unused */
|
||||
Parameter2,
|
||||
(DWORD*) PrivateHandle);
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER(*(DWORD_PTR*)PrivateHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -113,7 +129,8 @@ mxdMessage(
|
|||
|
||||
case MXDM_GETCONTROLDETAILS :
|
||||
{
|
||||
Result = MmeGetLineInfo(Message,
|
||||
Result = MmeGetLineInfo(DeviceId,
|
||||
Message,
|
||||
PrivateHandle,
|
||||
Parameter1,
|
||||
Parameter2);
|
||||
|
@ -123,7 +140,8 @@ mxdMessage(
|
|||
|
||||
case MXDM_SETCONTROLDETAILS :
|
||||
{
|
||||
Result = MmeGetLineInfo(Message,
|
||||
Result = MmeGetLineInfo(DeviceId,
|
||||
Message,
|
||||
PrivateHandle,
|
||||
Parameter1,
|
||||
Parameter2);
|
||||
|
@ -133,7 +151,8 @@ mxdMessage(
|
|||
|
||||
case MXDM_GETLINECONTROLS :
|
||||
{
|
||||
Result = MmeGetLineInfo(Message,
|
||||
Result = MmeGetLineInfo(DeviceId,
|
||||
Message,
|
||||
PrivateHandle,
|
||||
Parameter1,
|
||||
Parameter2);
|
||||
|
@ -143,7 +162,8 @@ mxdMessage(
|
|||
|
||||
case MXDM_GETLINEINFO :
|
||||
{
|
||||
Result = MmeGetLineInfo(Message,
|
||||
Result = MmeGetLineInfo(DeviceId,
|
||||
Message,
|
||||
PrivateHandle,
|
||||
Parameter1,
|
||||
Parameter2);
|
||||
|
|
|
@ -89,7 +89,7 @@ MMixerOpen(
|
|||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
DPRINT1("invalid context\n");
|
||||
DPRINT1("invalid context\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ MMixerOpen(
|
|||
if (!MixerInfo)
|
||||
{
|
||||
/* invalid mixer id */
|
||||
DPRINT1("invalid mixer id %lu\n", MixerId);
|
||||
DPRINT1("invalid mixer id %lu\n", MixerId);
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
@ -115,8 +115,9 @@ MMixerOpen(
|
|||
MIXER_STATUS
|
||||
MMixerGetLineInfo(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINEW MixerLine)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
@ -131,6 +132,17 @@ MMixerGetLineInfo(
|
|||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
|
||||
{
|
||||
/* caller passed mixer id */
|
||||
MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
|
||||
|
||||
if (!MixerHandle)
|
||||
{
|
||||
/* invalid parameter */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* clear hmixer from flags */
|
||||
Flags &=~MIXER_OBJECTF_HMIXER;
|
||||
|
@ -220,6 +232,7 @@ MIXER_STATUS
|
|||
MMixerGetLineControls(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINECONTROLSW MixerLineControls)
|
||||
{
|
||||
|
@ -238,6 +251,18 @@ MMixerGetLineControls(
|
|||
return Status;
|
||||
}
|
||||
|
||||
if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
|
||||
{
|
||||
/* caller passed mixer id */
|
||||
MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
|
||||
|
||||
if (!MixerHandle)
|
||||
{
|
||||
/* invalid parameter */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
Flags &= ~MIXER_OBJECTF_HMIXER;
|
||||
|
||||
if (Flags == MIXER_GETLINECONTROLSF_ALL)
|
||||
|
@ -312,6 +337,7 @@ MIXER_STATUS
|
|||
MMixerSetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
|
||||
{
|
||||
|
@ -330,6 +356,18 @@ MMixerSetControlDetails(
|
|||
return Status;
|
||||
}
|
||||
|
||||
if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
|
||||
{
|
||||
/* caller passed mixer id */
|
||||
MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
|
||||
|
||||
if (!MixerHandle)
|
||||
{
|
||||
/* invalid parameter */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* get mixer info */
|
||||
MixerInfo = (LPMIXER_INFO)MixerHandle;
|
||||
|
||||
|
@ -362,6 +400,7 @@ MIXER_STATUS
|
|||
MMixerGetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
|
||||
{
|
||||
|
@ -380,6 +419,18 @@ MMixerGetControlDetails(
|
|||
return Status;
|
||||
}
|
||||
|
||||
if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
|
||||
{
|
||||
/* caller passed mixer id */
|
||||
MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
|
||||
|
||||
if (!MixerHandle)
|
||||
{
|
||||
/* invalid parameter */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* get mixer info */
|
||||
MixerInfo = (LPMIXER_INFO)MixerHandle;
|
||||
|
||||
|
|
|
@ -149,7 +149,8 @@ MMixerOpen(
|
|||
MIXER_STATUS
|
||||
MMixerGetLineInfo(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINEW MixerLine);
|
||||
|
||||
|
@ -157,6 +158,7 @@ MIXER_STATUS
|
|||
MMixerGetLineControls(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINECONTROLSW MixerLineControls);
|
||||
|
||||
|
@ -164,6 +166,7 @@ MIXER_STATUS
|
|||
MMixerSetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails);
|
||||
|
||||
|
@ -171,6 +174,7 @@ MIXER_STATUS
|
|||
MMixerGetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG MixerId,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue