http://bugs.winehq.org/show_bug.cgi?id=14717
--- Comment #219 from Alexander E. Patrakov patrakov@gmail.com 2011-11-06 09:54:29 CST --- OK, I found that clicks appear due to the use of freqAccNext in DSOUND_bufpos_to_secpos(). Applying ths patch removes them completely, but I am not sure if the rationale in the comment above DSOUND_bufpos_to_secpos() is valid.
--- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -149,12 +149,12 @@ static DWORD DSOUND_bufpos_to_secpos(const IDirectSoundBufferImpl *dsb, DWORD bu DWORD64 acc;
framelen = bufpos/oAdv; - acc = framelen * (DWORD64)dsb->freqAdjust + (DWORD64)dsb->freqAccNext; + acc = framelen * (DWORD64)dsb->freqAdjust + (DWORD64)dsb->freqAcc; acc = acc >> DSOUND_FREQSHIFT; pos = (DWORD)acc * iAdv; - if (pos >= dsb->buflen) - /* Because of differences between freqAcc and freqAccNext, this might happen */ - pos = dsb->buflen - iAdv; +// if (pos >= dsb->buflen) +// /* Because of differences between freqAcc and freqAccNext, this might happen */ +// pos = dsb->buflen - iAdv; TRACE("Converted %d/%d to %d/%d\n", bufpos, dsb->tmp_buffer_len, pos, dsb->buflen); return pos; } @@ -472,10 +472,6 @@ static void DSOUND_MixToTemporary(const IDirectSoundBufferImpl *dsb, DWORD tmp_l INT size = tmp_len / oAdvance; DWORD freqAcc;
- DWORD len = DSOUND_bufpos_to_secpos(dsb, dsb->buf_mixpos + tmp_len) - dsb->sec_mixpos; - - assert(dsb->sec_mixpos + len <= dsb->buflen); - if (dsb->device->tmp_buffer_len < tmp_len || !dsb->device->tmp_buffer) { dsb->device->tmp_buffer_len = tmp_len;