[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