From 016e6a3f65a0ebe84e1ee0e8e80c675bc8d7d775 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Jul 2004 20:24:59 +0000 Subject: [PATCH] - Implementation of mmTaskCreate. Based on patch by Eric Pouech. svn path=/trunk/; revision=10146 --- reactos/include/mmddk.h | 10 ++++++++ reactos/lib/winmm/winmm.c | 49 +++++++++++++++++++++++++++++++++++- reactos/lib/winmm/winmm.spec | 1 + 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/reactos/include/mmddk.h b/reactos/include/mmddk.h index 15ef1ad763e..29f7b7cba0f 100644 --- a/reactos/include/mmddk.h +++ b/reactos/include/mmddk.h @@ -449,6 +449,16 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable); 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 diff --git a/reactos/lib/winmm/winmm.c b/reactos/lib/winmm/winmm.c index 575f5105493..3df138046e3 100644 --- a/reactos/lib/winmm/winmm.c +++ b/reactos/lib/winmm/winmm.c @@ -102,8 +102,9 @@ static void WINMM_DeleteIData(void) * 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,49 @@ UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, 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) { + HeapFree(GetProcessHeap(), 0, mms); + CloseHandle(hEvent); + return TASKERR_OUTOFMEMORY; + } + if (ph) *ph = hEvent; + CloseHandle(hThread); + return 0; +} diff --git a/reactos/lib/winmm/winmm.spec b/reactos/lib/winmm/winmm.spec index dc13c46b537..7dd06bced9a 100644 --- a/reactos/lib/winmm/winmm.spec +++ b/reactos/lib/winmm/winmm.spec @@ -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)