Jörg Höhle : midimap: Implement callback/ notification.
Alexandre Julliard
julliard at winehq.org
Thu Feb 11 11:08:31 CST 2010
Module: wine
Branch: master
Commit: a8b80787047a87b62355b8524d68979ae19a2adb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8b80787047a87b62355b8524d68979ae19a2adb
Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date: Wed Feb 10 19:42:15 2010 +0100
midimap: Implement callback/notification.
---
dlls/midimap/midimap.c | 24 +++++++++++++++++++-----
dlls/winmm/tests/midi.c | 6 ------
2 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/dlls/midimap/midimap.c b/dlls/midimap/midimap.c
index 24fc645..77b8596 100644
--- a/dlls/midimap/midimap.c
+++ b/dlls/midimap/midimap.c
@@ -92,6 +92,8 @@ typedef struct tagMIDIMAPDATA
{
struct tagMIDIMAPDATA* self;
MIDIOUTPORT* ChannelMap[16];
+ MIDIOPENDESC midiDesc;
+ WORD wCbFlags;
} MIDIMAPDATA;
static MIDIOUTPORT* midiOutPorts;
@@ -258,6 +260,13 @@ static BOOL MIDIMAP_LoadSettings(MIDIMAPDATA* mom)
return ret;
}
+static void MIDIMAP_NotifyClient(MIDIMAPDATA* mom, WORD wMsg,
+ DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+{
+ DriverCallback(mom->midiDesc.dwCallback, mom->wCbFlags, (HDRVR)mom->midiDesc.hMidi,
+ wMsg, mom->midiDesc.dwInstance, dwParam1, dwParam2);
+}
+
static DWORD modOpen(DWORD_PTR *lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
{
MIDIMAPDATA* mom = HeapAlloc(GetProcessHeap(), 0, sizeof(MIDIMAPDATA));
@@ -265,11 +274,9 @@ static DWORD modOpen(DWORD_PTR *lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
TRACE("(%p %p %08x)\n", lpdwUser, lpDesc, dwFlags);
if (!mom) return MMSYSERR_NOMEM;
-
- if (HIWORD(dwFlags & CALLBACK_TYPEMASK)) {
- FIXME("NIY callback flags %08x\n", dwFlags);
+ if (!lpDesc) {
HeapFree(GetProcessHeap(), 0, mom);
- return MMSYSERR_INVALFLAG;
+ return MMSYSERR_INVALPARAM;
}
if (MIDIMAP_LoadSettings(mom))
@@ -277,6 +284,10 @@ static DWORD modOpen(DWORD_PTR *lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
*lpdwUser = (DWORD_PTR)mom;
mom->self = mom;
+ mom->wCbFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+ mom->midiDesc = *lpDesc;
+ MIDIMAP_NotifyClient(mom, MOM_OPEN, 0L, 0L);
+
return MMSYSERR_NOERROR;
}
HeapFree(GetProcessHeap(), 0, mom);
@@ -305,8 +316,10 @@ static DWORD modClose(MIDIMAPDATA* mom)
ret = t;
}
}
- if (ret == MMSYSERR_NOERROR)
+ if (ret == MMSYSERR_NOERROR) {
+ MIDIMAP_NotifyClient(mom, MOM_CLOSE, 0L, 0L);
HeapFree(GetProcessHeap(), 0, mom);
+ }
return ret;
}
@@ -342,6 +355,7 @@ static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwPara
}
lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
lpMidiHdr->dwFlags |= MHDR_DONE;
+ MIDIMAP_NotifyClient(mom, MOM_DONE, (DWORD_PTR)lpMidiHdr, 0L);
return ret;
}
diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
index 82d61d1..a94ea28 100644
--- a/dlls/winmm/tests/midi.c
+++ b/dlls/winmm/tests/midi.c
@@ -203,9 +203,6 @@ static void test_midiOut_device(UINT udev, HWND hwnd)
rc = midiOutOpen(&hm, udev, (DWORD_PTR)hwnd, (DWORD_PTR)MYCBINST, CALLBACK_WINDOW);
else
rc = midiOutOpen(&hm, udev, (DWORD_PTR)callback_func, (DWORD_PTR)MYCBINST, CALLBACK_FUNCTION);
- if (MIDIMAPPER==udev) todo_wine
- ok(!rc, "midiOutOpen(dev=%d) rc=%s\n", udev, mmsys_error(rc));
- else
ok(!rc, "midiOutOpen(dev=%d) rc=%s\n", udev, mmsys_error(rc));
if (rc) return;
@@ -316,9 +313,6 @@ static void test_midiStream(UINT udev, HWND hwnd)
rc = midiStreamOpen(&hm, &udev, 1, (DWORD_PTR)hwnd, (DWORD_PTR)MYCBINST, CALLBACK_WINDOW);
else
rc = midiStreamOpen(&hm, &udev, 1, (DWORD_PTR)callback_func, (DWORD_PTR)MYCBINST, CALLBACK_FUNCTION);
- if (MIDIMAPPER==udev) todo_wine
- ok(!rc, "midiStreamOpen(dev=%d) rc=%s\n", udev, mmsys_error(rc));
- else
ok(!rc, "midiStreamOpen(dev=%d) rc=%s\n", udev, mmsys_error(rc));
if (rc) return;
More information about the wine-cvs
mailing list