WinMM and drivers unload
Eric Pouech
eric.pouech at wanadoo.fr
Sun Nov 10 05:50:08 CST 2002
this patch correctly unloads all still opened drivers when winmm exits
this allows drivers which need those specific messages to take proper
action
Chris Morgan needs this for the jack driver
A+
-------------- next part --------------
Name: winmm_unload
ChangeLog: now properly unloading multimedia drivers when winmm unloads
License: X11
GenDate: 2002/11/10 11:45:51 UTC
ModifiedFiles: dlls/winmm/driver.c dlls/winmm/lolvldrv.c dlls/winmm/winemm.h dlls/winmm/winmm.c
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/driver.c,v
retrieving revision 1.22
diff -u -u -r1.22 driver.c
--- dlls/winmm/driver.c 31 Oct 2002 01:02:41 -0000 1.22
+++ dlls/winmm/driver.c 5 Nov 2002 20:11:38 -0000
@@ -507,3 +507,23 @@
TRACE("Done\n");
return TRUE;
}
+
+/******************************************************************
+ * DRIVER_UnloadAll
+ *
+ *
+ */
+void DRIVER_UnloadAll(void)
+{
+ LPWINE_DRIVER lpDrv;
+ LPWINE_DRIVER lpNextDrv = NULL;
+ unsigned count = 0;
+
+ for (lpDrv = lpDrvItemList; lpDrv != NULL; lpDrv = lpNextDrv)
+ {
+ lpNextDrv = lpDrv->lpNextItem;
+ CloseDriver((HDRVR)lpDrv, 0, 0);
+ count++;
+ }
+ TRACE("Unloaded %u drivers\n", count);
+}
Index: dlls/winmm/lolvldrv.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/lolvldrv.c,v
retrieving revision 1.38
diff -u -u -r1.38 lolvldrv.c
--- dlls/winmm/lolvldrv.c 31 Oct 2002 01:02:41 -0000 1.38
+++ dlls/winmm/lolvldrv.c 5 Nov 2002 21:14:39 -0000
@@ -733,3 +733,70 @@
/* FIXME: MMDRV_InitFromRegistry shall be MMDRV_Init in a near future */
return MMDRV_InitFromRegistry() || MMDRV_InitHardcoded();
}
+
+/******************************************************************
+ * ExitPerType
+ *
+ *
+ */
+static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
+{
+ WINE_MM_DRIVER_PART* part = &lpDrv->parts[type];
+ DWORD ret;
+
+ if (lpDrv->bIs32 && part->u.fnMessage32) {
+#if 0
+ ret = part->u.fnMessage32(0, DRVM_DISABLE, 0L, 0L, 0L);
+ TRACE("DRVM_DISABLE => %08lx\n", ret);
+#endif
+ ret = part->u.fnMessage32(0, DRVM_EXIT, 0L, 0L, 0L);
+ TRACE("DRVM_EXIT => %08lx\n", ret);
+ } else if (!lpDrv->bIs32 && part->u.fnMessage16 && pFnCallMMDrvFunc16) {
+#if 0
+ ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16,
+ 0, DRVM_DISABLE, 0L, 0L, 0L);
+ TRACE("DRVM_DISABLE => %08lx\n", ret);
+#endif
+ ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16,
+ 0, DRVM_EXIT, 0L, 0L, 0L);
+ TRACE("DRVM_EXIT => %08lx\n", ret);
+ } else {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/******************************************************************
+ * Exit
+ *
+ *
+ */
+void MMDRV_Exit(void)
+{
+ int i;
+
+ for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++)
+ {
+ if (MM_MLDrvs[i] != NULL)
+ {
+ FIXME("Closing while ll-driver open\n");
+#if 0
+ /* FIXME: should generate a message depending on type */
+ MMDRV_Free((HANDLE)(i | 0x8000), MM_MLDrvs[i]);
+#endif
+ }
+ }
+
+ /* unload driver, in reverse order of loading */
+ for (i = sizeof(MMDrvs) / sizeof(MMDrvs[0]) - 1; i >= 0; i--)
+ {
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_AUX);
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_MIXER);
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_MIDIIN);
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_MIDIOUT);
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_WAVEIN);
+ MMDRV_ExitPerType(&MMDrvs[i], MMDRV_WAVEOUT);
+ CloseDriver(MMDrvs[i].hDriver, 0, 0);
+ }
+}
Index: dlls/winmm/winemm.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/winemm.h,v
retrieving revision 1.41
diff -u -u -r1.41 winemm.h
--- dlls/winmm/winemm.h 31 Oct 2002 02:23:43 -0000 1.41
+++ dlls/winmm/winemm.h 5 Nov 2002 21:14:57 -0000
@@ -90,8 +90,6 @@
WINE_MM_DRIVER_PART parts[MMDRV_MAX];/* Information for all known types */
} WINE_MM_DRIVER, *LPWINE_MM_DRIVER;
-typedef WINMM_MapType (*MMDRV_MAPFUNC)(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-
typedef struct tagWINE_MLD {
/* EPP struct tagWINE_MLD* lpNext; */ /* not used so far */
UINT uDeviceID;
@@ -226,12 +224,15 @@
typedef LONG (*MCIPROC16)(DWORD, HDRVR16, WORD, DWORD, DWORD);
typedef LONG (*MCIPROC)(DWORD, HDRVR, DWORD, DWORD, DWORD);
+typedef WINMM_MapType (*MMDRV_MAPFUNC)(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr);
BOOL DRIVER_GetLibName(LPCSTR keyName, LPCSTR sectName, LPSTR buf, int sz);
LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCSTR 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,
DWORD* dwCallback, DWORD* dwInstance, BOOL bFrom32);
Index: dlls/winmm/winmm.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.8
diff -u -u -r1.8 winmm.c
--- dlls/winmm/winmm.c 4 Nov 2002 23:53:43 -0000 1.8
+++ dlls/winmm/winmm.c 6 Nov 2002 18:41:56 -0000
@@ -127,6 +127,12 @@
}
break;
case DLL_PROCESS_DETACH:
+ /* close all opened MCI drivers */
+ MCI_SendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, MCI_WAIT, 0L, TRUE);
+ MMDRV_Exit();
+ /* now unload all remaining drivers... */
+ DRIVER_UnloadAll();
+
WINMM_DeleteIData();
break;
case DLL_THREAD_ATTACH:
More information about the wine-patches
mailing list