diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index e89847c8f11..436db88eed6 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -380,11 +380,16 @@ static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWO len = fraglen; if (!(dsb->playflags & DSBPLAY_LOOPING)) { - INT temp = MulDiv(dsb->dsound->device->pwfx->nAvgBytesPerSec, dsb->buflen, - dsb->nAvgBytesPerSec) - - MulDiv(dsb->dsound->device->pwfx->nAvgBytesPerSec, dsb->buf_mixpos, - dsb->nAvgBytesPerSec); - len = min(len, temp); + int secondary_remainder = dsb->buflen - dsb->buf_mixpos; + int adjusted_remainder = MulDiv(dsb->dsound->device->pwfx->nAvgBytesPerSec, secondary_remainder, dsb->nAvgBytesPerSec); + assert(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) { @@ -393,11 +398,6 @@ static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWO len = (len / nBlockAlign) * nBlockAlign; /* data alignment */ } - if (len == 0) { - /* This should only happen if we aren't looping and temp < nBlockAlign */ - return 0; - } - if ((buf = ibuf = DSOUND_tmpbuffer(dsb->dsound->device, len)) == NULL) return 0;