a few mmio fixes

eric pouech eric.pouech at wanadoo.fr
Sat Jun 16 13:54:39 CDT 2001


Andi reported an error in mmio file name parsing
here's the fix
i've also attached a few other changes sitting in my tree

A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: mmio
ChangeLog: fixed bugs in output functions (ascend, createChunk)
	cleaned up trace messages
	fixed some mmioOpen file name parsing
GenDate: 2001/06/16 18:42:31 UTC
ModifiedFiles: dlls/winmm/mmio.c
AddedFiles: 
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/mmio.c,v
retrieving revision 1.21
diff -u -u -r1.21 mmio.c
--- dlls/winmm/mmio.c	2001/03/10 19:15:49	1.21
+++ dlls/winmm/mmio.c	2001/06/16 07:51:39
@@ -127,7 +126,6 @@
 	 * lParam2 = new name
 	 * Returns: zero on success, non-zero on failure
 	 */
-	 FIXME("MMIOM_RENAME incomplete\n");
  	 if (!MoveFileA((const char*)lParam1, (const char*)lParam2))
 	     ret = MMIOERR_FILENOTFOUND;
 	 break;
@@ -517,11 +515,11 @@
 	LPSTR extStart;
 	
 	extStart = extEnd;
-	while (extStart > szFileName && extStart[0] != '.') {
+	while (extStart >= szFileName && extStart[0] != '.') {
 	    extStart--;
 	}
 	
-	if (extStart == szFileName) {
+	if (extStart < szFileName) {
 	    ERR("+ but no . in szFileName: %s\n", debugstr_a(szFileName));
 	} else {
 	    CHAR ext[5];
@@ -617,8 +615,8 @@
 	    MMIO_SendMessage(wm, MMIOM_WRITE, (LPARAM)wm->info.pchBuffer,
 			     wm->info.pchNext - wm->info.pchBuffer, MMIO_PROC_32A);
 	}
-	if (uFlags & MMIO_EMPTYBUF)
-	    wm->info.pchNext = wm->info.pchBuffer;
+	if (uFlags & MMIO_EMPTYBUF) 
+	    wm->info.pchNext = wm->info.pchEndRead = wm->info.pchBuffer;
     }
     wm->info.dwFlags &= ~MMIO_DIRTY;
 
@@ -647,6 +645,7 @@
 	if (size > 0)
 	    wm->info.pchEndRead += size;
     }
+
     wm->bBufferLoaded = TRUE;
     return size;
 }
@@ -663,7 +662,7 @@
     if (cchBuffer > 0xFFFF)
 	WARN("Untested handling of huge mmio buffers (%ld >= 64k)\n", cchBuffer);
 	
