winmm 16/32 split (#12)

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


ChangeLog:
- all low level driver functions (internals for wave, midi, mixer and
aux) are now cleanly separated

A+
-------------- next part --------------
--- winmm_11/lolvldrv.c	Tue Oct 29 09:54:08 2002
+++ winmm_12/lolvldrv.c	Tue Oct 29 14:07:34 2002
@@ -23,15 +23,15 @@
 #include <string.h>
 #include <stdio.h>
 #include <assert.h>
-#include "wine/winbase16.h"
 #include "winreg.h"
 #include "winver.h"
 #include "winemm.h"
 #include "wine/debug.h"
 
-WINE_DEFAULT_DEBUG_CHANNEL(mmsys);
+WINE_DEFAULT_DEBUG_CHANNEL(winmm);
 
-extern WORD CALLBACK MMDRV_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
+LRESULT         (*pFnCallMMDrvFunc16)(FARPROC16,WORD,WORD,LONG,LONG,LONG) /* = NULL */;
+unsigned        (*pFnLoadMMDrvFunc16)(LPCSTR,LPWINE_DRIVER, LPWINE_MM_DRIVER) /* = NULL */;
 
 /* each known type of driver has an instance of this structure */
 typedef struct tagWINE_LLTYPE {
@@ -54,11 +54,43 @@
 static LPWINE_MLD	MM_MLDrvs[40];
 #define MAX_MM_MLDRVS	(sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]))
 
+#define A(_x,_y) {#_y, _x, NULL, NULL, NULL, NULL, NULL, 0, NULL, -1}
+/* Note: the indices of this array must match the definitions
+ *	 of the MMDRV_???? manifest constants
+ */
+static WINE_LLTYPE	llTypes[MMDRV_MAX] = {
+    A(TRUE,  Aux),
+    A(FALSE, Mixer),
+    A(TRUE,  MidiIn),
+    A(TRUE,  MidiOut),
+    A(TRUE,  WaveIn),
+    A(TRUE,  WaveOut),
+};
+#undef A
+
+/******************************************************************
+ *		MMDRV_InstallMap
+ *
+ *
+ */
+void    MMDRV_InstallMap(unsigned int drv, 
+                         MMDRV_MAPFUNC mp1632, MMDRV_MAPFUNC um1632,
+                         MMDRV_MAPFUNC mp3216, MMDRV_MAPFUNC um3216,
+                         LPDRVCALLBACK cb)
+{
+    assert(drv < MMDRV_MAX);
+    llTypes[drv].Map16To32A   = mp1632;
+    llTypes[drv].UnMap16To32A = um1632;
+    llTypes[drv].Map32ATo16   = mp3216;
+    llTypes[drv].UnMap32ATo16 = um1632;
+    llTypes[drv].Callback     = cb;
+}
+
 /******************************************************************
  *		MMDRV_Is32
  *
  */
-BOOL                    MMDRV_Is32(unsigned int idx)
+BOOL            MMDRV_Is32(unsigned int idx)
 {
     return MMDrvs[idx].bIs32;
 }
@@ -124,24 +156,6 @@
     return ret;
 }
 
-#define A(_x,_y) {#_y, _x, \
-MMDRV_##_y##_Map16To32A, MMDRV_##_y##_UnMap16To32A, \
-MMDRV_##_y##_Map32ATo16, MMDRV_##_y##_UnMap32ATo16, \
-MMDRV_##_y##_Callback, 0, NULL, -1}
-
-/* Note: the indices of this array must match the definitions
- *	 of the MMDRV_???? manifest constants
- */
-static WINE_LLTYPE	llTypes[MMDRV_MAX] = {
-    A(TRUE,  Aux),
-    A(FALSE, Mixer),
-    A(TRUE,  MidiIn),
-    A(TRUE,  MidiOut),
-    A(TRUE,  WaveIn),
-    A(TRUE,  WaveOut),
-};
-#undef A
-
 /**************************************************************************
  * 			MMDRV_GetNum				[internal]
  */
@@ -223,14 +237,14 @@
 		    llType->UnMap16To32A(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2);
 		break;
 	    default:
-		FIXME("NIY ?\n");
+		FIXME("NIY\n");
 		ret = MMSYSERR_NOTSUPPORTED;
 		break;
 	    }
 	}
     } else {
-	assert(part->u.fnMessage16);
-
+	assert(part->u.fnMessage16 && pFnCallMMDrvFunc16);
+        
 	if (bFrom32) {
 	    map = llType->Map32ATo16(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2);
 	    switch (map) {
@@ -245,8 +259,9 @@
 	    case WINMM_MAP_OKMEM:
 		TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx\n",
 		      mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
-		ret = MMDRV_CallTo16_word_wwlll((FARPROC16)part->u.fnMessage16, mld->uDeviceID,
-						wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
+		ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16, 
+                                         mld->uDeviceID, wMsg, mld->dwDriverInstance, 
+                                         dwParam1, dwParam2);
 		TRACE("=> %lu\n", ret);
 		if (map == WINMM_MAP_OKMEM)
 		    llType->UnMap32ATo16(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2);
@@ -259,8 +274,9 @@
 	} else {
 	    TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx\n",
 		  mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
-            ret = MMDRV_CallTo16_word_wwlll((FARPROC16)part->u.fnMessage16, mld->uDeviceID,
-					    wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
+            ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16, 
+                                     mld->uDeviceID, wMsg, mld->dwDriverInstance, 
+                                     dwParam1, dwParam2);
 	    TRACE("=> %lu\n", ret);
 	}
     }
@@ -304,9 +320,12 @@
     mld->dwCallback = *dwCallback;
     mld->dwClientInstance = *dwInstance;
 
-    *dwFlags = LOWORD(*dwFlags) | CALLBACK_FUNCTION;
-    *dwCallback = (DWORD)llTypes[type].Callback;
-    *dwInstance = (DWORD)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
+    if (llTypes[type].Callback)
+    {
+        *dwFlags = LOWORD(*dwFlags) | CALLBACK_FUNCTION;
+        *dwCallback = (DWORD)llTypes[type].Callback;
+        *dwInstance = (DWORD)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
+    }
 
     return mld;
 }
