---<br> dlls/dsound/mixer.c | 133 ++------------------------------------------------<br> 1 files changed, 6 insertions(+), 127 deletions(-)<br><br>diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c<br>index e08cbca..0d7afdb 100644<br>
--- a/dlls/dsound/mixer.c<br>+++ b/dlls/dsound/mixer.c<br>@@ -95,138 +95,17 @@ void DSOUND_AmpFactorToVolPan(PDSVOLUMEPAN volpan)<br> TRACE("Vol=%d Pan=%d\n", volpan->lVolume, volpan->lPan);<br> }<br> <br>
-/** Convert a primary buffer position to a pointer position for device->mix_buffer<br>- * device: DirectSoundDevice for which to calculate<br>- * pos: Primary buffer position to converts<br>- * Returns: Offset for mix_buffer<br>
- */<br>-DWORD DSOUND_bufpos_to_mixpos(const DirectSoundDevice* device, DWORD pos)<br>-{<br>- DWORD ret = pos * 32 / device->pwfx->wBitsPerSample;<br>- if (device->pwfx->wBitsPerSample == 32)<br>- ret *= 2;<br>
- return ret;<br>-}<br>-<br>-/* NOTE: Not all secpos have to always be mapped to a bufpos, other way around is always the case<br>- * DWORD64 is used here because a single DWORD wouldn't be big enough to fit the freqAcc for big buffers<br>
- */<br> /** This function converts a 'native' sample pointer to a resampled pointer that fits for primary<br>- * secmixpos is used to decide which freqAcc is needed<br>- * overshot tells what the 'actual' secpos is now (optional)<br>
- */<br>-DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD secpos, DWORD secmixpos, DWORD* overshot)<br>-{<br>- DWORD64 framelen = secpos / dsb->pwfx->nBlockAlign;<br>- DWORD64 freqAdjust = dsb->freqAdjust;<br>
- DWORD64 acc, freqAcc;<br>-<br>- if (secpos < secmixpos)<br>- freqAcc = dsb->freqAccNext;<br>- else freqAcc = dsb->freqAcc;<br>- acc = (framelen << DSOUND_FREQSHIFT) + (freqAdjust - 1 - freqAcc);<br>
- acc /= freqAdjust;<br>- if (overshot)<br>- {<br>- DWORD64 oshot = acc * freqAdjust + freqAcc;<br>- assert(oshot >= framelen << DSOUND_FREQSHIFT);<br>- oshot -= framelen << DSOUND_FREQSHIFT;<br>
- *overshot = (DWORD)oshot;<br>- assert(*overshot < dsb->freqAdjust);<br>- }<br>- return (DWORD)acc * dsb->device->pwfx->nBlockAlign;<br>-}<br>-<br>-/** Convert a resampled pointer that fits for primary to a 'native' sample pointer<br>
- * freqAccNext is used here rather than freqAcc: In case the app wants to fill up to<br>- * the play position it won't overwrite it<br>- */<br>-static DWORD DSOUND_bufpos_to_secpos(const IDirectSoundBufferImpl *dsb, DWORD bufpos)<br>
-{<br>- DWORD oAdv = dsb->device->pwfx->nBlockAlign, iAdv = dsb->pwfx->nBlockAlign, pos;<br>- DWORD64 framelen;<br>- DWORD64 acc;<br>-<br>- framelen = bufpos/oAdv;<br>- acc = framelen * (DWORD64)dsb->freqAdjust + (DWORD64)dsb->freqAccNext;<br>
- acc = acc >> DSOUND_FREQSHIFT;<br>- pos = (DWORD)acc * iAdv;<br>- if (pos >= dsb->buflen)<br>- /* Because of differences between freqAcc and freqAccNext, this might happen */<br>- pos = dsb->buflen - iAdv;<br>
- TRACE("Converted %d/%d to %d/%d\n", bufpos, dsb->tmp_buffer_len, pos, dsb->buflen);<br>- return pos;<br>-}<br>-<br>-/**<br>- * Move freqAccNext to freqAcc, and find new values for buffer length and freqAccNext<br>
*/<br>-static void DSOUND_RecalcFreqAcc(IDirectSoundBufferImpl *dsb)<br>+DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD secpos)<br> {<br>- if (!dsb->freqneeded) return;<br>- dsb->freqAcc = dsb->freqAccNext;<br>
- dsb->tmp_buffer_len = DSOUND_secpos_to_bufpos(dsb, dsb->buflen, 0, &dsb->freqAccNext);<br>- TRACE("New freqadjust: %04x, new buflen: %d\n", dsb->freqAccNext, dsb->tmp_buffer_len);<br>-}<br>
-<br>-/**<br>- * Recalculate the size for temporary buffer, and new writelead<br>- * Should be called when one of the following things occur:<br>- * - Primary buffer format is changed<br>- * - This buffer format (frequency) is changed<br>
- *<br>- * After this, DSOUND_MixToTemporary(dsb, 0, dsb->buflen) should<br>- * be called to refill the temporary buffer with data.<br>- */<br>-void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb)<br>-{<br>- BOOL needremix = TRUE, needresample = (dsb->freq != dsb->device->pwfx->nSamplesPerSec);<br>
- DWORD bAlign = dsb->pwfx->nBlockAlign, pAlign = dsb->device->pwfx->nBlockAlign;<br>- WAVEFORMATEXTENSIBLE *pwfxe;<br>- BOOL ieee = FALSE;<br>-<br>- TRACE("(%p)\n",dsb);<br>-<br>- pwfxe = (WAVEFORMATEXTENSIBLE *) dsb->pwfx;<br>
-<br>- if ((pwfxe->Format.wFormatTag == WAVE_FORMAT_IEEE_FLOAT) || ((pwfxe->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE)<br>- && (IsEqualGUID(&pwfxe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))))<br>
- ieee = TRUE;<br>+ DWORD insample = secpos / dsb->pwfx->nBlockAlign;<br>+ DWORD outsample = insample * dsb->outfreq / dsb->freq;<br>+ DWORD bufpos = outsample * dsb->device->pwfx->nBlockAlign;<br>
<br>- /* calculate the 10ms write lead */<br>- dsb->writelead = (dsb->freq / 100) * dsb->pwfx->nBlockAlign;<br>+ bufpos %= dsb->device->buflen;<br> <br>- if ((dsb->pwfx->wBitsPerSample == dsb->device->pwfx->wBitsPerSample) &&<br>
- (dsb->pwfx->nChannels == dsb->device->pwfx->nChannels) && !needresample && !ieee)<br>- needremix = FALSE;<br>- HeapFree(GetProcessHeap(), 0, dsb->tmp_buffer);<br>- dsb->tmp_buffer = NULL;<br>
- dsb->max_buffer_len = dsb->freqAcc = dsb->freqAccNext = 0;<br>- dsb->freqneeded = needresample;<br>-<br>- if (ieee)<br>- dsb->convert = convertbpp[4][dsb->device->pwfx->wBitsPerSample/8 - 1];<br>
- else<br>- dsb->convert = convertbpp[dsb->pwfx->wBitsPerSample/8 - 1][dsb->device->pwfx->wBitsPerSample/8 - 1];<br>-<br>- dsb->resampleinmixer = FALSE;<br>-<br>- if (needremix)<br>- {<br>
- if (needresample)<br>- DSOUND_RecalcFreqAcc(dsb);<br>- else<br>- dsb->tmp_buffer_len = dsb->buflen / bAlign * pAlign;<br>- dsb->max_buffer_len = dsb->tmp_buffer_len;<br>
- if ((dsb->max_buffer_len <= dsb->device->buflen || dsb->max_buffer_len < ds_snd_shadow_maxsize * 1024 * 1024) && ds_snd_shadow_maxsize >= 0)<br>- dsb->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, dsb->max_buffer_len);<br>
- if (dsb->tmp_buffer)<br>- FillMemory(dsb->tmp_buffer, dsb->tmp_buffer_len, dsb->device->pwfx->wBitsPerSample == 8 ? 128 : 0);<br>- else<br>- dsb->resampleinmixer = TRUE;<br>
- }<br>- else dsb->max_buffer_len = dsb->tmp_buffer_len = dsb->buflen;<br>- dsb->buf_mixpos = DSOUND_secpos_to_bufpos(dsb, dsb->sec_mixpos, 0, NULL);<br>+ return bufpos;<br> }<br> <br> /**<br>-- <br>
1.7.2.3<br><br><br>