- Implementation of mmTaskCreate. Based on patch by Eric Pouech.

svn path=/trunk/; revision=10146
This commit is contained in:
Filip Navara 2004-07-16 20:24:59 +00:00
parent f82a992ec2
commit 016e6a3f65
3 changed files with 59 additions and 1 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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)