Patch to make several demos (demoscene demos) work

Steinar H. Gunderson sgunderson at bigfoot.com
Tue Dec 4 12:17:53 CST 2001


Hi,

After noticing a lot of demos (especially OpenGL demos) work quite well in
WINE, I decided to fix a few problems. This patch corrects three, in fact
(should I have split it into three different e-mails?):

- Added a very, very crude wglSwapLayerBuffers() implementation -- some demos
  use it instead of SwapBuffers().
- The waveOut() timer has been vastly improved. The current version of WINE
  does not update the timer before after the last sample, which makes some
  demos (notably some 64kB intros, and the minifmod sound system) loop
  forever in the first second because the timer is never updated. This patch
  adds support for polling /dev/dsp to check the actual timer. It still isn't
  perfect (skips sometimes), but it works a _lot_ better on the programs I've
  tested it on, at least.
- Some programs have complained about the lack of "DISPLAY.DLL", which
  appearently is a pseudo-name for an internal WINE system. Commenting out a
  simple import in x11drv.spec prevents the loop which makes x11drv need
  display.dll itself -- user32 is later imported anyhow, so it shouldn't
  matter :-)

/* Steinar */
-- 
Homepage: http://www.sesse.net/
-------------- next part --------------
diff -r -u wine-20011108/dlls/opengl32/wgl.c wine-20011108-patched/dlls/opengl32/wgl.c
--- wine-20011108/dlls/opengl32/wgl.c	Sun Oct 14 18:18:52 2001
+++ wine-20011108-patched/dlls/opengl32/wgl.c	Sat Nov 17 02:35:53 2001
@@ -404,9 +404,19 @@
  */
 BOOL WINAPI wglSwapLayerBuffers(HDC hdc,
 				UINT fuPlanes) {
-  FIXME("(): stub !\n");
+  DC * dc = DC_GetDCPtr( hdc );
+
+  FIXME("(): not complete yet!\n");
+  if (dc == NULL) {
+    ERR("Null DC !!!\n");
+    return FALSE;
+  } else {
+    X11DRV_PDEVICE *physDev =(X11DRV_PDEVICE *)dc->physDev;
+	
+    glXSwapBuffers(gdi_display, physDev->drawable);
+  }
 
-  return FALSE;
+  return TRUE;
 }
 
 /***********************************************************************
diff -r -u wine-20011108/dlls/winmm/wineoss/audio.c wine-20011108-patched/dlls/winmm/wineoss/audio.c
--- wine-20011108/dlls/winmm/wineoss/audio.c	Sat Aug 18 18:09:41 2001
+++ wine-20011108-patched/dlls/winmm/wineoss/audio.c	Sat Nov 17 14:18:30 2001
@@ -103,6 +103,7 @@
     
     DWORD			dwLastFragDone;		/* time in ms, when last played fragment will be actually played */
     DWORD			dwPlayedTotal;		/* number of bytes played since opening */
+    DWORD			dwLastFill;		/* number of fragments filled at last dwPlayedTotal sync */
 
     /* info on current lpQueueHdr->lpWaveHdr */
     DWORD			dwOffCurrHdr;		/* offset in lpPlayPtr->lpData for fragments */
@@ -425,6 +426,11 @@
 	
         TRACE("info={frag=%d fsize=%d ftotal=%d bytes=%d}\n", info.fragments, info.fragsize, info.fragstotal, info.bytes);
 
+	if (wwo->dwLastFill != info.bytes) {
+	    wwo->dwPlayedTotal += info.bytes - wwo->dwLastFill;
+	    wwo->dwLastFill = info.bytes;
+	}
+	
 	if (!info.fragments)	/* output queue is full, wait a bit */
 	    return FALSE;
 
@@ -464,9 +470,11 @@
 	    /* write end of current wave hdr */
 	    count = write(wwo->unixdev, lpData + wwo->dwOffCurrHdr, toWrite);
 	    TRACE("write(%p[%5lu], %5lu) => %d\n", lpData, wwo->dwOffCurrHdr, toWrite, count);
	    
 	    if (count > 0 || toWrite == 0) {
 		DWORD	tc = GetTickCount();
+		
+	        wwo->dwLastFill -= count;
 
 		if (wwo->dwLastFragDone /* + guard time ?? */ < tc) 
 		    wwo->dwLastFragDone = tc;
@@ -514,6 +522,7 @@
 
 		TRACE("Tagging frag with %08lx\n", wwo->dwLastFragDone);
 
+		wwo->dwLastFill -= count;
 		wwo->dwOffCurrHdr += count;
 		wwo->dwRemain = wwo->dwFragmentSize;
 	    }
