Maarten Lankhorst : dsound: Allow mixing the same buffer multiple times if we are looping.
Module: wine Branch: master Commit: f3ed32bca0566ab4ce5ccb7b93b754f41be22fd6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3ed32bca0566ab4ce5ccb7b93... Author: Maarten Lankhorst <m.b.lankhorst(a)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));
participants (1)
-
Alexandre Julliard