Dang. Forgot to attach.

---
Here's another patch to fix the clicking noise. Once again apply over the top.

With this one, I think everything should be at least as good as it was with my 
very first patch. (Plus the full device buffer will be used if UseDirectHW="y", 
which should reduce underrun problems).

Davin


On Thu, 3 Nov 2005 18:42:50 +1100
Davin McCall <[EMAIL PROTECTED]> wrote:

> Thanks for that -
> 
> There was at least one problem with the patch. I've attached a fix for that 
> (apply over the top of the previous one).
> 
> I don't get buffer underruns in my own testing, but I do get an annoying 
> clicking noise every so often (seems to be when streaming buffers wrap from 
> the end back to the start). I think that's a mixer issue rather than an ALSA 
> driver issue however as it occurs with OSS as well as ALSA. At the moment, 
> I'm focusing primarily on the ALSA driver issues.
> 
> I'd be grateful if you could try this modification (best results should be 
> with full acceleration, and UseDirectHW set to "y").
> 
> Davin
> 
> 
> 
> On Thu, 03 Nov 2005 02:18:48 +0000
> Randall Walls <[EMAIL PROTECTED]> wrote:
> 
> > Tested again with BattleZone2 and I'm still getting what sounds like 
> > serious buffer underruns with this new patch. This one seemed to 'skip' 
> > a bit more too, depending on action taking place on screen, but that 
> > could be due to other issues (system load etc...). Running with Alsa as 
> > the audio driver and full hardware acceleration, no emulation. Tested 
> > both with and without the registry key set, and stuttering and the 
> > looping sounds actually seemed to get worse WITH the key. Switched to 
> > OSS driver to test (this would be Alsa's OSS emulation) and I still get 
> > the repeating sounds but some of the other issues are better. 
> > BattleZone2 does have a demo that can still be found online, and there 
> > was a patch on the list not too long ago to get the demo up and running.
> > 
> > Again, let me know if any traces would be benneficial.
> > 
> > Randall Walls
> > 
> > 
> 
--- wine-0.9-progressive/dlls/dsound/mixer.c	Thu Nov  3 09:53:15 2005
+++ wine-0.9/dlls/dsound/mixer.c	Thu Nov  3 20:47:49 2005
@@ -277,7 +277,7 @@
 			ibp += iAdvance;
 			ilen += iAdvance;
 			obp += oAdvance;
-			if (ibp >= (BYTE *)(dsb->buffer->memory + dsb->buflen)) {
+			if (ibp >= (BYTE *)dsb->buffer->memory + dsb->buflen) {
 				if (wrap) {
 					ibp = dsb->buffer->memory;	/* wrap */
 				} else {
@@ -307,14 +307,14 @@
 			ULONG adv = (dsb->freqAcc>>DSOUND_FREQSHIFT) * iAdvance;
 			dsb->freqAcc &= (1<<DSOUND_FREQSHIFT)-1;
 			ipos += adv;
-			if (ipos > dsb->buflen) {
+			ilen += adv;
+			if (ipos >= dsb->buflen) {
 				if (wrap) {
 					ipos -= dsb->buflen;
 				} else {
 					break;
 				}
 			}
-			ilen += adv;
 		}
 	}
 	i *= oAdvance;
@@ -461,20 +461,27 @@
 			return 0;
 		
 		blockalign = dsb->dsound->device->pwfx->nBlockAlign;
-		adjusted_remainder = MulDiv(dsb->dsound->device->pwfx->nAvgBytesPerSec, secondary_remainder, dsb->nAvgBytesPerSec) + blockalign;
+		adjusted_remainder = MulDiv(dsb->dsound->device->pwfx->nAvgBytesPerSec, secondary_remainder, dsb->nAvgBytesPerSec);
 		adjusted_remainder -= adjusted_remainder % blockalign;
 		
+		if (adjusted_remainder == 0) {
+			/* The adjusted remainder must be at least one sample,
+			 * otherwise we will never reach the end of the
+			 * secondary buffer, as there will perpetually be a
+			 * fractional remainder */
+			 adjusted_remainder = blockalign;
+		}
+		
 		assert(adjusted_remainder >= 0);
 		TRACE("secondary_remainder = %d, adjusted_remainder = %d, len = %d\n", secondary_remainder, adjusted_remainder, len);
 		if (adjusted_remainder < len) {
 			TRACE("clipping len to remainder of secondary buffer\n");
 			len = adjusted_remainder;
 		}
-		if (len == 0)
-			return 0;
 	}
 	
 	if (len % dsb->dsound->device->pwfx->nBlockAlign) {
+		/* This shouldn't ever happen anymore */
 		INT nBlockAlign = dsb->dsound->device->pwfx->nBlockAlign;
 		ERR("length not a multiple of block size, len = %d, block size = %d\n", len, nBlockAlign);
 		len = (len / nBlockAlign) * nBlockAlign;	/* data alignment */


Reply via email to