@@ -582,7 +591,7 @@
 	    
 	if (lpWaveHdr->reserved > tc && !force) break;
 
-	wwo->dwPlayedTotal += lpWaveHdr->dwBufferLength;
+//	wwo->dwPlayedTotal += lpWaveHdr->dwBufferLength;
 	wwo->lpQueuePtr = lpWaveHdr->lpNext;
 
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
@@ -602,6 +611,8 @@
  */
 static	void	wodPlayer_Reset(WINE_WAVEOUT* wwo, WORD uDevID, BOOL reset)
 {
+    struct audio_buf_info info;
+
     /* updates current notify list */
     wodPlayer_Notify(wwo, uDevID, FALSE);
 
@@ -612,9 +623,18 @@
 	wwo->state = WINE_WS_STOPPED;
 	ExitThread(-1);
     }
+    
+    /* find the fill */
+    if (ioctl(wwo->unixdev, SNDCTL_DSP_GETOSPACE, &info) == -1) {
+	perror("ioctl SNDCTL_DSP_GETOSPACE");
+	wwo->hThread = 0;
+	wwo->state = WINE_WS_STOPPED;
+	ExitThread(-1);
+    }
 
     wwo->dwOffCurrHdr = 0;
     wwo->dwRemain = wwo->dwFragmentSize;
+    wwo->dwLastFill = info.bytes;
     if (reset) {
 	/* empty notify list */
 	wodPlayer_Notify(wwo, uDevID, TRUE);
@@ -677,7 +697,6 @@
 	    else
 	        dwSleepTime = 0;
 	}
-
 	TRACE("imhere[1] tc = %08lx\n", GetTickCount());
 	if (dwSleepTime)
 	    WaitForSingleObject(wwo->msg_event, dwSleepTime);
@@ -728,7 +747,7 @@
 	    if (wwo->state == WINE_WS_PLAYING) {
 		wodPlayer_WriteFragments(wwo);
 	    }
-	    wodPlayer_Notify(wwo, uDevID, FALSE);
+	    wodPlayer_Notify(wwo, uDevID, (dwSleepTime == 0));
 	}
 
 	if (!had_msg) { /* if we've received a msg we've just done this so we
@@ -736,7 +755,7 @@
 	    if (wwo->state == WINE_WS_PLAYING) {
 		wodPlayer_WriteFragments(wwo);
 	    }
-	    wodPlayer_Notify(wwo, uDevID, FALSE);
+	    wodPlayer_Notify(wwo, uDevID, (dwSleepTime == 0));
 	}
     }
     ExitThread(0);
@@ -1110,6 +1129,7 @@
     int			time;
     DWORD		val;
     WINE_WAVEOUT*	wwo;
+    struct audio_buf_info info;
 
     TRACE("(%u, %p, %lu);\n", wDevID, lpTime, uSize);
     
@@ -1121,6 +1141,15 @@
     if (lpTime == NULL)	return MMSYSERR_INVALPARAM;
 
     wwo = &WOutDev[wDevID];
     val = wwo->dwPlayedTotal;
 
     TRACE("wType=%04X wBitsPerSample=%u nSamplesPerSec=%lu nChannels=%u nAvgBytesPerSec=%lu\n", 
@@ -1135,7 +1164,8 @@
 	TRACE("TIME_BYTES=%lu\n", lpTime->u.cb);
 	break;
     case TIME_SAMPLES:
-	lpTime->u.sample = val * 8 / wwo->format.wBitsPerSample;
+	lpTime->u.sample = val * 8 / wwo->format.wBitsPerSample /
+		wwo->format.wf.nChannels;
 	TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
 	break;
     case TIME_SMPTE:
diff -r -u wine-20011108/dlls/x11drv/x11drv.spec wine-20011108-patched/dlls/x11drv/x11drv.spec
--- wine-20011108/dlls/x11drv/x11drv.spec	Mon Oct 22 21:08:34 2001
+++ wine-20011108-patched/dlls/x11drv/x11drv.spec	Sat Nov 17 01:50:30 2001
@@ -2,7 +2,7 @@
 type	win32
 init	X11DRV_Init
 
-import	user32.dll
+# import	user32.dll
 import	gdi32.dll
 import	advapi32.dll
 import	kernel32.dll


More information about the wine-patches mailing list