diff options
author | Chris Robinson <[email protected]> | 2013-07-02 06:57:27 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-07-02 06:57:27 -0700 |
commit | 52096234e117273fba4b258d789a58580c56ba88 (patch) | |
tree | cefe47c1362c85a51a3cc46042c2c636295b578d | |
parent | 61c6a38f041ac5b7cf265eb718763d550119cf70 (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.c | 18 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 9 | ||||
-rw-r--r-- | OpenAL32/alAuxEffectSlot.c | 2 |
3 files changed, 6 insertions, 23 deletions
@@ -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; |