All MCI functions are now cleanly separated.
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c
index 9300b48..f292c11 100644
--- a/dlls/winmm/mci.c
+++ b/dlls/winmm/mci.c
@@ -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;
diff --git a/dlls/winmm/message16.c b/dlls/winmm/message16.c
index d077f0b..6dd0e15 100644
--- a/dlls/winmm/message16.c
+++ b/dlls/winmm/message16.c
@@ -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;
+}
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index e5f0b0e..1a6ef21 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -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;
}
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index b861ef6..00f127b 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -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))
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 64d0488..dbae8b2 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -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;
}