-    if (MMIO_Flush(wm, MMIO_EMPTYBUF) != 0)
+    if (MMIO_Flush(wm, 0) != 0)
 	return MMIOERR_CANNOTWRITE;
     
     if ((!cchBuffer || pchBuffer) && (wm->info.dwFlags & MMIO_ALLOCBUF)) {
@@ -902,7 +893,7 @@
     if ((wm = MMIO_Get(NULL, hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
     
-    if ((result = MMIO_Flush(wm, MMIO_EMPTYBUF)) != 0)
+    if ((result = MMIO_Flush(wm, 0)) != 0)
 	return result;
     
     result = MMIO_SendMessage(wm, MMIOM_CLOSE, uFlags, 0, MMIO_PROC_32A);
@@ -1093,7 +1127,7 @@
 
 	/* condition to change buffer */
 	if ((wm->info.fccIOProc == FOURCC_MEM) || 
-	    MMIO_Flush(wm, MMIO_EMPTYBUF) ||
+	    MMIO_Flush(wm, 0) ||
 	    /* this also sets the wm->info.lDiskOffset field */
 	    MMIO_SendMessage(wm, MMIOM_SEEK, 
 			     (offset / wm->info.cchBuffer) * wm->info.cchBuffer,
@@ -1123,7 +1157,7 @@
 {
     LPWINE_MMIO	wm;
 
-    TRACE("mmioGetInfo\n");
+    TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags);
 
     if ((wm = MMIO_Get(NULL, hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
@@ -1178,7 +1212,7 @@
 {
     LPWINE_MMIO		wm;
 
-    TRACE("mmioSetInfo\n");
+    TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags);
 
     if ((wm = MMIO_Get(NULL, hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
@@ -1211,7 +1245,7 @@
 {
     LPWINE_MMIO		wm;
 
-    TRACE("mmioSetInfo\n");
+    TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags);
 
     if ((wm = MMIO_Get(NULL, hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
@@ -1305,7 +1339,7 @@
     if (uFlags != MMIO_READ && uFlags != MMIO_WRITE)
 	return MMSYSERR_INVALPARAM;
 
-    if (MMIO_Flush(wm, MMIO_EMPTYBUF))
+    if (MMIO_Flush(wm, 0))
 	return MMIOERR_CANNOTWRITE;
 
     MMIO_GrabNextBuffer(wm, uFlags == MMIO_READ);
@@ -1327,7 +1361,7 @@
 {
     LPWINE_MMIO		wm;
 
-    TRACE("mmioAdvance\n");
+    TRACE("hmmio=%04X, lpmmioinfo=%p, uFlags=%04X\n", hmmio, lpmmioinfo, uFlags);
 
     if ((wm = MMIO_Get(NULL, hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
@@ -1338,7 +1372,7 @@
     if (uFlags != MMIO_READ && uFlags != MMIO_WRITE)
 	return MMSYSERR_INVALPARAM;
 
-    if (MMIO_Flush(wm, MMIO_EMPTYBUF))
+    if (MMIO_Flush(wm, 0))
 	return MMIOERR_CANNOTWRITE;
 
     MMIO_GrabNextBuffer(wm, uFlags == MMIO_READ);
@@ -1371,12 +1405,9 @@
     }
     
     /* Pad with spaces */
-    while (i < 4) {
-	cc[i] = ' ';
-	i++;
-    }
+    while (i < 4) cc[i++] = ' ';
     
-    TRACE("Got %c%c%c%c\n",cc[0],cc[1],cc[2],cc[3]);
+    TRACE("Got '%.4s'\n",cc);
     return mmioFOURCC(cc[0],cc[1],cc[2],cc[3]);
 }
 
@@ -1587,22 +1618,25 @@
     TRACE("(%04X, %p, %04X);\n", hmmio, lpck, uFlags);
     
     if (lpck->dwFlags & MMIO_DIRTY) {
-	DWORD	dwOldPos, dwNewSize, dwSizePos;
+	DWORD	dwOldPos, dwNewSize;
 	
-	TRACE("chunk is marked MMIO_DIRTY, correcting chunk size\n");
+	TRACE("Chunk is dirty, checking if chunk's size is correct\n");
 	dwOldPos = mmioSeek(hmmio, 0, SEEK_CUR);
 	TRACE("dwOldPos=%ld lpck->dwDataOffset = %ld\n", dwOldPos, lpck->dwDataOffset);
 	dwNewSize = dwOldPos - lpck->dwDataOffset;
 	if (dwNewSize != lpck->cksize) {
-	    TRACE("dwNewSize=%ld\n", dwNewSize);
+	    TRACE("Nope: lpck->cksize=%ld dwNewSize=%ld\n", lpck->cksize, dwNewSize);
 	    lpck->cksize = dwNewSize;
 	    
-	    dwSizePos = lpck->dwDataOffset - sizeof(DWORD);
-	    TRACE("dwSizePos=%ld\n", dwSizePos);
-	    
-	    mmioSeek(hmmio, dwSizePos, SEEK_SET);
+	    /* pad odd size with 0 */
+	    if (dwNewSize & 1) {
+		char ch = 0;
+		mmioWrite(hmmio, &ch, 1);
+	    }
+	    mmioSeek(hmmio, lpck->dwDataOffset - sizeof(DWORD), SEEK_SET);
 	    mmioWrite(hmmio, (LPSTR)&dwNewSize, sizeof(DWORD));
 	}
+	lpck->dwFlags = 0;
     }
     
     mmioSeek(hmmio, lpck->dwDataOffset + ((lpck->cksize + 1) & ~1), SEEK_SET);
@@ -1619,9 +1653,9 @@
 }
 
 /**************************************************************************
- * 				mmioCreateChunk		[MMSYSTEM.1225]
+ * 			mmioCreateChunk				[WINMM.115]
  */
-UINT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
+UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO* lpck, UINT uFlags)
 {
     DWORD	dwOldPos;
     LONG 	size;
@@ -1637,7 +1671,7 @@
     else if (uFlags == MMIO_CREATERIFF)
 	lpck->ckid = FOURCC_RIFF;
     
-    TRACE("ckid=%08lX\n", lpck->ckid);
+    TRACE("ckid=%.4s\n", (LPSTR)&lpck->ckid);
     
     size = 2 * sizeof(DWORD);
     lpck->dwDataOffset = dwOldPos + size;
@@ -1653,16 +1687,16 @@
 	WARN("return CannotWrite\n");
 	return MMIOERR_CANNOTWRITE;
     }
-    
+
     return 0;
 }
 
 /**************************************************************************
- * 			mmioCreateChunk				[WINMM.115]
+ * 				mmioCreateChunk		[MMSYSTEM.1225]
  */
-UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO* lpck, UINT uFlags)
+UINT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
 {
-    return mmioCreateChunk16(hmmio, lpck, uFlags);
+    return mmioCreateChunk(hmmio, lpck, uFlags);
 }
 
 /**************************************************************************


More information about the wine-patches mailing list