[PATCH 3/6] winmm: DriverCallback returns FALSE upon failure to deliver message.
Joerg-Cyril.Hoehle at t-systems.com
Joerg-Cyril.Hoehle at t-systems.com
Wed Mar 30 05:44:24 CDT 2011
...says MSDN
Realizing that winmm hijacks the app's thread to play audio implied
that calling DriverCallback from a user thread is normal business. So I
could easily test its behaviour. My tests are appended.
OTOH, calling DriverCallback like below is still abnormal, because it's
not from within the context of a wod/modMessage dispatch. winmm's
internal data structures may not be prepared. Therefore I don't want
these tests integrated into winmm/tests/. Invoking DriverCallback
directly was good enough for one-time exploratory testing with testbot.
Regards,
Jörg Höhle
in winmm/tests/midi.c replace:
static void test_midi_open(HWND hwnd)
{
HMIDIOUT hm;
DWORD rc;
UINT udev = 0;
HANDLE hevent = CreateEvent(NULL,FALSE,FALSE,NULL);
MIDIHDR mhdr;
ok(hevent != NULL, "CreateEvent %d\n", GetLastError());
if (!hevent) return;
trace("Test open and DriverCallback\n");
rc = midiOutOpen(&hm, udev, (DWORD_PTR)hevent, (DWORD_PTR)MYCBINST, CALLBACK_EVENT);
ok(!rc, "midiOutOpen rc=%s\n", udev, mmsys_error(rc));
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_OBJECT_0, "Wait OPEN rc=%8x %d\n", rc, GetLastError());
rc = ResetEvent(hevent);
ok(rc, "ResetEvent %d\n", GetLastError());
rc = DriverCallback((DWORD_PTR)hevent, DCB_EVENT, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(rc, "DriverCallback EVENT %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_OBJECT_0, "Wait DC rc=%8x %d\n", rc, GetLastError());
rc = ResetEvent(hevent);
ok(rc, "ResetEvent %d\n", GetLastError());
rc = DriverCallback((DWORD_PTR)0, DCB_EVENT, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(!rc, "DriverCallback 0 EVENT %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
rc = ResetEvent(hevent);
ok(rc, "ResetEvent %d\n", GetLastError());
rc = DriverCallback((DWORD_PTR)INVALID_HANDLE_VALUE, DCB_EVENT, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(rc, "DriverCallback INVALID EVENT %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
rc = ResetEvent(hevent);
ok(rc, "ResetEvent %d\n", GetLastError());
test_notification(hwnd, "DriverCallback EVENT", 0, (DWORD_PTR)&mhdr);
test_notification(0, "DriverCallback EVENT->THREAD", 0, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)hwnd, DCB_WINDOW, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(rc, "DriverCallback WINDOW %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(hwnd, "DriverCallback WINDOW", MOM_DONE, (DWORD_PTR)&mhdr);
test_notification(0, "DriverCallback WINDOW->THREAD", 0, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)0, DCB_WINDOW, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(!rc, "DriverCallback 0 WINDOW %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(hwnd, "DriverCallback WINDOW", 0, (DWORD_PTR)&mhdr);
test_notification(0, "DriverCallback WINDOW->THREAD", 0, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)HWND_BROADCAST, DCB_WINDOW, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(rc, "DriverCallback BROADCAST WINDOW %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(hwnd, "DriverCallback WINDOW", MOM_DONE, (DWORD_PTR)&mhdr);
test_notification(0, "DriverCallback WINDOW->THREAD", 0, (DWORD_PTR)&mhdr);
/* I'd have expected DCB_NULL to always succeed. */
rc = DriverCallback((DWORD_PTR)callback_func, DCB_NULL, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(!rc, "DriverCallback fn NULL %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(0, "DriverCallback NULL", 0, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)0, DCB_NULL, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(!rc, "DriverCallback 0 NULL %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(0, "DriverCallback NULL", 0, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)callback_func, DCB_FUNCTION, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(rc, "DriverCallback fn FUNCTION %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
test_notification(0, "DriverCallback FUNCTION", MOM_DONE, (DWORD_PTR)&mhdr);
rc = DriverCallback((DWORD_PTR)0, DCB_FUNCTION, hm, MOM_DONE, (DWORD_PTR)MYCBINST, (DWORD_PTR)&mhdr, 0);
ok(!rc, "DriverCallback 0 FUNCTION %d\n", rc);
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_TIMEOUT, "Wait DC rc=%8x %d\n", rc, GetLastError());
rc = ResetEvent(hevent);
ok(rc, "ResetEvent %d\n", GetLastError());
test_notification(0, "DriverCallback FUNCTION", 0, (DWORD_PTR)&mhdr);
rc = midiOutClose(hm);
ok(!rc, "midiOutClose rc=%s\n", mmsys_error(rc));
rc = WaitForSingleObject(hevent, 0);
ok(rc == WAIT_OBJECT_0, "Wait CLOSE rc=%8x %d\n", rc, GetLastError());
test_notification(hwnd, "DriverCallback window Close", 0, (DWORD_PTR)&mhdr);
test_notification(0, "DriverCallback Close", 0, (DWORD_PTR)&mhdr);
CloseHandle(hevent);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-winmm-DriverCallback-returns-FALSE-upon-failure-to.patch
Type: application/octet-stream
Size: 2719 bytes
Desc: 0003-winmm-DriverCallback-returns-FALSE-upon-failure-to.patch
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20110330/b8c76bd3/attachment.obj>
More information about the wine-patches
mailing list