[patch] revert part of Aug 26 change in winmm/wineoss/audio.c that broke msvc++4.0 installer?

Dan Kegel dank at kegel.com
Wed Dec 11 00:48:19 CST 2002


Dan Kegel wrote:
> I finally tracked down the regression in the MSVC 4.0 installer
> to one patch:
> 
> http://www.winehq.com/hypermail/wine-cvs/2002/08/0166.html
> ------
> Modified files:
>     dlls/winmm/wineoss: audio.c
> 
> Log message:
>     Ove Kaaven <ovek at transgaming.com>
>     Tweaks to improve playback performance and reduce sound glitches:

I've tracked it down further.  Attached find a trace+wave and
a patch that reverts half of Ove's patch from August, thereby
"fixing" the problem.

Chris Morgan seems interested in looking into the problem,
and I imagine he and I will iterate a bit on it, but I wanted
to post this patch and log in case anyone was curious about
this bug.  (In case it isn't clear, I'm a total newbie when
it comes to wine internals, so I'd never have gotten this
far if I were doing anything more than tracking down a
regression.)
- Dan


======= patch that "fixes" the problem by reverting half of Ove's patch ========
======= this is overkill, but I haven't tracked it down precisely yet ==========

--- wine-20021125/dlls/winmm/wineoss/audio.c.old	2002-12-10 21:59:45.000000000 -0800
+++ wine-20021125/dlls/winmm/wineoss/audio.c	2002-12-10 21:57:48.000000000 -0800
@@ -31,10 +31,6 @@
  /* unless someone makes a wineserver kernel module, Unix pipes are faster than win32 events */
  #define USE_PIPE_SYNC

-/* an exact wodGetPosition is usually not worth the extra context switches,
- * as we're going to have near fragment accuracy anyway */
-/* #define EXACT_WODPOSITION */
-
  #include "config.h"

  #include <stdlib.h>
@@ -130,8 +126,7 @@
   */
  typedef struct {
      /* FIXME: this could be made a dynamically growing array (if needed) */
-    /* maybe it's needed, a Humongous game manages to transmit 128 messages at once at startup */
-#define OSS_RING_BUFFER_SIZE	192
+#define OSS_RING_BUFFER_SIZE	30
      OSS_MSG			messages[OSS_RING_BUFFER_SIZE];
      int				msg_tosave;
      int				msg_toget;
@@ -181,7 +176,6 @@

      DWORD			dwPlayedTotal;		/* number of bytes actually played since opening */
      DWORD                       dwWrittenTotal;         /* number of bytes written to OSS buffer 
since opening */
-    BOOL                        bNeedPost;              /* whether audio still needs to be 
physically started */

      /* synchronization stuff */
      HANDLE			hStartUpEvent;
@@ -1145,11 +1139,13 @@
      wodUpdatePlayedTotal(wwo, &dspspace);
      availInQ = dspspace.bytes;
      TRACE("fragments=%d/%d, fragsize=%d, bytes=%d\n",
-	  dspspace.fragments, dspspace.fragstotal, dspspace.fragsize, dspspace.bytes);
+          dspspace.fragments, dspspace.fragstotal, dspspace.fragsize, dspspace.bytes);

      /* input queue empty and output buffer with less than one fragment to play */
-    if (!wwo->lpPlayPtr && wwo->dwBufferSize < availInQ + wwo->dwFragmentSize) {
-	TRACE("Run out of wavehdr:s...\n");
+    if (!wwo->lpPlayPtr && wwo->dwBufferSize < availInQ + 2 * wwo->dwFragmentSize) {
+        TRACE("Run out of wavehdr:s... flushing (%lu => %lu)\n",
+              wwo->dwPlayedTotal, wwo->dwWrittenTotal);
+        wwo->dwPlayedTotal = wwo->dwWrittenTotal;
          return INFINITE;
      }

@@ -1169,14 +1165,6 @@
                  wwo->lpPlayPtr->reserved = wwo->dwWrittenTotal + wwo->lpPlayPtr->dwBufferLength;
              } while (wodPlayer_WriteMaxFrags(wwo, &availInQ) && wwo->lpPlayPtr && availInQ > 0);
          }
