[PATCH 10/13] dsound: Unused functions removed; DSOUND_secpos_to_bufpos() rewritten.

Krzysztof Nikiel knik00 at gmail.com
Fri Feb 11 03:31:04 CST 2011


---
 dlls/dsound/mixer.c |  133
++------------------------------------------------
 1 files changed, 6 insertions(+), 127 deletions(-)

diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index e08cbca..0d7afdb 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -95,138 +95,17 @@ void DSOUND_AmpFactorToVolPan(PDSVOLUMEPAN volpan)
     TRACE("Vol=%d Pan=%d\n", volpan->lVolume, volpan->lPan);
 }

-/** Convert a primary buffer position to a pointer position for
device->mix_buffer
- * device: DirectSoundDevice for which to calculate
- * pos: Primary buffer position to converts
- * Returns: Offset for mix_buffer
- */
-DWORD DSOUND_bufpos_to_mixpos(const DirectSoundDevice* device, DWORD pos)
-{
-    DWORD ret = pos * 32 / device->pwfx->wBitsPerSample;
-    if (device->pwfx->wBitsPerSample == 32)
-        ret *= 2;
-    return ret;
-}
-
-/* NOTE: Not all secpos have to always be mapped to a bufpos, other way
around is always the case
- * DWORD64 is used here because a single DWORD wouldn't be big enough to
fit the freqAcc for big buffers
- */
 /** This function converts a 'native' sample pointer to a resampled pointer
that fits for primary
- * secmixpos is used to decide which freqAcc is needed
- * overshot tells what the 'actual' secpos is now (optional)
- */
-DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD
secpos, DWORD secmixpos, DWORD* overshot)
-{
-    DWORD64 framelen = secpos / dsb->pwfx->nBlockAlign;
-    DWORD64 freqAdjust = dsb->freqAdjust;
-    DWORD64 acc, freqAcc;
-
-    if (secpos < secmixpos)
-        freqAcc = dsb->freqAccNext;
-    else freqAcc = dsb->freqAcc;
-    acc = (framelen << DSOUND_FREQSHIFT) + (freqAdjust - 1 - freqAcc);
-    acc /= freqAdjust;
-    if (overshot)
-    {
-        DWORD64 oshot = acc * freqAdjust + freqAcc;
-        assert(oshot >= framelen << DSOUND_FREQSHIFT);
-        oshot -= framelen << DSOUND_FREQSHIFT;
-        *overshot = (DWORD)oshot;
-        assert(*overshot < dsb->freqAdjust);
-    }
-    return (DWORD)acc * dsb->device->pwfx->nBlockAlign;
-}
-
-/** Convert a resampled pointer that fits for primary to a 'native' sample
pointer
- * freqAccNext is used here rather than freqAcc: In case the app wants to
fill up to
- * the play position it won't overwrite it
- */
-static DWORD DSOUND_bufpos_to_secpos(const IDirectSoundBufferImpl *dsb,
DWORD bufpos)
-{
-    DWORD oAdv = dsb->device->pwfx->nBlockAlign, iAdv =
dsb->pwfx->nBlockAlign, pos;
-    DWORD64 framelen;
-    DWORD64 acc;
-
-    framelen = bufpos/oAdv;
-    acc = framelen * (DWORD64)dsb->freqAdjust + (DWORD64)dsb->freqAccNext;
-    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;
-    TRACE("Converted %d/%d to %d/%d\n", bufpos, dsb->tmp_buffer_len, pos,
dsb->buflen);
-    return pos;
-}
-
-/**
- * Move freqAccNext to freqAcc, and find new values for buffer length and
freqAccNext
  */
