winmm 16/32 split (#11)

Eric Pouech eric.pouech at wanadoo.fr
Tue Oct 29 09:29:20 CST 2002


ChangeLog
- all MCI functions are now cleanly separated

A+
-------------- next part --------------
--- winmm_10/mci.c	Tue Oct 29 12:21:49 2002
+++ winmm_11/mci.c	Tue Oct 29 13:58:24 2002
@@ -32,9 +32,8 @@
 #include "wingdi.h"
 #include "winreg.h"
 #include "winuser.h"
+#include "winnls.h"
 
-#include "wine/mmsystem16.h"
-#include "wine/winbase16.h"
 #include "digitalv.h"
 #include "winemm.h"
 
@@ -43,7 +42,12 @@
 WINE_DEFAULT_DEBUG_CHANNEL(mci);
 
 static	int			MCI_InstalledCount;
-static	LPSTR			MCI_lpInstallNames = NULL;
+static  LPSTR                   MCI_lpInstallNames /* = NULL */;
+
+WINMM_MapType  (*pFnMciMapMsg16To32A)  (WORD,WORD,DWORD*) /* = NULL */;
+WINMM_MapType  (*pFnMciUnMapMsg16To32A)(WORD,WORD,DWORD) /* = NULL */;
+WINMM_MapType  (*pFnMciMapMsg32ATo16)  (WORD,WORD,DWORD,DWORD*) /* = NULL */;
+WINMM_MapType  (*pFnMciUnMapMsg32ATo16)(WORD,WORD,DWORD,DWORD) /* = NULL */;
 
 /* First MCI valid device ID (0 means error) */
 #define MCI_MAGIC 0x0001
@@ -450,10 +454,10 @@
     /* First load driver */
     if ((wmd->hDriver = (HDRVR)DRIVER_TryOpenDriver32(libName, lp))) {
 	wmd->bIs32 = TRUE;
-    } else {
+    } else if (WINMM_CheckForMMSystem() && pFnMciMapMsg32ATo16) {
 	WINMM_MapType 	res;
 
-	switch (res = MCI_MapMsg32ATo16(0, DRV_OPEN, 0, &lp)) {
+	switch (res = pFnMciMapMsg32ATo16(0, DRV_OPEN, 0, &lp)) {
 	case WINMM_MAP_MSGERROR:
 	    TRACE("Not handled yet (DRV_OPEN)\n");
 	    break;
@@ -465,7 +469,7 @@
 	    if ((wmd->hDriver = OpenDriverA(drvTyp, "mci", lp)))
 		wmd->bIs32 = FALSE;
 	    if (res == WINMM_MAP_OKMEM)
-		MCI_UnMapMsg32ATo16(0, DRV_OPEN, 0, lp);
+		pFnMciUnMapMsg32ATo16(0, DRV_OPEN, 0, lp);
 	    break;
 	}
     }
@@ -1151,10 +1155,10 @@
     if (wmd) {
 	if (wmd->bIs32) {
 	    dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
-	} else {
+	} else if (pFnMciMapMsg32ATo16) {
 	    WINMM_MapType	res;
 
-	    switch (res = MCI_MapMsg32ATo16(wmd->wType, wMsg, dwParam1, &dwParam2)) {
+	    switch (res = pFnMciMapMsg32ATo16(wmd->wType, wMsg, dwParam1, &dwParam2)) {
 	    case WINMM_MAP_MSGERROR:
 		TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg));
 		dwRet = MCIERR_DRIVER_INTERNAL;
@@ -1167,7 +1171,7 @@
 	    case WINMM_MAP_OKMEM:
 		dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
 		if (res == WINMM_MAP_OKMEM)
-		    MCI_UnMapMsg32ATo16(wmd->wType, wMsg, dwParam1, dwParam2);
+		    pFnMciUnMapMsg32ATo16(wmd->wType, wMsg, dwParam1, dwParam2);
 		break;
 	    }
 	}
@@ -1186,10 +1190,10 @@
     if (wmd) {
 	dwRet = MCIERR_INVALID_DEVICE_ID;
 
-	if (wmd->bIs32) {
+	if (wmd->bIs32 && pFnMciMapMsg16To32A) {
 	    WINMM_MapType		res;
 
-	    switch (res = MCI_MapMsg16To32A(wmd->wType, wMsg, &dwParam2)) {
+	    switch (res = pFnMciMapMsg16To32A(wmd->wType, wMsg, &dwParam2)) {
 	    case WINMM_MAP_MSGERROR:
 		TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg));
 		dwRet = MCIERR_DRIVER_INTERNAL;
@@ -1202,7 +1206,7 @@
 	    case WINMM_MAP_OKMEM:
 		dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
 		if (res == WINMM_MAP_OKMEM)
-		    MCI_UnMapMsg16To32A(wmd->wType, wMsg, dwParam2);
+		    pFnMciUnMapMsg16To32A(wmd->wType, wMsg, dwParam2);
 		break;
 	    }
 	} else {
@@ -1517,12 +1521,12 @@
     case MCI_OPEN:
 	if (bFrom32) {
 	    dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
-	} else {
-	    switch (MCI_MapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32A) {
+	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
-		MCI_UnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1531,12 +1535,12 @@
     case MCI_CLOSE:
 	if (bFrom32) {
 	    dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
-	} else {
-	    switch (MCI_MapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32A) {
+	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
-		MCI_UnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1545,12 +1549,12 @@
     case MCI_SYSINFO:
 	if (bFrom32) {
 	    dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
-	} else {
-	    switch (MCI_MapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32A) {
+	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
-		MCI_UnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc doesnot  bark */
 	    }
@@ -1559,12 +1563,12 @@
     case MCI_BREAK:
 	if (bFrom32) {
 	    dwRet = MCI_Break(wDevID, dwParam1, (LPMCI_BREAK_PARMS)dwParam2);
-	} else {
-	    switch (MCI_MapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32A) {
+	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_Break(wDevID, dwParam1, (LPMCI_BREAK_PARMS)dwParam2);
-		MCI_UnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1596,7 +1600,7 @@
  * mciSendString), because MCI drivers return extra information for string
  * transformation. This function gets rid of them.
  */
-LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2, BOOL bIs32)
+LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2)
 {
     if (LOWORD(dwRet))
 	return LOWORD(dwRet);
@@ -1615,7 +1619,7 @@
 	    {
 		LPMCI_GETDEVCAPS_PARMS	lmgp;
 
-		lmgp = (LPMCI_GETDEVCAPS_PARMS)(bIs32 ? (void*)dwParam2 : MapSL(dwParam2));
+		lmgp = (LPMCI_GETDEVCAPS_PARMS)(void*)dwParam2;
 		TRACE("Changing %08lx to %08lx\n", lmgp->dwReturn, (DWORD)LOWORD(lmgp->dwReturn));
 		lmgp->dwReturn = LOWORD(lmgp->dwReturn);
 	    }
@@ -1638,7 +1642,7 @@
 	    {
 		LPMCI_STATUS_PARMS	lsp;
 
-		lsp = (LPMCI_STATUS_PARMS)(bIs32 ? (void*)dwParam2 : MapSL(dwParam2));
+		lsp = (LPMCI_STATUS_PARMS)(void*)dwParam2;
 		TRACE("Changing %08lx to %08lx\n", lsp->dwReturn, (DWORD)LOWORD(lsp->dwReturn));
 		lsp->dwReturn = LOWORD(lsp->dwReturn);
 	    }
@@ -1669,12 +1673,12 @@
 }
 
 /**************************************************************************
- * 			MULTIMEDIA_MciInit			[internal]
+ * 			MCI_Init			[internal]
  *
  * Initializes the MCI internal variables.
  *
  */
-BOOL MULTIMEDIA_MciInit(void)
+BOOL MCI_Init(void)
 {
     LPSTR	ptr1, ptr2;
     HKEY	hWineConf;
--- winmm_10/message16.c	Mon Oct 28 21:53:10 2002
+++ winmm_11/message16.c	Tue Oct 29 14:16:35 2002
@@ -1765,7 +1765,7 @@
 /**************************************************************************
  * 			MCI_MapMsg16To32A			[internal]
  */
-WINMM_MapType	MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
+static WINMM_MapType	MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
 {
     if (*lParam == 0)
 	return WINMM_MAP_OK;
@@ -1933,7 +1933,7 @@
 /**************************************************************************
  * 			MCI_UnMapMsg16To32A			[internal]
  */
-WINMM_MapType	MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam)
+static  WINMM_MapType	MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam)
 {
     switch (wMsg) {
 	/* case MCI_CAPTURE */
@@ -2180,7 +2180,7 @@
  *
  * Map a 32-A bit MCI message to a 16 bit MCI message.
  */
-WINMM_MapType	MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam)
+static  WINMM_MapType	MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam)
 {
     int		size;
     BOOLEAN     keep = FALSE;
@@ -2487,7 +2487,7 @@
 /**************************************************************************
  * 			MCI_UnMapMsg32ATo16			[internal]
  */
-WINMM_MapType	MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD lParam)
+static  WINMM_MapType	MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD lParam)
 {
     int		size = 0;
     BOOLEAN     kept = FALSE;	/* there is no need to compute size when kept is FALSE */
@@ -2667,3 +2667,10 @@
     return MCI_MsgMapper32To16_Destroy((void*)lParam, size, map, kept);
 }
 
+void    MMDRV_Init16(void)
+{
+    pFnMciMapMsg16To32A   = MCI_MapMsg16To32A;
+    pFnMciUnMapMsg16To32A = MCI_UnMapMsg16To32A;
+    pFnMciMapMsg32ATo16   = MCI_MapMsg32ATo16;
+    pFnMciUnMapMsg32ATo16 = MCI_UnMapMsg32ATo16;
+}
--- winmm_10/mmsystem.c	Tue Oct 29 14:20:01 2002
+++ winmm_11/mmsystem.c	Tue Oct 29 14:20:19 2002
@@ -88,6 +88,7 @@
         pFnCloseDriver16  = DRIVER_CloseDriver16;
         pFnSendMessage16  = DRIVER_SendMessage16;
         pFnMmioCallback16 = MMIO_Callback16;
+        MMDRV_Init16();
 	break;
     case DLL_PROCESS_DETACH:
 	WINMM_IData->hWinMM16Instance = 0;
@@ -96,6 +97,7 @@
         pFnCloseDriver16  = NULL;
         pFnSendMessage16  = NULL;
         pFnMmioCallback16 = NULL;
+        /* FIXME: add equivalent for MMDRV_Init16() */
 	break;
     case DLL_THREAD_ATTACH:
     case DLL_THREAD_DETACH:
@@ -555,7 +557,7 @@
 	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
 
     dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2, FALSE);
-    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, FALSE);
+    dwRet = MCI_CleanUp(dwRet, wMsg, (DWORD)MapSL(dwParam2));
     TRACE("=> %ld\n", dwRet);
     return dwRet;
 }
--- winmm_10/winemm.h	Tue Oct 29 16:09:33 2002
+++ winmm_11/winemm.h	Tue Oct 29 16:09:36 2002
@@ -244,12 +244,13 @@
 UINT		MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
 BOOL            MMDRV_Is32(unsigned int);
 
+BOOL    	MCI_Init(void);
 WINE_MCIDRIVER* MCI_GetDriver(UINT16 uDevID);
 UINT		MCI_GetDriverFromString(LPCSTR str);
 DWORD		MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr);
 const char* 	MCI_MessageToString(UINT16 wMsg);
 UINT	WINAPI	MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data);
-LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2, BOOL bIs32);
+LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2);
 DWORD		MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
 DWORD		MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
 DWORD		MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
