MM fix

eric pouech eric.pouech at wanadoo.fr
Tue Nov 13 16:28:32 CST 2001


this patch fixes wave(In|Out)Open when called with WAVE_MAPPED flag...

A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: wavemapped
ChangeLog: fixed wave(In|Out)Open when called with WAVE_MAPPED flag; some minor 16/32 API call ordering
GenDate: 2001/11/13 22:27:03 UTC
ModifiedFiles: dlls/winmm/mmsystem.c dlls/winmm/wavemap/wavemap.c
AddedFiles: 
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.45
diff -u -u -r1.45 mmsystem.c
--- dlls/winmm/mmsystem.c	2001/07/24 21:45:23	1.45
+++ dlls/winmm/mmsystem.c	2001/11/13 22:22:43
@@ -619,18 +619,18 @@
 
 
 /**************************************************************************
- * 				mmsystemGetVersion	[WINMM.@]
+ * 				mmsystemGetVersion	[MMSYSTEM.5]
+ * return value borrowed from Win95 winmm.dll ;)
  */
-UINT WINAPI mmsystemGetVersion(void)
+UINT16 WINAPI mmsystemGetVersion16(void)
 {
-    return mmsystemGetVersion16();
+    return mmsystemGetVersion();
 }
 
 /**************************************************************************
- * 				mmsystemGetVersion	[MMSYSTEM.5]
- * return value borrowed from Win95 winmm.dll ;)
+ * 				mmsystemGetVersion	[WINMM.@]
  */
-UINT16 WINAPI mmsystemGetVersion16(void)
+UINT WINAPI mmsystemGetVersion(void)
 {
     TRACE("3.10 (Win95?)\n");
     return 0x030a;
@@ -654,9 +654,9 @@
 	break;
     case DCB_WINDOW:
 	TRACE("Window(%04lX) handle=%04X!\n", dwCallBack, hDev);
-	if (!IsWindow(dwCallBack))
-	    return FALSE;
-	PostMessageA((HWND16)dwCallBack, wMsg, hDev, dwParam1);
+/* EPP 	if (!IsWindow(dwCallBack)) */
+/* EPP 	    return FALSE; */
+	PostMessageA((HWND)dwCallBack, wMsg, hDev, dwParam1);
 	break;
     case DCB_TASK: /* aka DCB_THREAD */
 	TRACE("Task(%04lx) !\n", dwCallBack);
@@ -1538,17 +1538,17 @@
 }
 
 /**************************************************************************
- * 				mciGetErrorStringA		[WINMM.@]
+ * 				mciGetErrorString		[MMSYSTEM.706]
  */
-BOOL WINAPI mciGetErrorStringA(DWORD wError, LPSTR lpstrBuffer, UINT uLength)
+BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
 {
-    return mciGetErrorString16(wError, lpstrBuffer, uLength);
+    return mciGetErrorStringA(wError, lpstrBuffer, uLength);
 }
 
 /**************************************************************************
- * 				mciGetErrorString		[MMSYSTEM.706]
+ * 				mciGetErrorStringA		[WINMM.@]
  */
-BOOL16 WINAPI mciGetErrorString16(DWORD dwError, LPSTR lpstrBuffer, UINT16 uLength)
+BOOL WINAPI mciGetErrorStringA(DWORD dwError, LPSTR lpstrBuffer, UINT uLength)
 {
     BOOL16		ret = FALSE;
 
@@ -2460,8 +2460,17 @@
 
     TRACE("(%04X, %04X, %08lX, %08lX)\n", hMidiOut, uMessage, dwParam1, dwParam2);
 
-    if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) 
+    if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) {
+	/* HACK... */
+	if (uMessage == 0x0001) {
+	    *(LPDWORD)dwParam1 = 1;
+	    return 0;
+	}
+	if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) != NULL) {
+	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+	}
 	return MMSYSERR_INVALHANDLE;
