Akihiro Sagawa : winmm: Don' t call the custom MMIOM_SEEK handler while opening.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Sep 2 14:30:38 CDT 2014


Module: wine
Branch: master
Commit: e2779a4c9aec515e0e478cb1d4c9fbe5a87d2367
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e2779a4c9aec515e0e478cb1d4c9fbe5a87d2367

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Tue Sep  2 00:10:13 2014 +0900

winmm: Don't call the custom MMIOM_SEEK handler while opening.

---

 dlls/winmm/mmio.c       | 18 ++++++++++++++----
 dlls/winmm/tests/mmio.c |  4 ++--
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c
index 026bedb..f2a04cf 100644
--- a/dlls/winmm/mmio.c
+++ b/dlls/winmm/mmio.c
@@ -667,7 +667,7 @@ static HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags,
                                         (LPARAM)szFileName, 0, FALSE);
 
     /* update offsets and grab file size, when possible */
-    if (wm->info.fccIOProc != FOURCC_MEM && (send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_CUR, FALSE)) != -1) {
+    if (wm->info.fccIOProc == FOURCC_DOS && (send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_CUR, FALSE)) != -1) {
        pos = wm->info.lBufOffset = wm->info.lDiskOffset;
        send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_END, FALSE);
        wm->dwFileSize = wm->info.lDiskOffset;
@@ -885,7 +885,17 @@ LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin)
 	offset = wm->info.lBufOffset + (wm->info.pchNext - wm->info.pchBuffer) + lOffset;
 	break;
     case SEEK_END:
-	offset = ((wm->info.fccIOProc == FOURCC_MEM)? wm->info.cchBuffer : wm->dwFileSize) - lOffset;
+	switch (wm->info.fccIOProc) {
+	case FOURCC_MEM:
+	    offset = wm->info.cchBuffer - lOffset;
+	    break;
+	case FOURCC_DOS:
+	    offset = wm->dwFileSize - lOffset;
+	    break;
+	default:
+	    offset = send_message(wm->ioProc, &wm->info, MMIOM_SEEK, lOffset, SEEK_END, FALSE);
+	    break;
+	}
 	break;
     default:
 	return -1;
@@ -896,7 +906,7 @@ LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin)
     if ((wm->info.cchBuffer > 0) &&
 	((offset < wm->info.lBufOffset) ||
 	 (offset > wm->info.lBufOffset + wm->info.cchBuffer) ||
-	 (offset > wm->dwFileSize && wm->info.fccIOProc != FOURCC_MEM) ||
+	 (offset > wm->dwFileSize && wm->info.fccIOProc == FOURCC_DOS) ||
 	 !wm->bBufferLoaded)) {
 
 	/* condition to change buffer */
@@ -1023,7 +1033,7 @@ MMRESULT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO* lpmmioinfo, UINT uFlags)
     if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR)
 	return MMIOERR_CANNOTWRITE;
 
-    if (lpmmioinfo) {
+    if (lpmmioinfo && lpmmioinfo->fccIOProc == FOURCC_DOS) {
 	wm->dwFileSize = max(wm->dwFileSize, lpmmioinfo->lBufOffset + 
                              (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer));
     }
diff --git a/dlls/winmm/tests/mmio.c b/dlls/winmm/tests/mmio.c
index 57dc166..cf02c0d 100644
--- a/dlls/winmm/tests/mmio.c
+++ b/dlls/winmm/tests/mmio.c
@@ -636,9 +636,9 @@ static void test_mmioOpen_fourcc(void)
     mmioGetInfo(hmmio, &mmio, 0);
     ok(hmmio && mmio.fccIOProc == FOURCC_XYZ, "mmioOpenA error %u, got %4.4s\n",
             mmio.wErrorRet, (LPCSTR)&mmio.fccIOProc);
-    todo_wine ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n",
+    ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n",
        mmio.adwInfo[1]);
-    todo_wine ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n",
+    ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n",
        mmio.lDiskOffset);
     mmioClose(hmmio, 0);
 




More information about the wine-cvs mailing list