@@ -283,17 +284,12 @@
                                  LPARAM lParam2, enum mmioProcType type);
 LPWINE_MMIO     MMIO_Get(HMMIO h);
 
-BOOL    	MULTIMEDIA_MciInit(void);
 BOOL            MULTIMEDIA_PlaySound(const void* pszSound, HMODULE hmod, DWORD fdwSound, BOOL bUnicode);
 
 void    	TIME_MMTimeStart(void);
 void		TIME_MMTimeStop(void);
 
 /* temporary definitions */
-WINMM_MapType	MCI_MapMsg16To32A  (WORD uDevType, WORD wMsg,                DWORD* lParam);
-WINMM_MapType	MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg,                DWORD  lParam);
-WINMM_MapType	MCI_MapMsg32ATo16  (WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam);
-WINMM_MapType	MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD  lParam);
 void	MMDRV_Callback(LPWINE_MLD mld, HDRVR hDev, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
 
 WINMM_MapType	MMDRV_Aux_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
@@ -340,11 +336,18 @@
 /* pointers to 16 bit functions (if sibling MMSYSTEM.DLL is loaded
  * NULL otherwise
  */
-extern LRESULT          (*pFnMmioCallback16)(SEGPTR,LPMMIOINFO,UINT,LPARAM,LPARAM);
+extern  WINE_MMTHREAD*  (*pFnGetMMThread16)(HANDLE16);
 extern  LPWINE_DRIVER   (*pFnOpenDriver16)(LPCSTR,LPCSTR,LPARAM);
 extern  LRESULT         (*pFnCloseDriver16)(HDRVR16,LPARAM,LPARAM);
 extern  LRESULT         (*pFnSendMessage16)(HDRVR16,UINT,LPARAM,LPARAM);
-extern WINE_MMTHREAD*   (*pFnGetMMThread16)(HANDLE16);
+extern  WINMM_MapType   (*pFnMciMapMsg16To32A)(WORD,WORD,DWORD*);
+extern  WINMM_MapType   (*pFnMciUnMapMsg16To32A)(WORD,WORD,DWORD);
+extern  WINMM_MapType   (*pFnMciMapMsg32ATo16)(WORD,WORD,DWORD,DWORD*);
+extern  WINMM_MapType   (*pFnMciUnMapMsg32ATo16)(WORD,WORD,DWORD,DWORD);
+extern  LRESULT         (*pFnMmioCallback16)(SEGPTR,LPMMIOINFO,UINT,LPARAM,LPARAM);
+
+/* mmsystem only functions */
+void            MMDRV_Init16(void);
 
 /* HANDLE16 -> HANDLE conversions */
 #define HDRVR_32(h16)		((HDRVR)(ULONG_PTR)(h16))
--- winmm_10/winmm.c	Tue Oct 29 14:00:09 2002
+++ winmm_11/winmm.c	Tue Oct 29 14:23:43 2002
@@ -148,7 +148,7 @@
     case DLL_PROCESS_ATTACH:
 	if (!WINMM_CreateIData(hInstDLL))
 	    return FALSE;
-        if (!MULTIMEDIA_MciInit() || !MMDRV_Init()) {
+        if (!MCI_Init() || !MMDRV_Init()) {
             WINMM_DeleteIData();
             return FALSE;
 	}
@@ -781,7 +781,7 @@
 	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
 
     dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2, TRUE);
-    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, TRUE);
+    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2);
     TRACE("=> %08lx\n", dwRet);
     return dwRet;
 }


More information about the wine-patches mailing list