Jörg Höhle : winmm: DriverCallback returns TRUE iff there is notification.
Alexandre Julliard
julliard at winehq.org
Mon Apr 11 13:29:30 CDT 2011
Module: wine
Branch: master
Commit: a174713f82e7cdbf833257aeb23d6ef68ef0dbec
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a174713f82e7cdbf833257aeb23d6ef68ef0dbec
Author: Jörg Höhle <Joerg-Cyril.Hoehle at t-systems.com>
Date: Mon Apr 11 14:57:30 2011 +0200
winmm: DriverCallback returns TRUE iff there is notification.
---
dlls/winmm/driver.c | 25 ++++++++++++++++---------
dlls/winmm/tests/midi.c | 13 +++++++++++++
2 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/dlls/winmm/driver.c b/dlls/winmm/driver.c
index 8620fe6..feecc92 100644
--- a/dlls/winmm/driver.c
+++ b/dlls/winmm/driver.c
@@ -129,7 +129,7 @@ LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr)
static inline LRESULT DRIVER_SendMessage(LPWINE_DRIVER lpDrv, UINT msg,
LPARAM lParam1, LPARAM lParam2)
{
- LRESULT ret = 0;
+ LRESULT ret;
TRACE("Before call32 proc=%p drvrID=%08lx hDrv=%p wMsg=%04x p1=%08lx p2=%08lx\n",
lpDrv->lpDrvProc, lpDrv->dwDriverID, lpDrv, msg, lParam1, lParam2);
@@ -552,24 +552,28 @@ BOOL WINAPI DriverCallback(DWORD_PTR dwCallBack, DWORD uFlags, HDRVR hDev,
DWORD wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1,
DWORD_PTR dwParam2)
{
+ BOOL ret = FALSE;
TRACE("(%08lX, %s %04X, %p, %04X, %08lX, %08lX, %08lX)\n",
dwCallBack, DRIVER_getCallback(uFlags), uFlags, hDev, wMsg, dwUser, dwParam1, dwParam2);
+ if (!dwCallBack)
+ return ret;
switch (uFlags & DCB_TYPEMASK) {
case DCB_NULL:
- break;
+ /* Native returns FALSE = no notification, not TRUE */
+ return ret;
case DCB_WINDOW:
- PostMessageA((HWND)dwCallBack, wMsg, (WPARAM)hDev, dwParam1);
+ ret = PostMessageA((HWND)dwCallBack, wMsg, (WPARAM)hDev, dwParam1);
break;
case DCB_TASK: /* aka DCB_THREAD */
- PostThreadMessageA(dwCallBack, wMsg, (WPARAM)hDev, dwParam1);
+ ret = PostThreadMessageA(dwCallBack, wMsg, (WPARAM)hDev, dwParam1);
break;
case DCB_FUNCTION:
- if (dwCallBack)
- ((LPDRVCALLBACK)dwCallBack)(hDev, wMsg, dwUser, dwParam1, dwParam2);
+ ((LPDRVCALLBACK)dwCallBack)(hDev, wMsg, dwUser, dwParam1, dwParam2);
+ ret = TRUE;
break;
case DCB_EVENT:
- SetEvent((HANDLE)dwCallBack);
+ ret = SetEvent((HANDLE)dwCallBack);
break;
#if 0
/* FIXME: for now only usable in mmsystem.dll16
@@ -601,8 +605,11 @@ BOOL WINAPI DriverCallback(DWORD_PTR dwCallBack, DWORD uFlags, HDRVR hDev,
WARN("Unknown callback type %d\n", uFlags & DCB_TYPEMASK);
return FALSE;
}
- TRACE("Done\n");
- return TRUE;
+ if (ret)
+ TRACE("Done\n");
+ else
+ WARN("Notification failure\n");
+ return ret;
}
/******************************************************************
diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
index e40e1d7..f02c4f0 100644
--- a/dlls/winmm/tests/midi.c
+++ b/dlls/winmm/tests/midi.c
@@ -325,6 +325,19 @@ static void test_midiOut_device(UINT udev, HWND hwnd)
rc = midiOutClose(hm);
ok(!rc, "midiOutClose rc=%s\n", mmsys_error(rc));
test_notification(hwnd, "midiOutClose", MOM_CLOSE, 0);
+
+ rc = midiOutOpen(&hm, udev, 0, (DWORD_PTR)MYCBINST, CALLBACK_WINDOW);
+ ok(!rc, "midiOutOpen(dev=%d) 0 CALLBACK_WINDOW rc=%s\n", udev, mmsys_error(rc));
+ /* PostMessage(hwnd=0) redirects to PostThreadMessage(GetCurrentThreadId())
+ * which PeekMessage((HWND)-1) queries. */
+ test_notification((HWND)-1, "midiOutOpen WINDOW->THREAD", 0, WHATEVER);
+ test_notification(hwnd, "midiOutOpen WINDOW", 0, WHATEVER);
+ if (!rc) {
+ rc = midiOutClose(hm);
+ ok(!rc, "midiOutClose rc=%s\n", mmsys_error(rc));
+ test_notification((HWND)-1, "midiOutClose WINDOW->THREAD", 0, WHATEVER);
+ test_notification(hwnd, "midiOutClose", 0, WHATEVER);
+ }
test_notification(hwnd, "midiOut over", 0, WHATEVER);
}
More information about the wine-cvs
mailing list