[ros-kernel] mmTaskCreate patch - For you sound junkys

Filip Navara xnavara at volny.cz
Wed Jul 14 23:40:16 CEST 2004


Eric Pouech wrote:

> Filip but you still leak it if you don't succeed in creating the thread

That's true! Thanks for pointing that out.

- Filip
-------------- next part --------------
Index: include/mmddk.h
===================================================================
--- include/mmddk.h	(revision 1)
+++ include/mmddk.h	(working copy)
@@ -449,6 +449,16 @@
 BOOL		 	WINAPI	DriverCallback(DWORD dwCallBack, UINT uFlags, HDRVR hDev,
 					       UINT wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
 
+typedef void (*LPTASKCALLBACK)(DWORD dwInst);
+
+#define TASKERR_NOTASKSUPPORT 1
+#define TASKERR_OUTOFMEMORY   2
+MMRESULT WINAPI mmTaskCreate(LPTASKCALLBACK, HANDLE*, DWORD);
+void     WINAPI mmTaskBlock(HANDLE);
+BOOL     WINAPI mmTaskSignal(HANDLE);
+void     WINAPI mmTaskYield(void);
+HANDLE   WINAPI mmGetCurrentTask(void);
+
 #ifdef __WINESRC__
 #define  WAVE_DIRECTSOUND               0x0080
 #endif
Index: winmm/winmm.spec
===================================================================
--- winmm/winmm.spec	(revision 1)
+++ winmm/winmm.spec	(working copy)
@@ -135,6 +135,7 @@
 @ stdcall mmioStringToFOURCCW(wstr long)
 @ stdcall mmioWrite(long ptr long)
 @ stdcall mmsystemGetVersion()
+@ stdcall mmTaskCreate(ptr ptr long)
 @ stdcall sndPlaySoundA(ptr long)
 @ stdcall sndPlaySoundW(ptr long)
 @ stdcall timeBeginPeriod(long)
Index: winmm/winmm.c
===================================================================
--- winmm/winmm.c	(revision 1)
+++ winmm/winmm.c	(working copy)
@@ -102,8 +102,9 @@
 	 * inside WINMM_IData */
         CloseHandle(WINMM_IData->psStopEvent);
         CloseHandle(WINMM_IData->psLastEvent);
+        WINMM_IData->cs.DebugInfo = NULL;
         DeleteCriticalSection(&WINMM_IData->cs);
-	HeapFree(GetProcessHeap(), 0, WINMM_IData);
+        HeapFree(GetProcessHeap(), 0, WINMM_IData);
         WINMM_IData = NULL;
     }
 }
@@ -3176,3 +3177,45 @@
 
     return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE);
 }
+
+struct mm_starter
+{
+    LPTASKCALLBACK      cb;
+    DWORD               client;
+    HANDLE              event;
+};
+
+DWORD WINAPI mmTaskRun(void* pmt)
+{
+    struct mm_starter mms;
+
+    memcpy(&mms, pmt, sizeof(struct mm_starter));
+    HeapFree(GetProcessHeap(), 0, pmt);
+    mms.cb(mms.client);
+    if (mms.event) SetEvent(mms.event);
+    return 0;
+}
+
+MMRESULT WINAPI mmTaskCreate(LPTASKCALLBACK cb, HANDLE* ph, DWORD client)
+{
+    HANDLE               hThread;
+    HANDLE               hEvent;
+    struct mm_starter   *mms;
+
+    mms = HeapAlloc(GetProcessHeap(), 0, sizeof(struct mm_starter));
+    if (mms == NULL) { return TASKERR_OUTOFMEMORY; }
+
+    mms->cb = cb;
+    mms->client = client;
+    if (ph) {
+        mms->event = hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    } else {
+        mms->event = NULL;
+    }
+
+    hThread = CreateThread(0, 0, mmTaskRun, (LPVOID)&mms, 0, NULL);
+    if (!hThread) { CloseHandle(hEvent); return TASKERR_OUTOFMEMORY; }
+    if (ph) *ph = hEvent;
+    CloseHandle(hThread);
+    return 0;
+}


More information about the Ros-kernel mailing list