[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