-
-        if (wwo->bNeedPost) {
-            /* OSS doesn't start before it gets either 2 fragments or a SNDCTL_DSP_POST;
-             * if it didn't get one, we give it the other */
-            if (wwo->dwBufferSize < availInQ + 2 * wwo->dwFragmentSize)
-                ioctl(wwo->ossdev->fd, SNDCTL_DSP_POST, 0);
-            wwo->bNeedPost = FALSE;
-        }
      }

      return wodPlayer_DSPWait(wwo);
@@ -1208,20 +1196,6 @@
  	if (wwo->state == WINE_WS_PLAYING) {
  	    dwNextFeedTime = wodPlayer_FeedDSP(wwo);
  	    dwNextNotifyTime = wodPlayer_NotifyCompletions(wwo, FALSE);
-	    if (dwNextFeedTime == INFINITE) {
-		/* FeedDSP ran out of data, but before flushing, */
-		/* check that a notification didn't give us more */
-		wodPlayer_ProcessMessages(wwo);
-		if (!wwo->lpPlayPtr) {
-		    TRACE("flushing\n");
-		    ioctl(wwo->ossdev->fd, SNDCTL_DSP_SYNC, 0);
-		    wwo->dwPlayedTotal = wwo->dwWrittenTotal;
-		}
-		else {
-		    TRACE("recovering\n");
-		    dwNextFeedTime = wodPlayer_FeedDSP(wwo);
-		}
-	    }
  	} else {
  	    dwNextFeedTime = dwNextNotifyTime = INFINITE;
  	}
@@ -1351,7 +1325,6 @@
      wwo->dwBufferSize = info.fragstotal * info.fragsize;
      wwo->dwPlayedTotal = 0;
      wwo->dwWrittenTotal = 0;
-    wwo->bNeedPost = TRUE;

      OSS_InitRingMessage(&wwo->msgRing);

@@ -1568,9 +1541,7 @@
      if (lpTime == NULL)	return MMSYSERR_INVALPARAM;

      wwo = &WOutDev[wDevID];
-#ifdef EXACT_WODPOSITION
      OSS_AddRingMessage(&wwo->msgRing, WINE_WM_UPDATE, 0, TRUE);
