From 6cee9e1837bb8b10e99444678fa556dd67085de6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 3 Dec 2010 16:49:33 +0000 Subject: [PATCH] [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 --- dll/win32/wdmaud.drv/mmixer.c | 32 ++++--- dll/win32/wdmaud.drv/wdmaud.h | 88 ++----------------- include/reactos/libs/sound/mmebuddy.h | 4 +- lib/drivers/sound/mmebuddy/mixer/mxdMessage.c | 32 +++++-- lib/drivers/sound/mmixer/mixer.c | 59 ++++++++++++- lib/drivers/sound/mmixer/mmixer.h | 6 +- 6 files changed, 114 insertions(+), 107 deletions(-) diff --git a/dll/win32/wdmaud.drv/mmixer.c b/dll/win32/wdmaud.drv/mmixer.c index 9caa8c9dd96..764c33bea66 100644 --- a/dll/win32/wdmaud.drv/mmixer.c +++ b/dll/win32/wdmaud.drv/mmixer.c @@ -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; } diff --git a/dll/win32/wdmaud.drv/wdmaud.h b/dll/win32/wdmaud.drv/wdmaud.h index 2dda68f7f51..49cd74ea6e2 100644 --- a/dll/win32/wdmaud.drv/wdmaud.h +++ b/dll/win32/wdmaud.drv/wdmaud.h @@ -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 diff --git a/include/reactos/libs/sound/mmebuddy.h b/include/reactos/libs/sound/mmebuddy.h index 1a2a5431242..1cc7f52db4f 100644 --- a/include/reactos/libs/sound/mmebuddy.h +++ b/include/reactos/libs/sound/mmebuddy.h @@ -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, diff --git a/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c b/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c index 08815ba8eee..7652d9ef7ea 100644 --- a/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c +++ b/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c @@ -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); diff --git a/lib/drivers/sound/mmixer/mixer.c b/lib/drivers/sound/mmixer/mixer.c index b4b7dcfad2c..c216110ddfb 100644 --- a/lib/drivers/sound/mmixer/mixer.c +++ b/lib/drivers/sound/mmixer/mixer.c @@ -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; diff --git a/lib/drivers/sound/mmixer/mmixer.h b/lib/drivers/sound/mmixer/mmixer.h index 846d4e9d83b..96497062c43 100644 --- a/lib/drivers/sound/mmixer/mmixer.h +++ b/lib/drivers/sound/mmixer/mmixer.h @@ -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); -- 2.17.1