@@ -498,17 +517,17 @@
 	TRACE("DRVM_ENABLE => %08lx\n", ret);
 #endif
         count = part->u.fnMessage32(0, wMsg, 0L, 0L, 0L);
-    } else if (!lpDrv->bIs32 && part->u.fnMessage16) {
-        ret = MMDRV_CallTo16_word_wwlll((FARPROC16)part->u.fnMessage16,
-					0, DRVM_INIT, 0L, 0L, 0L);
+    } else if (!lpDrv->bIs32 && part->u.fnMessage16 && pFnCallMMDrvFunc16) {
+        ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16,
+                                 0, DRVM_INIT, 0L, 0L, 0L);
 	TRACE("DRVM_INIT => %08lx\n", ret);
 #if 0
-	ret = MMDRV_CallTo16_word_wwlll((FARPROC16)part->u.fnMessage16,
-					0, DRVM_ENABLE, 0L, 0L, 0L);
+	ret = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16,
+                                 0, DRVM_ENABLE, 0L, 0L, 0L);
 	TRACE("DRVM_ENABLE => %08lx\n", ret);
 #endif
-        count = MMDRV_CallTo16_word_wwlll((FARPROC16)part->u.fnMessage16,
-					  0, wMsg, 0L, 0L, 0L);
+        count = pFnCallMMDrvFunc16((FARPROC16)part->u.fnMessage16,
+                                   0, wMsg, 0L, 0L, 0L);
     } else {
 	return FALSE;
     }