-#endif
      val = wwo->dwPlayedTotal;

      TRACE("wType=%04X wBitsPerSample=%u nSamplesPerSec=%lu nChannels=%u nAvgBytesPerSec=%lu\n",

============ trace+wave showing the problem ================

trace:wave:OSS_WaveOutInit OSS dsp out mask=00000018
trace:wave:OSS_WaveOutInit OSS dsp out caps=00000000
trace:wave:OSS_WaveOutInit out dwFormats = 00000FFF, dwSupport = 0000000C
trace:wave:OSS_WaveInInit OSS dsp in caps=00000000
trace:wave:OSS_WaveInInit OSS in dsp mask=00000018
trace:wave:OSS_WaveInInit in dwFormats = 00000FFF
trace:wave:OSS_widMessage (0, 0064, 00000000, 00000000, 00000000);
trace:wave:OSS_widMessage (0, 0032, 00000000, 00000000, 00000000);
trace:wave:OSS_wodMessage (0, 0064, 00000000, 00000000, 00000000);
trace:wave:OSS_wodMessage (0, 0003, 00000000, 00000000, 00000000);
trace:wave:OSS_wodMessage (0, 0005, 417B2C18, 417B2C48, 00030008);
trace:wave:wodOpen (0, 0x417b2c48, 00030008);
trace:wave:wodPlayer waiting 4294967295ms (4294967295,4294967295)
trace:wave:wodOpen fd=12 fragmentSize=1024
trace:wave:wodOpen wBitsPerSample=16, nAvgBytesPerSec=88200, nSamplesPerSec=44100, nChannels=1 
nBlockAlign=2!
trace:wave:wodNotifyClient wMsg = 0x03bb dwParm1 = 0000 dwParam2 = 0000
trace:wave:OSS_wodMessage (0, 0007, 00000001, 40296160, 00000020);
trace:wave:wodPrepare (0, 0x40296160, 00000020);
trace:wave:OSS_wodMessage (0, 0007, 00000001, 40296180, 00000020);
trace:wave:wodPrepare (0, 0x40296180, 00000020);
trace:wave:OSS_wodMessage (0, 0009, 00000001, 40296160, 00000020);
trace:wave:wodWrite (0, 0x40296160, 00000020);
trace:wave:OSS_wodMessage (0, 0009, 00000001, 40296180, 00000020);
trace:wave:wodWrite (0, 0x40296180, 00000020);
trace:wave:wodPlayer_ProcessMessages Received WINE_WM_HEADER 40296160
trace:wave:wodPlayer_ProcessMessages Received WINE_WM_HEADER 40296180
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15998
trace:wave:wodPlayer_FeedDSP Setting time to elapse for 0x40296160 to 29400
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.0[29400]/15998
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=470
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=1/17, fragsize=1024, bytes=1880
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.15998[29400]/1880
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=942
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.17878[29400]/2352
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=1/17, fragsize=1024, bytes=1412
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.20230[29400]/1412
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=940
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.21642[29400]/2352
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=940
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.23994[29400]/2352
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=940
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.26346[29400]/2352
trace:wave:wodPlayer waiting 11ms (11,4294967295)
trace:wave:wodPlayer_FeedDSP fragments=1/17, fragsize=1024, bytes=1410
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296160.28698[29400]/702
trace:wave:wodPlayer_FeedDSP Setting time to elapse for 0x40296180 to 34972
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296180.0[5572]/708
trace:wave:wodPlayer waiting 11ms (11,189)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=942
trace:wave:wodPlayer waiting 11ms (11,178)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296180.708[5572]/2352
trace:wave:wodPlayer waiting 11ms (11,162)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=942
trace:wave:wodPlayer waiting 11ms (11,151)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296180.3060[5572]/2352
trace:wave:wodPlayer waiting 11ms (11,136)
trace:wave:wodPlayer_FeedDSP fragments=0/17, fragsize=1024, bytes=942
trace:wave:wodPlayer waiting 11ms (11,125)
trace:wave:wodPlayer_FeedDSP fragments=2/17, fragsize=1024, bytes=2352
trace:wave:wodPlayer_WriteMaxFrags Writing wavehdr 0x40296180.5412[5572]/160
trace:wave:wodPlayer waiting 11ms (11,109)
trace:wave:wodPlayer_FeedDSP fragments=3/17, fragsize=1024, bytes=3134
trace:wave:wodPlayer waiting 11ms (11,98)
trace:wave:wodPlayer_FeedDSP fragments=4/17, fragsize=1024, bytes=4544
trace:wave:wodPlayer waiting 11ms (11,82)
trace:wave:wodPlayer_FeedDSP fragments=5/17, fragsize=1024, bytes=5956
trace:wave:wodPlayer waiting 11ms (11,66)
trace:wave:wodPlayer_FeedDSP fragments=6/17, fragsize=1024, bytes=6896
trace:wave:wodPlayer waiting 11ms (11,56)
trace:wave:wodPlayer_FeedDSP fragments=8/17, fragsize=1024, bytes=8308
trace:wave:wodPlayer waiting 11ms (11,40)
trace:wave:wodPlayer_FeedDSP fragments=9/17, fragsize=1024, bytes=9248
trace:wave:wodPlayer waiting 11ms (11,29)
trace:wave:wodPlayer_FeedDSP fragments=10/17, fragsize=1024, bytes=10660
trace:wave:wodPlayer waiting 11ms (11,13)
trace:wave:wodPlayer_FeedDSP fragments=11/17, fragsize=1024, bytes=11600
trace:wave:wodPlayer waiting 2ms (11,2)
trace:wave:wodPlayer_FeedDSP fragments=11/17, fragsize=1024, bytes=12072
trace:wave:wodNotifyClient wMsg = 0x03bd dwParm1 = 40296160 dwParam2 = 0000
trace:wave:wodPlayer waiting 11ms (11,60)
trace:wave:wodPlayer_FeedDSP fragments=13/17, fragsize=1024, bytes=13482
trace:wave:wodPlayer waiting 11ms (11,44)
trace:wave:wodPlayer_FeedDSP fragments=14/17, fragsize=1024, bytes=14894
trace:wave:wodPlayer waiting 11ms (11,28)
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15834
trace:wave:wodPlayer waiting 11ms (11,17)
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15998
trace:wave:wodPlayer waiting 11ms (11,15)
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15998
trace:wave:wodPlayer waiting 11ms (11,15)
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15998
trace:wave:wodPlayer waiting 11ms (11,15)
trace:wave:wodPlayer_FeedDSP fragments=15/17, fragsize=1024, bytes=15998
trace:wave:wodPlayer waiting 11ms (11,15)
============ (repeats forever, doesn't exit) =======================




More information about the wine-devel mailing list