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