Andrew Eikum : winmm: Accept open handles in wave{In,Out}GetDevCaps.
Module: wine Branch: master Commit: ae13a279e1994268638caae7043e08076facc1a2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=ae13a279e1994268638caae70... Author: Andrew Eikum <aeikum(a)codeweavers.com> Date: Fri May 8 08:45:57 2020 -0500 winmm: Accept open handles in wave{In,Out}GetDevCaps. Based on a patch by Changping Yu <dead.ash(a)hotmail.com>. Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winmm/waveform.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index b08768577b..39461743c4 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -2669,10 +2669,18 @@ UINT WINAPI waveOutGetDevCapsW(UINT_PTR uDeviceID, LPWAVEOUTCAPSW lpCaps, caps = &mapper_caps; }else{ - if(uDeviceID >= g_outmmdevices_count) - return MMSYSERR_BADDEVICEID; + if(uDeviceID >= g_outmmdevices_count){ + WINMM_Device *device = WINMM_GetDeviceFromHWAVE((HWAVE)uDeviceID); + + if(!WINMM_ValidateAndLock(device)) + return MMSYSERR_BADDEVICEID; + + caps = &device->parent->out_caps; - caps = &read_map(g_out_map, uDeviceID)->out_caps; + LeaveCriticalSection(&device->lock); + }else{ + caps = &read_map(g_out_map, uDeviceID)->out_caps; + } } memcpy(lpCaps, caps, min(uSize, sizeof(*lpCaps))); @@ -3336,10 +3344,18 @@ UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSi caps = &mapper_caps; }else{ - if(uDeviceID >= g_inmmdevices_count) - return MMSYSERR_BADDEVICEID; + if(uDeviceID >= g_inmmdevices_count){ + WINMM_Device *device = WINMM_GetDeviceFromHWAVE((HWAVE)uDeviceID); + + if(!WINMM_ValidateAndLock(device)) + return MMSYSERR_BADDEVICEID; + + caps = &device->parent->in_caps; - caps = &read_map(g_in_map, uDeviceID)->in_caps; + LeaveCriticalSection(&device->lock); + }else{ + caps = &read_map(g_in_map, uDeviceID)->in_caps; + } } memcpy(lpCaps, caps, min(uSize, sizeof(*lpCaps)));
participants (1)
-
Alexandre Julliard