aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-07-02 06:57:27 -0700
committerChris Robinson <[email protected]>2013-07-02 06:57:27 -0700
commit52096234e117273fba4b258d789a58580c56ba88 (patch)
treecefe47c1362c85a51a3cc46042c2c636295b578d
parent61c6a38f041ac5b7cf265eb718763d550119cf70 (diff)
Limit the source step to 10
This means the combination of the buffer frequency, source pitch, and doppler shift can't exceed 10x the device playback frequency. This is needed to keep the mixer from starving with a really high increment, causing small DstBufferSize values that require a lot of iterations.
-rw-r--r--Alc/ALu.c18
-rw-r--r--OpenAL32/Include/alMain.h9
-rw-r--r--OpenAL32/alAuxEffectSlot.c2
3 files changed, 6 insertions, 23 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index dd7392fc..608db651 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -279,14 +279,9 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
ALbuffer *ALBuffer;
if((ALBuffer=BufferListItem->buffer) != NULL)
{
- ALsizei maxstep = BUFFERSIZE;
- maxstep -= ResamplerPadding[Resampler] +
- ResamplerPrePadding[Resampler] + 1;
- maxstep = mini(maxstep, INT_MAX>>FRACTIONBITS);
-
Pitch = Pitch * ALBuffer->Frequency / Frequency;
- if(Pitch > (ALfloat)maxstep)
- ALSource->Params.Step = maxstep<<FRACTIONBITS;
+ if(Pitch > 10.0f)
+ ALSource->Params.Step = 10<<FRACTIONBITS;
else
{
ALSource->Params.Step = fastf2i(Pitch*FRACTIONONE);
@@ -777,14 +772,9 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
{
/* Calculate fixed-point stepping value, based on the pitch, buffer
* frequency, and output frequency. */
- ALsizei maxstep = BUFFERSIZE;
- maxstep -= ResamplerPadding[Resampler] +
- ResamplerPrePadding[Resampler] + 1;
- maxstep = mini(maxstep, INT_MAX>>FRACTIONBITS);
-
Pitch = Pitch * ALBuffer->Frequency / Frequency;
- if(Pitch > (ALfloat)maxstep)
- ALSource->Params.Step = maxstep<<FRACTIONBITS;
+ if(Pitch > 10.0f)
+ ALSource->Params.Step = 10<<FRACTIONBITS;
else
{
ALSource->Params.Step = fastf2i(Pitch*FRACTIONONE);
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 9bee7399..2e18201a 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -577,15 +577,8 @@ enum DeviceType {
* more memory, while smaller values may need more iterations. The value needs
* to be a sensible size, however, as it constrains the max stepping value used
* for mixing, as well as the maximum number of samples per mixing iteration.
- *
- * The mixer requires being able to do two samplings per mixing loop. With the
- * cubic resampler (which requires 3 padding samples), this limits a 2048
- * buffer size to about 2044. This means that buffer_freq*source_pitch cannot
- * exceed device_freq*2044 for a 32-bit buffer.
*/
-#ifndef BUFFERSIZE
-#define BUFFERSIZE 2048
-#endif
+#define BUFFERSIZE (2048u)
struct ALCdevice_struct
diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c
index b3d0d826..eec41081 100644
--- a/OpenAL32/alAuxEffectSlot.c
+++ b/OpenAL32/alAuxEffectSlot.c
@@ -546,7 +546,7 @@ ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *e
ALenum InitEffectSlot(ALeffectslot *slot)
{
ALeffectStateFactory *factory;
- ALint i, c;
+ ALuint i, c;
slot->EffectType = AL_EFFECT_NULL;