+    }
 
     switch (uMessage) {
     case MODM_OPEN:
@@ -3650,6 +3659,8 @@
     if (dwFlags & WAVE_FORMAT_QUERY)	TRACE("WAVE_FORMAT_QUERY requested !\n");
 
     if (lpFormat == NULL) return WAVERR_BADFORMAT;
+    if ((dwFlags & WAVE_MAPPED) && (uDeviceID == (UINT)-1))
+	return MMSYSERR_INVALPARAM;
 
     TRACE("wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u\n", 
 	  lpFormat->wFormatTag, lpFormat->nChannels, lpFormat->nSamplesPerSec, 
@@ -3663,19 +3674,22 @@
     wod.lpFormat = lpFormat;  /* should the struct be copied iso pointer? */
     wod.dwCallback = dwCallback;
     wod.dwInstance = dwInstance;
-    wod.uMappedDeviceID = 0;
     wod.dnDevNode = 0L;
 
-    /* when called from 16 bit code, mapper will be 0x0000FFFF instead of 0xFFFFFFFF */
-    /* this should fix it */
-    wmld->uDeviceID = (uDeviceID == (UINT16)-1 && !bFrom32) ? (UINT)-1 : uDeviceID;
+    if (dwFlags & WAVE_MAPPED) {
+	wod.uMappedDeviceID = uDeviceID;
+	uDeviceID = WAVE_MAPPER;
+    } else {
+	wod.uMappedDeviceID = -1;
+    }
+    wmld->uDeviceID = uDeviceID;
 
-    dwRet = MMDRV_Open(wmld, (uType==MMDRV_WAVEOUT)?WODM_OPEN:WIDM_OPEN, (DWORD)&wod, dwFlags);
+    dwRet = MMDRV_Open(wmld, (uType == MMDRV_WAVEOUT) ? WODM_OPEN : WIDM_OPEN, (DWORD)&wod, dwFlags);
 
     if ((dwFlags & WAVE_FORMAT_QUERY) || dwRet != MMSYSERR_NOERROR) {
 	MMDRV_Free(handle, wmld);
 	handle = 0;
-    } 
+    }
 
     if (lphndl != NULL) *lphndl = handle;
     TRACE("=> %ld hWave=%04x\n", dwRet, handle);
@@ -3848,9 +3862,11 @@
 
     /* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly
      * call the 32 bit version
+     * however, we need to promote correctly the wave mapper id 
+     * (0xFFFFFFFF and not 0x0000FFFF)
      */
-    ret = MMSYSTEM_waveOpen(&hWaveOut, uDeviceID, MMDRV_WAVEOUT, lpFormat, 
-			    dwCallback, dwInstance, dwFlags, FALSE);
+    ret = MMSYSTEM_waveOpen(&hWaveOut, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID, 
+			    MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
 
     if (lphWaveOut != NULL) *lphWaveOut = hWaveOut;
     return ret;
@@ -4489,9 +4505,11 @@
 
     /* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly
      * call the 32 bit version
+     * however, we need to promote correctly the wave mapper id 
+     * (0xFFFFFFFF and not 0x0000FFFF)
      */
-    ret = MMSYSTEM_waveOpen(&hWaveIn, uDeviceID, MMDRV_WAVEIN, lpFormat, 
-			    dwCallback, dwInstance, dwFlags, FALSE);
+    ret = MMSYSTEM_waveOpen(&hWaveIn, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID, 
+			    MMDRV_WAVEIN, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
 
     if (lphWaveIn != NULL) *lphWaveIn = hWaveIn;
     return ret;
Index: dlls/winmm/wavemap/wavemap.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/wavemap/wavemap.c,v
retrieving revision 1.15
diff -u -u -r1.15 wavemap.c
--- dlls/winmm/wavemap/wavemap.c	2001/07/11 18:56:44	1.15
+++ dlls/winmm/wavemap/wavemap.c	2001/11/13 22:18:00
@@ -111,7 +111,7 @@
 
 static	DWORD	wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-    UINT 		nd = waveOutGetNumDevs();
+    UINT 		ndlo, ndhi;
     UINT		i;
     WAVEMAPDATA*	wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
     WAVEFORMATEX	wfx;
@@ -121,13 +121,22 @@
     if (!wom)
 	return MMSYSERR_NOMEM;
 
+    ndhi = waveOutGetNumDevs();
+    if (dwFlags & WAVE_MAPPED) {
+	if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM;
+	ndlo = lpDesc->uMappedDeviceID;
+	ndhi = ndlo + 1;
+	dwFlags &= ~WAVE_MAPPED;
+    } else {
+	ndlo = 0;
+    }
     wom->self = wom;
     wom->dwCallback = lpDesc->dwCallback;
     wom->dwFlags = dwFlags;
     wom->dwClientInstance = lpDesc->dwInstance;
     wom->hOuterWave = lpDesc->hWave;
 
-    for (i = 0; i < nd; i++) {
+    for (i = ndlo; i < ndhi; i++) {
 	/* if no ACM stuff is involved, no need to handle callbacks at this
 	 * level, this will be done transparently
 	 */
@@ -145,7 +154,7 @@
 #define	TRY(sps,bps)    wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
                         if (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
 
-    for (i = 0; i < nd; i++) {
+    for (i = ndlo; i < ndhi; i++) {
 	/* first try with same stereo/mono option as source */
 	wfx.nChannels = lpDesc->lpFormat->nChannels;
 	TRY(44100, 16);
@@ -435,7 +444,7 @@
     TRACE("(0x%x %u %ld %lx %lx);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2);
 
     if (!WAVEMAP_IsData(wim)) {
-	ERR("Bad date\n");
+	ERR("Bad data\n");
 	return;
     }
 
@@ -502,7 +511,7 @@
 
 static	DWORD	widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-    UINT 		nd = waveInGetNumDevs();
+    UINT 		ndlo, ndhi;
     UINT		i;
     WAVEMAPDATA*	wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
     WAVEFORMATEX	wfx;
@@ -518,7 +527,17 @@
     wim->dwClientInstance = lpDesc->dwInstance;
     wim->hOuterWave = lpDesc->hWave;
     
-    for (i = 0; i < nd; i++) {
+    ndhi = waveOutGetNumDevs();
+    if (dwFlags & WAVE_MAPPED) {
+	if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM;
+	ndlo = lpDesc->uMappedDeviceID;
+	ndhi = ndlo + 1;
+	dwFlags &= ~WAVE_MAPPED;
+    } else {
+	ndlo = 0;
+    }
+
+    for (i = ndlo; i < ndhi; i++) {
 	if (waveInOpen(&wim->hInnerWave, i, lpDesc->lpFormat, (DWORD)widCallback, 
 			(DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION) == MMSYSERR_NOERROR) {
 	    wim->hAcmStream = 0;
@@ -532,7 +551,7 @@
 #define	TRY(sps,bps)    wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
                         if (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
 
-    for (i = 0; i < nd; i++) {
+    for (i = ndlo; i < ndhi; i++) {
 	/* first try with same stereo/mono option as source */
 	wfx.nChannels = lpDesc->lpFormat->nChannels;
 	TRY(44100, 8);


More information about the wine-patches mailing list