[PATCH 10/13] dsound: New resampler--unused functions removed; DSOUND_secpos_to_bufpos() rewritten. (resend)

Krzysztof Nikiel knik00 at gmail.com
Fri Feb 11 05:49:09 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



More information about the wine-patches mailing list