SRCDIR = @srcdir@\r
VPATH = @srcdir@\r
MODULE = winmm.dll\r
+IMPORTLIB = libwinmm.$(IMPLIBEXT)\r
IMPORTS = user32 advapi32 kernel32 ntdll\r
EXTRALIBS = $(LIBUNICODE)\r
\r
{\r
LPWINE_MCIDRIVER wmd = 0;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
if (wmd->wDeviceID == wDevID)\r
break;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
return wmd;\r
}\r
\r
if (!strcmpiW(lpstrName, wszAll))\r
return MCI_ALL_DEVICE_ID;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
if (wmd->lpstrElementName && strcmpW(wmd->lpstrElementName, lpstrName) == 0) {\r
ret = wmd->wDeviceID;\r
break;\r
break;\r
}\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
return ret;\r
}\r
\r
/* well try to load id */\r
if (uDevType >= MCI_DEVTYPE_FIRST && uDevType <= MCI_DEVTYPE_LAST) {\r
- if (LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) {\r
+ if (LoadStringW(WINMM_IData.hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) {\r
str = buf;\r
}\r
} else if (uDevType == 0) {\r
}\r
uTbl = MCI_NO_COMMAND_TABLE;\r
if (str) {\r
- HRSRC hRsrc = FindResourceW(WINMM_IData->hWinMM32Instance, str, (LPCWSTR)RT_RCDATA);\r
+ HRSRC hRsrc = FindResourceW(WINMM_IData.hWinMM32Instance, str, (LPCWSTR)RT_RCDATA);\r
HANDLE hMem = 0;\r
\r
- if (hRsrc) hMem = LoadResource(WINMM_IData->hWinMM32Instance, hRsrc);\r
+ if (hRsrc) hMem = LoadResource(WINMM_IData.hWinMM32Instance, hRsrc);\r
if (hMem) {\r
uTbl = MCI_SetCommandTable(LockResource(hMem), uDevType);\r
} else {\r
WARN("No command table found in resource %p[%s]\n",\r
- WINMM_IData->hWinMM32Instance, debugstr_w(str));\r
+ WINMM_IData.hWinMM32Instance, debugstr_w(str));\r
}\r
}\r
TRACE("=> %d\n", uTbl);\r
if (wmd->dwPrivate != 0)\r
WARN("Unloading mci driver with non nul dwPrivate field\n");\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (tmp = &WINMM_IData->lpMciDrvs; *tmp; tmp = &(*tmp)->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (tmp = &WINMM_IData.lpMciDrvs; *tmp; tmp = &(*tmp)->lpNext) {\r
if (*tmp == wmd) {\r
*tmp = wmd->lpNext;\r
break;\r
}\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
HeapFree(GetProcessHeap(), 0, wmd->lpstrDeviceType);\r
HeapFree(GetProcessHeap(), 0, wmd->lpstrAlias);\r
wmd->dwYieldData = VK_CANCEL;\r
wmd->CreatorThread = GetCurrentThreadId();\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* wmd must be inserted in list before sending opening the driver, coz' it\r
* may want to lookup at wDevID\r
*/\r
- wmd->lpNext = WINMM_IData->lpMciDrvs;\r
- WINMM_IData->lpMciDrvs = wmd;\r
+ wmd->lpNext = WINMM_IData.lpMciDrvs;\r
+ WINMM_IData.lpMciDrvs = wmd;\r
\r
for (modp.wDeviceID = MCI_MAGIC;\r
MCI_GetDriver(modp.wDeviceID) != 0;\r
\r
wmd->wDeviceID = modp.wDeviceID;\r
\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
TRACE("wDevID=%04X \n", modp.wDeviceID);\r
\r
case MCI_RESOURCE_RETURNED:\r
/* return string which ID is HIWORD(data[1]),\r
* string is loaded from mmsystem.dll */\r
- LoadStringW(WINMM_IData->hWinMM32Instance, HIWORD(data[1]),\r
+ LoadStringW(WINMM_IData.hWinMM32Instance, HIWORD(data[1]),\r
lpstrRet, uRetLen);\r
break;\r
case MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER:\r
\r
if (uDevType < MCI_DEVTYPE_FIRST ||\r
uDevType > MCI_DEVTYPE_LAST ||\r
- !LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, \r
+ !LoadStringW(WINMM_IData.hWinMM32Instance, uDevType, \r
strDevTyp, sizeof(strDevTyp) / sizeof(WCHAR))) {\r
dwRet = MCIERR_BAD_INTEGER;\r
goto errCleanUp;\r
if (wDevID == MCI_ALL_DEVICE_ID) {\r
LPWINE_MCIDRIVER next;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* FIXME: shall I notify once after all is done, or for\r
* each of the open drivers ? if the latest, which notif\r
* to return when only one fails ?\r
*/\r
- for (wmd = WINMM_IData->lpMciDrvs; wmd; ) {\r
+ for (wmd = WINMM_IData.lpMciDrvs; wmd; ) {\r
next = wmd->lpNext;\r
MCI_Close(wmd->wDeviceID, dwParam, lpParms);\r
wmd = next;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
return 0;\r
}\r
\r
if (lpParms->wDeviceType < MCI_DEVTYPE_FIRST || lpParms->wDeviceType > MCI_DEVTYPE_LAST) {\r
if (dwFlags & MCI_SYSINFO_OPEN) {\r
TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers\n");\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
cnt++;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
} else {\r
TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");\r
if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, wszHklmMci,\r
} else {\r
if (dwFlags & MCI_SYSINFO_OPEN) {\r
TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers of type %u\n", lpParms->wDeviceType);\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {\r
if (wmd->wType == lpParms->wDeviceType) cnt++;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
} else {\r
TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers of type %u\n", lpParms->wDeviceType);\r
FIXME("Don't know how to get # of MCI devices of a given type\n");\r
if (lpstrBuffer != NULL && uLength > 0 &&\r
wError >= MCIERR_BASE && wError <= MCIERR_CUSTOM_DRIVER_BASE) {\r
\r
- if (LoadStringW(WINMM_IData->hWinMM32Instance,\r
+ if (LoadStringW(WINMM_IData.hWinMM32Instance,\r
wError, lpstrBuffer, uLength) > 0) {\r
ret = TRUE;\r
}\r
if (lpstrBuffer != NULL && uLength > 0 &&\r
dwError >= MCIERR_BASE && dwError <= MCIERR_CUSTOM_DRIVER_BASE) {\r
\r
- if (LoadStringA(WINMM_IData->hWinMM32Instance,\r
+ if (LoadStringA(WINMM_IData.hWinMM32Instance,\r
dwError, lpstrBuffer, uLength) > 0) {\r
ret = TRUE;\r
}\r
{\r
LPWINE_MMIO wm = NULL;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (wm = WINMM_IData->lpMMIO; wm; wm = wm->lpNext) {\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (wm = WINMM_IData.lpMMIO; wm; wm = wm->lpNext) {\r
if (wm->info.hmmio == h)\r
break;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
return wm;\r
}\r
\r
\r
wm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MMIO));\r
if (wm) {\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* lookup next unallocated WORD handle, with a non NULL value */\r
while (++MMIO_counter == 0 || MMIO_Get((HMMIO)(ULONG_PTR)MMIO_counter));\r
wm->info.hmmio = (HMMIO)(ULONG_PTR)MMIO_counter;\r
- wm->lpNext = WINMM_IData->lpMMIO;\r
- WINMM_IData->lpMMIO = wm;\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ wm->lpNext = WINMM_IData.lpMMIO;\r
+ WINMM_IData.lpMMIO = wm;\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
}\r
return wm;\r
}\r
{\r
LPWINE_MMIO* m;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* search for the matching one... */\r
- m = &(WINMM_IData->lpMMIO);\r
+ m = &(WINMM_IData.lpMMIO);\r
while (*m && *m != wm) m = &(*m)->lpNext;\r
/* ...and destroy */\r
if (*m) {\r
HeapFree(GetProcessHeap(), 0, wm);\r
wm = NULL;\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
return wm ? FALSE : TRUE;\r
}\r
\r
*/\r
\r
/**************************************************************************\r
- * DllEntryPoint (MMSYSTEM.2046)\r
+ * DllEntryPoint (MMSYSTEM.4)\r
*\r
* MMSYSTEM DLL entry point\r
*\r
/* need to load WinMM in order to:\r
* - initiate correctly shared variables (WINMM_Init())\r
*/\r
- if (!GetModuleHandleA("WINMM.DLL") && !LoadLibraryA("WINMM.DLL"))\r
+ if (!GetModuleHandleA("WINMM.DLL"))\r
{\r
ERR("Could not load sibling WinMM.dll\n");\r
return FALSE;\r
}\r
- WINMM_IData->hWinMM16Instance = hinstDLL;\r
+ WINMM_IData.hWinMM16Instance = hinstDLL;\r
/* hook in our 16 bit function pointers */\r
pFnGetMMThread16 = WINMM_GetmmThread;\r
pFnOpenDriver16 = DRIVER_OpenDriver16;\r
MMDRV_Init16();\r
break;\r
case DLL_PROCESS_DETACH:\r
- WINMM_IData->hWinMM16Instance = 0;\r
+ WINMM_IData.hWinMM16Instance = 0;\r
pFnGetMMThread16 = NULL;\r
pFnOpenDriver16 = NULL;\r
pFnCloseDriver16 = NULL;\r
int WINAPI MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,\r
WORD cbHeapSize, LPSTR lpCmdLine)\r
{\r
- FIXME("STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);\r
+ TRACE("STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);\r
return TRUE;\r
}\r
\r
CloseHandle(lpMMThd->hEvent);\r
ret = 2;\r
} else {\r
+ SetThreadPriority(lpMMThd->hThread, THREAD_PRIORITY_TIME_CRITICAL);\r
TRACE("Got a nice thread hndl=%p id=0x%08lx\n", lpMMThd->hThread, lpMMThd->dwThreadID);\r
ret = 0;\r
}\r
-#1 pascal MMSYSTEM_WEP(word word word ptr) MMSYSTEM_WEP\r
+1 pascal WEP(word word word ptr) MMSYSTEM_WEP\r
2 pascal sndPlaySound(ptr word) sndPlaySound16\r
3 pascal PlaySound(ptr word long) PlaySound16\r
+4 pascal DllEntryPoint(long word word word long word) MMSYSTEM_LibMain\r
5 pascal mmsystemGetVersion() mmsystemGetVersion16\r
6 pascal DriverProc(long word word long long) DriverProc16\r
8 pascal WMMMidiRunOnce() WMMMidiRunOnce16\r
#2005 stub MCIGETTHUNKTABLE\r
#2006 stub WINMMSL_THUNKDATA16\r
\r
-2046 pascal DllEntryPoint(long word word word long word) MMSYSTEM_LibMain\r
# these are Wine only exported functions. Is there another way to do it ?\r
2047 pascal __wine_mmThreadEntryPoint(long) WINE_mmThreadEntryPoint\r
{\r
WINE_PLAYSOUND** p;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
- for (p = &WINMM_IData->lpPlaySound; *p && *p != wps; p = &((*p)->lpNext));\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
+ for (p = &WINMM_IData.lpPlaySound; *p && *p != wps; p = &((*p)->lpNext));\r
if (*p) *p = (*p)->lpNext;\r
- if (WINMM_IData->lpPlaySound == NULL) SetEvent(WINMM_IData->psLastEvent);\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ if (WINMM_IData.lpPlaySound == NULL) SetEvent(WINMM_IData.psLastEvent);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
if (wps->bAlloc) HeapFree(GetProcessHeap(), 0, (void*)wps->pszSound);\r
if (wps->hThread) CloseHandle(wps->hThread);\r
HeapFree(GetProcessHeap(), 0, wps);\r
mmioSeek(hmmio, mmckInfo.dwDataOffset, SEEK_SET);\r
while (left)\r
{\r
- if (WaitForSingleObject(WINMM_IData->psStopEvent, 0) == WAIT_OBJECT_0)\r
+ if (WaitForSingleObject(WINMM_IData.psStopEvent, 0) == WAIT_OBJECT_0)\r
{\r
wps->bLoop = FALSE;\r
break;\r
/* FIXME? I see no difference between SND_NOWAIT and SND_NOSTOP !\r
* there could be one if several sounds can be played at once...\r
*/\r
- if ((fdwSound & (SND_NOWAIT | SND_NOSTOP)) && WINMM_IData->lpPlaySound != NULL)\r
+ if ((fdwSound & (SND_NOWAIT | SND_NOSTOP)) && WINMM_IData.lpPlaySound != NULL)\r
return FALSE;\r
\r
/* alloc internal structure, if we need to play something */\r
return FALSE;\r
}\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* since several threads can enter PlaySound in parallel, we're not\r
* sure, at this point, that another thread didn't start a new playsound\r
*/\r
- while (WINMM_IData->lpPlaySound != NULL)\r
+ while (WINMM_IData.lpPlaySound != NULL)\r
{\r
- ResetEvent(WINMM_IData->psLastEvent);\r
+ ResetEvent(WINMM_IData.psLastEvent);\r
/* FIXME: doc says we have to stop all instances of pszSound if it's non\r
* NULL... as of today, we stop all playing instances */\r
- SetEvent(WINMM_IData->psStopEvent);\r
+ SetEvent(WINMM_IData.psStopEvent);\r
\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
- WaitForSingleObject(WINMM_IData->psLastEvent, INFINITE);\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
+ WaitForSingleObject(WINMM_IData.psLastEvent, INFINITE);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
\r
- ResetEvent(WINMM_IData->psStopEvent);\r
+ ResetEvent(WINMM_IData.psStopEvent);\r
}\r
\r
- if (wps) wps->lpNext = WINMM_IData->lpPlaySound;\r
- WINMM_IData->lpPlaySound = wps;\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ if (wps) wps->lpNext = WINMM_IData.lpPlaySound;\r
+ WINMM_IData.lpPlaySound = wps;\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
if (!pszSound || (fdwSound & SND_PURGE)) return TRUE;\r
\r
wps->bLoop = (fdwSound & SND_LOOP) ? TRUE : FALSE;\r
if ((handle = CreateThread(NULL, 0, proc_PlaySound, wps, 0, &id)) != 0) {\r
wps->hThread = handle;\r
+ SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL);\r
return TRUE;\r
}\r
}\r
TIME_TimersList = NULL;\r
TIME_hWakeEvent = CreateEventW(NULL, FALSE, FALSE, NULL);\r
TIME_TimeToDie = FALSE;\r
- TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, WINMM_IData, 0, NULL);\r
+ TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, &WINMM_IData, 0, NULL);\r
+ SetThreadPriority(TIME_hMMTimer, THREAD_PRIORITY_TIME_CRITICAL);\r
}\r
}\r
\r
lpNewTimer->dwUser = dwUser;\r
lpNewTimer->wFlags = wFlags;\r
\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
\r
if ((wFlags & TIME_KILL_SYNCHRONOUS) && !TIME_hKillEvent)\r
TIME_hKillEvent = CreateEventW(NULL, TRUE, TRUE, NULL);\r
TIME_TimersList = lpNewTimer;\r
lpNewTimer->wTimerID = wNewID + 1;\r
\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
/* Wake the service thread in case there is work to be done */\r
SetEvent(TIME_hWakeEvent);\r
LPWINE_TIMERENTRY lpSelf = NULL, *lpTimer;\r
\r
TRACE("(%u)\n", wID);\r
- EnterCriticalSection(&WINMM_IData->cs);\r
+ EnterCriticalSection(&WINMM_IData.cs);\r
/* remove WINE_TIMERENTRY from list */\r
for (lpTimer = &TIME_TimersList; *lpTimer; lpTimer = &(*lpTimer)->lpNext) {\r
if (wID == (*lpTimer)->wTimerID) {\r
break;\r
}\r
}\r
- LeaveCriticalSection(&WINMM_IData->cs);\r
+ LeaveCriticalSection(&WINMM_IData.cs);\r
\r
if (!lpSelf)\r
{\r
\r
if (wPeriod > MMSYSTIME_MININTERVAL)\r
{\r
- FIXME("Stub; we set our timer resolution at minimum\n");\r
+ WARN("Stub; we set our timer resolution at minimum\n");\r
}\r
\r
return 0;\r
\r
if (wPeriod > MMSYSTIME_MININTERVAL)\r
{\r
- FIXME("Stub; we set our timer resolution at minimum\n");\r
+ WARN("Stub; we set our timer resolution at minimum\n");\r
}\r
return 0;\r
}\r
void TIME_MMTimeStop(void);\r
\r
/* Global variables */\r
-extern LPWINE_MM_IDATA WINMM_IData;\r
+extern WINE_MM_IDATA WINMM_IData;\r
\r
/* pointers to 16 bit functions (if sibling MMSYSTEM.DLL is loaded\r
* NULL otherwise\r
* G L O B A L S E T T I N G S\r
* ========================================================================*/\r
\r
-LPWINE_MM_IDATA WINMM_IData /* = NULL */;\r
+WINE_MM_IDATA WINMM_IData;\r
\r
/**************************************************************************\r
* WINMM_CreateIData [internal]\r
*/\r
static BOOL WINMM_CreateIData(HINSTANCE hInstDLL)\r
{\r
- WINMM_IData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MM_IDATA));\r
+ memset( &WINMM_IData, 0, sizeof WINMM_IData );\r
\r
- if (!WINMM_IData)\r
- return FALSE;\r
- WINMM_IData->hWinMM32Instance = hInstDLL;\r
- InitializeCriticalSection(&WINMM_IData->cs);\r
+ WINMM_IData.hWinMM32Instance = hInstDLL;\r
+ InitializeCriticalSection(&WINMM_IData.cs);\r
/* FIXME crashes in ReactOS\r
- WINMM_IData->cs.DebugInfo->Spare[1] = (DWORD)"WINMM_IData";\r
+ WINMM_IData.cs.DebugInfo->Spare[1] = (DWORD)"WINMM_IData";\r
*/\r
- WINMM_IData->psStopEvent = CreateEventW(NULL, TRUE, FALSE, NULL);\r
- WINMM_IData->psLastEvent = CreateEventW(NULL, TRUE, FALSE, NULL);\r
- TRACE("Created IData (%p)\n", WINMM_IData);\r
+ WINMM_IData.psStopEvent = CreateEventW(NULL, TRUE, FALSE, NULL);\r
+ WINMM_IData.psLastEvent = CreateEventW(NULL, TRUE, FALSE, NULL);\r
+ TRACE("Initialized IData (%p)\n", &WINMM_IData);\r
return TRUE;\r
}\r
\r
*/\r
static void WINMM_DeleteIData(void)\r
{\r
- if (WINMM_IData) {\r
- TIME_MMTimeStop();\r
+ TIME_MMTimeStop();\r
\r
- /* FIXME: should also free content and resources allocated\r
- * inside WINMM_IData */\r
- CloseHandle(WINMM_IData->psStopEvent);\r
- CloseHandle(WINMM_IData->psLastEvent);\r
- DeleteCriticalSection(&WINMM_IData->cs);\r
- HeapFree(GetProcessHeap(), 0, WINMM_IData);\r
- WINMM_IData = NULL;\r
- }\r
+ /* FIXME: should also free content and resources allocated\r
+ * inside WINMM_IData */\r
+ CloseHandle(WINMM_IData.psStopEvent);\r
+ CloseHandle(WINMM_IData.psLastEvent);\r
+ DeleteCriticalSection(&WINMM_IData.cs);\r
}\r
\r
/******************************************************************\r
* a warning for the test was always true */\r
(/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||\r
(uError >= MIDIERR_BASE && uError <= MIDIERR_LASTERROR)) {\r
- if (LoadStringW(WINMM_IData->hWinMM32Instance,\r
+ if (LoadStringW(WINMM_IData.hWinMM32Instance,\r
uError, lpText, uSize) > 0) {\r
ret = MMSYSERR_NOERROR;\r
}\r
midiStreamClose((HMIDISTRM)hMidiOut);\r
return MMSYSERR_NOMEM;\r
}\r
+ SetThreadPriority(lpMidiStrm->hThread, THREAD_PRIORITY_TIME_CRITICAL);\r
\r
/* wait for thread to have started, and for its queue to be created */\r
{\r
* a warning for the test was always true */\r
(/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||\r
(uError >= WAVERR_BASE && uError <= WAVERR_LASTERROR)) {\r
- if (LoadStringW(WINMM_IData->hWinMM32Instance,\r
+ if (LoadStringW(WINMM_IData.hWinMM32Instance,\r
uError, lpText, uSize) > 0) {\r
ret = MMSYSERR_NOERROR;\r
}\r
if (hEvent) CloseHandle(hEvent);\r
return TASKERR_OUTOFMEMORY;\r
}\r
+ SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);\r
if (ph) *ph = hEvent;\r
CloseHandle(hThread);\r
return 0;\r