@@ -565,7 +584,6 @@
 static	BOOL	MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
 {
     int			i, count = 0;
-    char		buffer[128];
     LPWINE_MM_DRIVER	lpDrv = &MMDrvs[MMDrvsHi];
     LPWINE_DRIVER	d;
 
@@ -598,6 +616,7 @@
 
     if (lpDrv->bIs32) {
 	WINEMM_msgFunc32	func;
+        char    		buffer[128];
 
 	if (d->d.d32.hModule) {
 #define A(_x,_y)	AA(d->d.d32.hModule,_x,_y,32,GetProcAddress)
@@ -609,47 +628,16 @@
 	    A(MMDRV_WAVEOUT,	wodMessage);
 #undef A
 	}
-    } else {
-	WINEMM_msgFunc16	func;
-
-	/*
-	 * DESCRIPTION 'wave,aux,mixer:Creative Labs Sound Blaster 16 Driver'
-	 * The beginning of the module description indicates the driver supports
-	 * waveform, auxiliary, and mixer devices. Use one of the following
-	 * device-type names, followed by a colon (:) to indicate the type of
-	 * device your driver supports. If the driver supports more than one
-	 * type of device, separate each device-type name with a comma (,).
-	 *
-	 * wave for waveform audio devices
-	 * wavemapper for wave mappers
-	 * midi for MIDI audio devices
-	 * midimapper for midi mappers
-	 * aux for auxiliary audio devices
-	 * mixer for mixer devices
-	 */
-
-	if (d->d.d16.hDriver16) {
-	    HMODULE16	hMod16 = GetDriverModuleHandle16(d->d.d16.hDriver16);
-
-#define A(_x,_y)	AA(hMod16,_x,_y,16,GetProcAddress16)
-	    A(MMDRV_AUX,	auxMessage);
-	    A(MMDRV_MIXER,	mixMessage);
-	    A(MMDRV_MIDIIN,	midMessage);
-	    A(MMDRV_MIDIOUT, 	modMessage);
-	    A(MMDRV_WAVEIN,	widMessage);
-	    A(MMDRV_WAVEOUT,	wodMessage);
-#undef A
-	}
-    }
-#undef AA
-
-    if (TRACE_ON(mmsys)) {
-	if ((lpDrv->bIs32) ? MMDRV_GetDescription32(drvFileName, buffer, sizeof(buffer)) :
-	                     MMDRV_GetDescription16(drvFileName, buffer, sizeof(buffer)))
+        if (TRACE_ON(winmm)) {
+            if (MMDRV_GetDescription32(drvFileName, buffer, sizeof(buffer)))
 	    TRACE("%s => %s\n", drvFileName, buffer);
 	else
 	    TRACE("%s => No description\n", drvFileName);
+        }
+    } else if (WINMM_CheckForMMSystem() && pFnLoadMMDrvFunc16) {
+        count += pFnLoadMMDrvFunc16(drvFileName, d, lpDrv);
     }
+#undef AA
 
     if (!count) {
 	CloseDriver(lpDrv->hDriver, 0, 0);
--- winmm_11/message16.c	Tue Oct 29 14:16:35 2002
+++ winmm_12/message16.c	Tue Oct 29 14:16:48 2002
@@ -39,7 +39,7 @@
 /**************************************************************************
  * 				MMDRV_Callback			[internal]
  */
-void	MMDRV_Callback(LPWINE_MLD mld, HDRVR hDev, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
+static  void	MMDRV_Callback(LPWINE_MLD mld, HDRVR hDev, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
 {
     TRACE("CB (*%08lx)(%08x %08x %08lx %08lx %08lx\n",
 	  mld->dwCallback, hDev, uMsg, mld->dwClientInstance, dwParam1, dwParam2);
@@ -62,7 +62,7 @@
 /**************************************************************************
  * 				MMDRV_Aux_Map16To32A		[internal]
  */
-WINMM_MapType	MMDRV_Aux_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -70,7 +70,7 @@
 /**************************************************************************
  * 				MMDRV_Aux_UnMap16To32A		[internal]
  */
-WINMM_MapType	MMDRV_Aux_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -78,7 +78,7 @@
 /**************************************************************************
  * 				MMDRV_Aux_Map32ATo16		[internal]
  */
-WINMM_MapType	MMDRV_Aux_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -86,7 +86,7 @@
 /**************************************************************************
  * 				MMDRV_Aux_UnMap32ATo16		[internal]
  */
-WINMM_MapType	MMDRV_Aux_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
 #if 0
  case AUXDM_GETDEVCAPS:
@@ -103,7 +103,7 @@
 /**************************************************************************
  * 				MMDRV_Aux_Callback		[internal]
  */
-void	CALLBACK MMDRV_Aux_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_Aux_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -118,7 +118,7 @@
 /**************************************************************************
  * 				xMMDRV_Mixer_Map16To32A		[internal]
  */
-WINMM_MapType	MMDRV_Mixer_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -126,7 +126,7 @@
 /**************************************************************************
  * 				MMDRV_Mixer_UnMap16To32A	[internal]
  */
-WINMM_MapType	MMDRV_Mixer_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
 #if 0
     MIXERCAPSA	micA;
@@ -148,7 +148,7 @@
 /**************************************************************************
  * 				MMDRV_Mixer_Map32ATo16		[internal]
  */
-WINMM_MapType	MMDRV_Mixer_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -156,7 +156,7 @@
 /**************************************************************************
  * 				MMDRV_Mixer_UnMap32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_Mixer_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -164,7 +164,7 @@
 /**************************************************************************
  * 				MMDRV_Mixer_Callback		[internal]
  */
-void	CALLBACK MMDRV_Mixer_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_Mixer_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -179,7 +179,7 @@
 /**************************************************************************
  * 				MMDRV_MidiIn_Map16To32A		[internal]
  */
-WINMM_MapType	MMDRV_MidiIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -187,7 +187,7 @@
 /**************************************************************************
  * 				MMDRV_MidiIn_UnMap16To32A	[internal]
  */
-WINMM_MapType	MMDRV_MidiIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -195,7 +195,7 @@
 /**************************************************************************
  * 				MMDRV_MidiIn_Map32ATo16		[internal]
  */
-WINMM_MapType	MMDRV_MidiIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -203,7 +203,7 @@
 /**************************************************************************
  * 				MMDRV_MidiIn_UnMap32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_MidiIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -211,7 +211,7 @@
 /**************************************************************************
  * 				MMDRV_MidiIn_Callback		[internal]
  */
-void	CALLBACK MMDRV_MidiIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_MidiIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -267,7 +267,7 @@
 /**************************************************************************
  * 				MMDRV_MidiOut_Map16To32A	[internal]
  */
-WINMM_MapType	MMDRV_MidiOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -360,7 +360,7 @@
 /**************************************************************************
  * 				MMDRV_MidiOut_UnMap16To32A	[internal]
  */
-WINMM_MapType	MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -431,7 +431,7 @@
 /**************************************************************************
  * 				MMDRV_MidiOut_Map32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_MidiOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -571,7 +571,7 @@
 /**************************************************************************
  * 				MMDRV_MidiOut_UnMap32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -648,7 +648,7 @@
 /**************************************************************************
  * 				MMDRV_MidiOut_Callback		[internal]
  */
-void	CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -696,7 +696,7 @@
 /**************************************************************************
  * 				MMDRV_WaveIn_Map16To32A		[internal]
  */
-WINMM_MapType	MMDRV_WaveIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -805,7 +805,7 @@
 /**************************************************************************
  * 				MMDRV_WaveIn_UnMap16To32A	[internal]
  */
-WINMM_MapType	MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -877,7 +877,7 @@
 /**************************************************************************
  * 				MMDRV_WaveIn_Map32ATo16		[internal]
  */
-WINMM_MapType	MMDRV_WaveIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1047,7 +1047,7 @@
 /**************************************************************************
  * 				MMDRV_WaveIn_UnMap32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1141,7 +1141,7 @@
 /**************************************************************************
  * 				MMDRV_WaveIn_Callback		[internal]
  */
-void	CALLBACK MMDRV_WaveIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_WaveIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -1185,7 +1185,7 @@
 /**************************************************************************
  * 				MMDRV_WaveOut_Map16To32A	[internal]
  */
-WINMM_MapType	MMDRV_WaveOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1303,7 +1303,7 @@
 /**************************************************************************
  * 				MMDRV_WaveOut_UnMap16To32A	[internal]
  */
-WINMM_MapType	MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1386,7 +1386,7 @@
 /**************************************************************************
  * 				MMDRV_WaveOut_Map32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_WaveOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret;
 
@@ -1575,7 +1575,7 @@
 /**************************************************************************
  * 				MMDRV_WaveOut_UnMap32ATo16	[internal]
  */
-WINMM_MapType	MMDRV_WaveOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret;
 
@@ -1687,7 +1687,7 @@
 /**************************************************************************
  * 				MMDRV_WaveOut_Callback		[internal]
  */
-void	CALLBACK MMDRV_WaveOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
+static  void	CALLBACK MMDRV_WaveOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
 {
     LPWINE_MLD	mld = (LPWINE_MLD)dwInstance;
 
@@ -1722,10 +1722,20 @@
     MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
 }
 
+/* =================================
+ *  M A P P E R S   H A N D L I N G
+ * ================================= */
+
+static  LRESULT    MMDRV_CallMMDrvFunc16(FARPROC16 fp16, WORD dev, WORD msg, LONG instance,
+                                 LONG lp1, LONG lp2)
+{
+    return MMDRV_CallTo16_word_wwlll(fp16, dev, msg, instance, lp1, lp2);
+}
+
 /**************************************************************************
  * 				MMDRV_GetDescription16		[internal]
  */
-BOOL	MMDRV_GetDescription16(const char* fname, char* buf, int buflen)
+static  BOOL	MMDRV_GetDescription16(const char* fname, char* buf, int buflen)
 {
     OFSTRUCT   	ofs;
     HFILE	hFile;
@@ -1758,6 +1768,61 @@
     return ret;
 }
 
+/******************************************************************
+ *		MMDRV_LoadMMDrvFunc16
+ *
+ */
+unsigned   MMDRV_LoadMMDrvFunc16(LPCSTR drvName, LPWINE_DRIVER d, 
+                                 LPWINE_MM_DRIVER lpDrv)
+{        
+    WINEMM_msgFunc16	func;
+    unsigned            count = 0;
+    char    		buffer[128];
+    /*
+     * DESCRIPTION 'wave,aux,mixer:Creative Labs Sound Blaster 16 Driver'
+     * The beginning of the module description indicates the driver supports
+     * waveform, auxiliary, and mixer devices. Use one of the following
+     * device-type names, followed by a colon (:) to indicate the type of
+     * device your driver supports. If the driver supports more than one
+     * type of device, separate each device-type name with a comma (,).
+     *
+     * wave for waveform audio devices
+     * wavemapper for wave mappers
+     * midi for MIDI audio devices
+     * midimapper for midi mappers
+     * aux for auxiliary audio devices
+     * mixer for mixer devices
+     */
+
+    if (d->d.d16.hDriver16) {
+        HMODULE16	hMod16 = GetDriverModuleHandle16(d->d.d16.hDriver16);
+
+#define	AA(_h,_w,_x,_y,_z)					\
+    func = (WINEMM_msgFunc##_y) _z ((_h), #_x);			\
+    if (func != NULL) 						\
+        { lpDrv->parts[_w].u.fnMessage##_y = func; count++; 	\
+          TRACE("Got %d bit func '%s'\n", _y, #_x);         }
+
+#define A(_x,_y)	AA(hMod16,_x,_y,16,GetProcAddress16)
+        A(MMDRV_AUX,	auxMessage);
+        A(MMDRV_MIXER,	mixMessage);
+        A(MMDRV_MIDIIN,	midMessage);
+        A(MMDRV_MIDIOUT,modMessage);
+        A(MMDRV_WAVEIN,	widMessage);
+        A(MMDRV_WAVEOUT,wodMessage);
+#undef A
+#undef AA
+    }
+    if (TRACE_ON(winmm)) {
+        if (MMDRV_GetDescription16(drvName, buffer, sizeof(buffer)))
+	    TRACE("%s => %s\n", drvName, buffer);
+	else
+	    TRACE("%s => No description\n", drvName);
+    }
+
+    return count;
+}
+
 /* =================================
  *              M C I
  * ================================= */
@@ -2669,6 +2734,21 @@
 
 void    MMDRV_Init16(void)
 {
+#define A(_x,_y) MMDRV_InstallMap(_x, \
+MMDRV_##_y##_Map16To32A, MMDRV_##_y##_UnMap16To32A, \
+MMDRV_##_y##_Map32ATo16, MMDRV_##_y##_UnMap32ATo16, \
+MMDRV_##_y##_Callback)
+    A(MMDRV_AUX,        Aux);
+    A(MMDRV_MIXER,      Mixer);
+    A(MMDRV_MIDIIN,     MidiIn);
+    A(MMDRV_MIDIOUT,    MidiOut);
+    A(MMDRV_WAVEIN,     WaveIn);
+    A(MMDRV_WAVEOUT,    WaveOut);
+#undef A
+
+    pFnCallMMDrvFunc16 = MMDRV_CallMMDrvFunc16;
+    pFnLoadMMDrvFunc16 = MMDRV_LoadMMDrvFunc16;
+
     pFnMciMapMsg16To32A   = MCI_MapMsg16To32A;
     pFnMciUnMapMsg16To32A = MCI_UnMapMsg16To32A;
     pFnMciMapMsg32ATo16   = MCI_MapMsg32ATo16;
--- winmm_11/winemm.h	Tue Oct 29 16:09:36 2002
+++ winmm_12/winemm.h	Tue Oct 29 16:09:41 2002
@@ -243,6 +243,8 @@
 DWORD		MMDRV_Message(LPWINE_MLD mld, WORD wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
 UINT		MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
 BOOL            MMDRV_Is32(unsigned int);
+void            MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_MAPFUNC,
+                                 MMDRV_MAPFUNC, MMDRV_MAPFUNC, LPDRVCALLBACK);
 
 BOOL    	MCI_Init(void);
 WINE_MCIDRIVER* MCI_GetDriver(UINT16 uDevID);
@@ -289,47 +291,6 @@
 void    	TIME_MMTimeStart(void);
 void		TIME_MMTimeStop(void);
 
-/* temporary definitions */
-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);
-WINMM_MapType	MMDRV_Aux_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_Aux_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_Aux_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_Aux_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-WINMM_MapType	MMDRV_Mixer_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_Mixer_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_Mixer_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_Mixer_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_Mixer_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-WINMM_MapType	MMDRV_MidiIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiIn_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiIn_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_MidiIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-WINMM_MapType	MMDRV_MidiOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiOut_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_MidiOut_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-WINMM_MapType	MMDRV_WaveIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveIn_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveIn_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_WaveIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-WINMM_MapType	MMDRV_WaveOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveOut_UnMap16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-WINMM_MapType	MMDRV_WaveOut_UnMap32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2);
-void	CALLBACK MMDRV_WaveOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
-
-BOOL	MMDRV_GetDescription16(const char* fname, char* buf, int buflen);
-
 /* Global variables */
 extern LPWINE_MM_IDATA  WINMM_IData;
 
@@ -344,6 +305,8 @@
 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         (*pFnCallMMDrvFunc16)(FARPROC16,WORD,WORD,LONG,LONG,LONG);
+extern  unsigned        (*pFnLoadMMDrvFunc16)(LPCSTR,LPWINE_DRIVER, LPWINE_MM_DRIVER);
 extern  LRESULT         (*pFnMmioCallback16)(SEGPTR,LPMMIOINFO,UINT,LPARAM,LPARAM);
 
 /* mmsystem only functions */


More information about the wine-patches mailing list