Module: wine Branch: master Commit: f3ed32bca0566ab4ce5ccb7b93b754f41be22fd6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3ed32bca0566ab4ce5ccb7b93...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Thu Jul 12 13:21:43 2007 +0200
dsound: Allow mixing the same buffer multiple times if we are looping.
---
dlls/dsound/mixer.c | 46 ++++++++++++++++++++++++++++++---------------- 1 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index f2bee0d..b5af5fb 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -543,6 +543,12 @@ static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWO dsb->leadin = FALSE; }
+ /* check for notification positions */ + if (dsb->dsbd.dwFlags & DSBCAPS_CTRLPOSITIONNOTIFY && + dsb->state != STATE_STARTING) { + DSOUND_CheckEvent(dsb, dsb->buf_mixpos, ilen); + } + dsb->buf_mixpos += ilen;
if (dsb->buf_mixpos >= dsb->buflen) { @@ -557,6 +563,9 @@ static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWO } }
+ /* increase mix position */ + dsb->primary_mixpos += len; + dsb->primary_mixpos %= dsb->device->buflen; return len; }
@@ -607,27 +616,32 @@ static DWORD DSOUND_MixOne(IDirectSoundBufferImpl *dsb, DWORD playpos, DWORD wri }
/* take into acount already mixed data */ - mixlen = mixlen - primary_done; - - TRACE("mixlen (primary) = %i\n", mixlen); - - /* clip to valid length */ - mixlen = (buflen < mixlen) ? buflen : mixlen; + mixlen -= primary_done;
- TRACE("primary_done=%d, mixlen (buffer)=%d\n", primary_done, mixlen); + TRACE("primary_done=%d, mixlen (primary) = %i\n", primary_done, mixlen);
- /* mix more data */ - mixlen = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixlen); + if ((dsb->playflags & DSBPLAY_LOOPING) && mixlen > buflen) + { + while (mixlen > buflen) + { + DWORD mixedlength = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, buflen); + mixlen -= buflen; + if (!mixedlength) + { + mixlen = 0; + break; + } + }
- /* check for notification positions */ - if (dsb->dsbd.dwFlags & DSBCAPS_CTRLPOSITIONNOTIFY && - dsb->state != STATE_STARTING) { - DSOUND_CheckEvent(dsb, writepos, mixlen / dsb->device->pwfx->nBlockAlign * dsb->pwfx->nBlockAlign); }
- /* increase mix position */ - dsb->primary_mixpos += mixlen; - dsb->primary_mixpos %= dsb->device->buflen; + /* clip to valid length */ + mixlen = (buflen < mixlen) ? buflen : mixlen; + TRACE("mixlen (buffer)=%d\n", mixlen); + + if (mixlen) + /* mix more data */ + mixlen = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixlen);
TRACE("new primary_mixpos=%d, mixed data len=%d, buffer left = %d\n", dsb->primary_mixpos, mixlen, (dsb->buflen - dsb->buf_mixpos));