-static void DSOUND_RecalcFreqAcc(IDirectSoundBufferImpl *dsb)
+DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD
secpos)
 {
-    if (!dsb->freqneeded) return;
-    dsb->freqAcc = dsb->freqAccNext;
-    dsb->tmp_buffer_len = DSOUND_secpos_to_bufpos(dsb, dsb->buflen, 0,
&dsb->freqAccNext);
-    TRACE("New freqadjust: %04x, new buflen: %d\n", dsb->freqAccNext,
dsb->tmp_buffer_len);
-}
-
-/**
- * Recalculate the size for temporary buffer, and new writelead
- * Should be called when one of the following things occur:
- * - Primary buffer format is changed
- * - This buffer format (frequency) is changed
- *
- * After this, DSOUND_MixToTemporary(dsb, 0, dsb->buflen) should
- * be called to refill the temporary buffer with data.
- */
-void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb)
-{
-    BOOL needremix = TRUE, needresample = (dsb->freq !=
dsb->device->pwfx->nSamplesPerSec);
-    DWORD bAlign = dsb->pwfx->nBlockAlign, pAlign =
dsb->device->pwfx->nBlockAlign;
-    WAVEFORMATEXTENSIBLE *pwfxe;
-    BOOL ieee = FALSE;
-
-    TRACE("(%p)\n",dsb);
-
-    pwfxe = (WAVEFORMATEXTENSIBLE *) dsb->pwfx;
-
-    if ((pwfxe->Format.wFormatTag == WAVE_FORMAT_IEEE_FLOAT) ||
((pwfxe->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE)
-        && (IsEqualGUID(&pwfxe->SubFormat,
&KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))))
-        ieee = TRUE;
+    DWORD insample = secpos / dsb->pwfx->nBlockAlign;
+    DWORD outsample = insample * dsb->outfreq / dsb->freq;
+    DWORD bufpos = outsample * dsb->device->pwfx->nBlockAlign;

-    /* calculate the 10ms write lead */
-    dsb->writelead = (dsb->freq / 100) * dsb->pwfx->nBlockAlign;
+    bufpos %= dsb->device->buflen;

-    if ((dsb->pwfx->wBitsPerSample == dsb->device->pwfx->wBitsPerSample) &&
-        (dsb->pwfx->nChannels == dsb->device->pwfx->nChannels) &&
!needresample && !ieee)
-        needremix = FALSE;
-    HeapFree(GetProcessHeap(), 0, dsb->tmp_buffer);
-    dsb->tmp_buffer = NULL;
-    dsb->max_buffer_len = dsb->freqAcc = dsb->freqAccNext = 0;
-    dsb->freqneeded = needresample;
-
-    if (ieee)
-        dsb->convert = convertbpp[4][dsb->device->pwfx->wBitsPerSample/8 -
1];
-    else
-        dsb->convert = convertbpp[dsb->pwfx->wBitsPerSample/8 -
1][dsb->device->pwfx->wBitsPerSample/8 - 1];
-
-    dsb->resampleinmixer = FALSE;
-
-    if (needremix)
-    {
-        if (needresample)
-            DSOUND_RecalcFreqAcc(dsb);
-        else
-            dsb->tmp_buffer_len = dsb->buflen / bAlign * pAlign;
-        dsb->max_buffer_len = dsb->tmp_buffer_len;
-        if ((dsb->max_buffer_len <= dsb->device->buflen ||
dsb->max_buffer_len < ds_snd_shadow_maxsize * 1024 * 1024) &&
ds_snd_shadow_maxsize >= 0)
-            dsb->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
dsb->max_buffer_len);
-        if (dsb->tmp_buffer)
-            FillMemory(dsb->tmp_buffer, dsb->tmp_buffer_len,
dsb->device->pwfx->wBitsPerSample == 8 ? 128 : 0);
-        else
-            dsb->resampleinmixer = TRUE;
-    }
-    else dsb->max_buffer_len = dsb->tmp_buffer_len = dsb->buflen;
-    dsb->buf_mixpos = DSOUND_secpos_to_bufpos(dsb, dsb->sec_mixpos, 0,
NULL);
+    return bufpos;
 }

 /**
-- 
1.7.2.3
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20110211/c2760f32/attachment-0001.htm>


More information about the wine-patches mailing list