[PATCH 2/3] winmm: DriverCallback returns TRUE iff there is notification.

Joerg-Cyril.Hoehle at t-systems.com Joerg-Cyril.Hoehle at t-systems.com
Mon Apr 11 07:57:30 CDT 2011


Hi,

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: 0002-winmm-DriverCallback-returns-TRUE-iff-there-is-noti.patch
Type: application/octet-stream
Size: 3782 bytes
Desc: 0002-winmm-DriverCallback-returns-TRUE-iff-there-is-noti.patch
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20110411/9962e26f/attachment.obj>


More information about the wine-patches mailing list