Module: wine Branch: master Commit: 35a8ee9340ea1e92ffb6313fad6b406a111e209f URL: http://source.winehq.org/git/wine.git/?a=commit;h=35a8ee9340ea1e92ffb6313fad...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Fri Apr 13 18:34:35 2007 +0200
winmm: Implement CALLBACK_WINDOW.
---
dlls/winmm/tests/mixer.c | 23 ++++++++++++++++++++++- dlls/winmm/winmm.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/dlls/winmm/tests/mixer.c b/dlls/winmm/tests/mixer.c index bf27c77..0163537 100644 --- a/dlls/winmm/tests/mixer.c +++ b/dlls/winmm/tests/mixer.c @@ -378,8 +378,18 @@ static void mixer_test_deviceA(int device)
rc=mixerOpen(&mix, device, 0, 0, 0); ok(rc==MMSYSERR_NOERROR, - "mixerOpen: MMSYSERR_BADDEVICEID expected, got %s\n",mmsys_error(rc)); + "mixerOpen: MMSYSERR_NOERROR expected, got %s\n",mmsys_error(rc)); if (rc==MMSYSERR_NOERROR) { + rc=mixerOpen(&mix, device, 0, 0, CALLBACK_FUNCTION); + ok(rc==MMSYSERR_INVALFLAG, + "mixerOpen: MMSYSERR_INVALFLAG expected, got %s\n", mmsys_error(rc)); + + /* Shouldn't open without a valid HWND */ + rc=mixerOpen(&mix, device, 0, 0, CALLBACK_WINDOW); + ok(rc==MMSYSERR_INVALPARAM, + "mixerOpen: MMSYSERR_INVALPARAM expected, got %s\n", mmsys_error(rc)); + + for (d=0;d<capsA.cDestinations;d++) { MIXERLINEA mixerlineA; mixerlineA.cbStruct = 0; @@ -757,10 +767,21 @@ static void mixer_test_deviceW(int device) szPname, capsW.vDriverVersion >> 8, capsW.vDriverVersion & 0xff,capsW.wMid,capsW.wPid); } + + rc=mixerOpen(&mix, device, 0, 0, 0); ok(rc==MMSYSERR_NOERROR, "mixerOpen: MMSYSERR_BADDEVICEID expected, got %s\n",mmsys_error(rc)); if (rc==MMSYSERR_NOERROR) { + rc=mixerOpen(&mix, device, 0, 0, CALLBACK_FUNCTION); + ok(rc==MMSYSERR_INVALFLAG, + "mixerOpen: MMSYSERR_INVALFLAG expected, got %s\n", mmsys_error(rc)); + + /* Shouldn't open without a valid HWND */ + rc=mixerOpen(&mix, device, 0, 0, CALLBACK_WINDOW); + ok(rc==MMSYSERR_INVALPARAM, + "mixerOpen: MMSYSERR_INVALPARAM expected, got %s\n", mmsys_error(rc)); + for (d=0;d<capsW.cDestinations;d++) { MIXERLINEW mixerlineW; mixerlineW.cbStruct = 0; diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index 7613277..f17ad7c 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -306,6 +306,16 @@ UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize return MMDRV_Message(wmld, MXDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); }
+static void CALLBACK MIXER_WCallback(HMIXEROBJ hmx, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam, DWORD_PTR param2) +{ + HWND hWnd = (HWND)dwInstance; + + if (!dwInstance) + return; + + PostMessageW(hWnd, MM_MIXM_CONTROL_CHANGE, (WPARAM)hmx, (LPARAM)dwParam); +} + UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32) { @@ -317,15 +327,36 @@ UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback, TRACE("(%p, %d, %08lx, %08lx, %08x)\n", lphMix, uDeviceID, dwCallback, dwInstance, fdwOpen);
+ mod.dwCallback = (DWORD_PTR)MIXER_WCallback; + mod.dwInstance = 0; + +/* If callback is a function, + * dwCallback contains function pointer + * dwInstance private data + * + * if callback is a window + * dwCallback contains a window handle + */ + switch (fdwOpen & CALLBACK_TYPEMASK) { + default: + return MMSYSERR_INVALFLAG; + + case CALLBACK_NULL: + break; + + case CALLBACK_WINDOW: + mod.dwInstance = dwCallback; + if (!IsWindow((HWND)dwCallback)) + return MMSYSERR_INVALPARAM; + break; + } + wmld = MMDRV_Alloc(sizeof(WINE_MIXER), MMDRV_MIXER, &hMix, &fdwOpen, &dwCallback, &dwInstance, bFrom32); - wmld->uDeviceID = uDeviceID; mod.hmx = (HMIXEROBJ)hMix; - mod.dwCallback = dwCallback; - mod.dwInstance = dwInstance;
- dwRet = MMDRV_Open(wmld, MXDM_OPEN, (DWORD)&mod, fdwOpen); + dwRet = MMDRV_Open(wmld, MXDM_OPEN, (DWORD)&mod, CALLBACK_FUNCTION);
if (dwRet != MMSYSERR_NOERROR) { MMDRV_Free(hMix, wmld);