[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