[PATCH 12/16] winmm: Defer initializing drivers until they are requested
Maarten Lankhorst
m.b.lankhorst at gmail.com
Wed Mar 31 13:19:35 CDT 2010
---
dlls/winmm/lolvldrv.c | 19 ++++++++++++++-----
dlls/winmm/winemm.h | 1 -
dlls/winmm/winmm.c | 4 ----
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c
index 74b9f9d..ff65d84 100644
--- a/dlls/winmm/lolvldrv.c
+++ b/dlls/winmm/lolvldrv.c
@@ -47,7 +47,7 @@ typedef struct tagWINE_LLTYPE {
int nMapper; /* index to mapper */
} WINE_LLTYPE;
-static int MMDrvsHi /* = 0 */;
+static int drivers_loaded, MMDrvsHi;
static WINE_MM_DRIVER MMDrvs[8];
static LPWINE_MLD MM_MLDrvs[40];
#define MAX_MM_MLDRVS (sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]))
@@ -66,6 +66,15 @@ static WINE_LLTYPE llTypes[MMDRV_MAX] = {
};
#undef A
+static void MMDRV_Init(void);
+
+static void MMDRV_InitSingleType(UINT type) {
+ if (!drivers_loaded) {
+ drivers_loaded = 1;
+ MMDRV_Init();
+ }
+}
+
/**************************************************************************
* MMDRV_GetNum [internal]
*/
@@ -73,6 +82,7 @@ UINT MMDRV_GetNum(UINT type)
{
TRACE("(%04x)\n", type);
assert(type < MMDRV_MAX);
+ MMDRV_InitSingleType(type);
return llTypes[type].wMaxId;
}
@@ -109,7 +119,6 @@ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
lpDrv = &MMDrvs[mld->mmdIndex];
part = &lpDrv->parts[mld->type];
-
#if 0
/* some sanity checks */
if (!(part->nIDMin <= devID))
@@ -265,6 +274,7 @@ LPWINE_MLD MMDRV_Get(HANDLE _hndl, UINT type, BOOL bCanBeID)
TRACE("(%p, %04x, %c)\n", _hndl, type, bCanBeID ? 'Y' : 'N');
assert(type < MMDRV_MAX);
+ MMDRV_InitSingleType(type);
if (hndl >= llTypes[type].wMaxId &&
hndl != (UINT16)-1 && hndl != (UINT)-1) {
@@ -528,7 +538,7 @@ static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
/**************************************************************************
* MMDRV_Init
*/
-BOOL MMDRV_Init(void)
+static void MMDRV_Init(void)
{
HKEY hKey;
char driver_buffer[256];
@@ -564,7 +574,6 @@ BOOL MMDRV_Init(void)
ret |= MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE);
ret |= MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE);
- return ret;
}
/******************************************************************
@@ -595,7 +604,7 @@ static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
*
*
*/
-void MMDRV_Exit(void)
+void MMDRV_Exit(void)
{
unsigned int i;
TRACE("()\n");
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 7920e2e..45a4233 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -137,7 +137,6 @@ BOOL DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz);
LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2);
void DRIVER_UnloadAll(void);
-BOOL MMDRV_Init(void);
void MMDRV_Exit(void);
UINT MMDRV_GetNum(UINT);
LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 6cdf14d..1c6a13e 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -155,10 +155,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
if (!WINMM_CreateIData(hInstDLL))
return FALSE;
- if (!MMDRV_Init()) {
- WINMM_DeleteIData();
- return FALSE;
- }
break;
case DLL_PROCESS_DETACH:
/* close all opened MCI drivers */
--
1.7.0
--------------080504090002030702080409--
More information about the wine-patches
mailing list