[PATCH 16/16] winmm: Rework loading logic to only load types when needed

Maarten Lankhorst m.b.lankhorst at gmail.com
Wed Mar 31 14:33:03 CDT 2010


---
 dlls/winmm/lolvldrv.c |   85 ++++++++++++++++++++++++++-----------------------
 1 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c
index 0d10998..1dc6d2a 100644
--- a/dlls/winmm/lolvldrv.c
+++ b/dlls/winmm/lolvldrv.c
@@ -58,18 +58,49 @@ static WINE_LLTYPE llTypes[MMDRV_MAX] = {
     { "WaveOut", 0, 0, -1 }
 };
 
+static DWORD typeloaded[MMDRV_MAX];
+static DWORD typenummsg[MMDRV_MAX] = {
+    AUXDM_GETNUMDEVS,
+    MXDM_GETNUMDEVS,
+    MIDM_GETNUMDEVS,
+    MODM_GETNUMDEVS,
+    WIDM_GETNUMDEVS,
+    WODM_GETNUMDEVS
+};
+
 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]))
 
+static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper);
+static BOOL MMDRV_InitPerType(DWORD idx, UINT type, UINT wMsg);
 static void MMDRV_Init(void);
 
 static void MMDRV_InitSingleType(UINT type) {
+    DWORD i, ret = TRUE;
+
+    if (typeloaded[type])
+        return;
+
     if (!drivers_loaded) {
         drivers_loaded = 1;
         MMDRV_Init();
     }
+
+    typeloaded[type] = 1;
+
+    if (type == MMDRV_MIDIOUT)
+        ret = MMDRV_Install("wavemapper", "msacm32.drv", TRUE);
+    else if (type == MMDRV_WAVEOUT)
+        ret = MMDRV_Install("midimapper", "midimap.dll", TRUE);
+    if (!ret)
+        WARN("Failed to install mapper for %s\n", llTypes[type].typestr);
+
+    for (i = 0; i < MMDrvsHi; ++i)
+        MMDRV_InitPerType(i, type, typenummsg[type]);
+
+    TRACE("loaded type %s\n", llTypes[type].typestr);
 }
 
 /**************************************************************************
@@ -352,16 +383,14 @@ UINT	MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg,
 /**************************************************************************
  * 				MMDRV_InitPerType		[internal]
  */
-static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
+static BOOL MMDRV_InitPerType(DWORD idx, UINT type, UINT wMsg)
 {
-    WINE_MM_DRIVER_PART*	part = &lpDrv->parts[type];
-    DWORD			ret;
-    UINT			count = 0;
-    int				i, k;
+    LPWINE_MM_DRIVER lpDrv = MMDrvs+idx;
+    WINE_MM_DRIVER_PART *part = &lpDrv->parts[type];
+    DWORD ret;
+    UINT count, k;
     TRACE("(%p, %04x, %04x)\n", lpDrv, type, wMsg);
 
-    part->nIDMin = part->nIDMax = 0;
-
     /* for DRVM_INIT and DRVM_ENABLE, dwParam2 should be PnP node */
     /* the DRVM_ENABLE is only required when the PnP node is non zero */
     if (part->fnMessage32) {
@@ -382,7 +411,7 @@ static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
 
     /* got some drivers */
     if (lpDrv->bIsMapper) {
-        llTypes[type].nMapper = MMDrvsHi;
+        llTypes[type].nMapper = idx;
     } else {
 	if (count == 0)
 	    return FALSE;
@@ -411,15 +440,12 @@ static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
 	llTypes[type].lpMlds[-1].mmdIndex = llTypes[type].nMapper;
 	llTypes[type].lpMlds[-1].dwDriverInstance = 0;
     }
-    for (i = k = 0; i <= MMDrvsHi; i++) {
-	while (MMDrvs[i].parts[type].nIDMin <= k && k < MMDrvs[i].parts[type].nIDMax) {
-	    TRACE("%s:Trans[%d] -> %s\n", llTypes[type].typestr, k, MMDrvs[i].drvname);
-	    llTypes[type].lpMlds[k].uDeviceID = k;
-	    llTypes[type].lpMlds[k].type = type;
-	    llTypes[type].lpMlds[k].mmdIndex = i;
-	    llTypes[type].lpMlds[k].dwDriverInstance = 0;
-	    k++;
-	}
+    for (k = lpDrv->parts[type].nIDMin; k < lpDrv->parts[type].nIDMax; ++k) {
+        TRACE("%s:Trans[%d] -> %s\n", llTypes[type].typestr, k, lpDrv->drvname);
+        llTypes[type].lpMlds[k].uDeviceID = k;
+        llTypes[type].lpMlds[k].type = type;
+        llTypes[type].lpMlds[k].mmdIndex = idx;
+        llTypes[type].lpMlds[k].dwDriverInstance = 0;
     }
     return TRUE;
 }
@@ -487,22 +513,6 @@ static	BOOL	MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
     lpDrv->bIsMapper = bIsMapper;
     lpDrv->drvname = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(drvRegName) + 1), drvRegName);
 
-    /* Finish init and get the count of the devices */
-    i = 0;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_AUX,     AUXDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIXER,   MXDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIDIIN,  MIDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIDIOUT, MODM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_WAVEIN,  WIDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_WAVEOUT, WODM_GETNUMDEVS))	i = 1;
-    /* if all those func calls return FALSE, then the driver must be unloaded */
-    if (!i) {
-	CloseDriver(lpDrv->hDriver, 0, 0);
-	HeapFree(GetProcessHeap(), 0, lpDrv->drvname);
-	WARN("Driver initialization failed\n");
-	return FALSE;
-    }
-
     MMDrvsHi++;
 
     return TRUE;
@@ -538,9 +548,6 @@ static void MMDRV_Init(void)
             break;
         p = next;
     }
-
-    MMDRV_Install("wavemapper", "msacm32.drv", TRUE);
-    MMDRV_Install("midimapper", "midimap.dll", TRUE);
 }
 
 /******************************************************************
@@ -548,13 +555,13 @@ static void MMDRV_Init(void)
  *
  *
  */
-static  BOOL	MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
+static void MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
 {
     WINE_MM_DRIVER_PART*	part = &lpDrv->parts[type];
     DWORD			ret;
     TRACE("(%p, %04x)\n", lpDrv, type);
 
-    if (part->fnMessage32) {
+    if (typeloaded[type] && part->fnMessage32) {
 #if 0
         ret = part->fnMessage32(0, DRVM_DISABLE, 0L, 0L, 0L);
         TRACE("DRVM_DISABLE => %08lx\n", ret);
@@ -562,8 +569,6 @@ static  BOOL	MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
         ret = part->fnMessage32(0, DRVM_EXIT, 0L, 0L, 0L);
         TRACE("DRVM_EXIT => %s\n", WINMM_ErrorToString(ret));
     }
-
-    return TRUE;
 }
 
 /******************************************************************
-- 
1.7.0


--------------050705000604000305050309--



More information about the wine-patches mailing list