diff --git a/Alc/ALu.c b/Alc/ALu.c index effa5e2..b14d40b 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -84,6 +84,7 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALfloat WetGain[MAX_SENDS]; ALfloat WetGainHF[MAX_SENDS]; ALint NumSends, Frequency; + ALfloat Pitch; ALfloat cw; ALint i; @@ -100,19 +101,30 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) MaxVolume = ALSource->flMaxGain; //1. Multi-channel buffers always play "normal" + Pitch = ALSource->flPitch; BufferListItem = ALSource->queue; while(BufferListItem != NULL) { ALbuffer *ALBuffer; if((ALBuffer=BufferListItem->buffer) != NULL) { - ALSource->Params.Pitch = ALSource->flPitch*ALBuffer->frequency / - Frequency; + Pitch = Pitch * ALBuffer->frequency / Frequency; break; } BufferListItem = BufferListItem->next; } + if(Pitch > (float)MAX_PITCH) + ALSource->Params.Step = MAX_PITCH< 0.0f)) + ALSource->Params.Step = 1<Params.Step = Pitch*(1<Params.Step == 0) + ALSource->Params.Step = 1; + } + DryGain = SourceVolume; DryGain = __min(DryGain,MaxVolume); DryGain = __max(DryGain,MinVolume); @@ -178,6 +190,7 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon ALfloat WetGainHF[MAX_SENDS]; ALint NumSends, Frequency; ALboolean DupStereo; + ALfloat Pitch; ALenum Format; ALfloat cw; ALint i; @@ -197,19 +210,30 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon MaxVolume = ALSource->flMaxGain; //1. Multi-channel buffers always play "normal" + Pitch = ALSource->flPitch; BufferListItem = ALSource->queue; while(BufferListItem != NULL) { ALbuffer *ALBuffer; if((ALBuffer=BufferListItem->buffer) != NULL) { - ALSource->Params.Pitch = ALSource->flPitch*ALBuffer->frequency / - Frequency; + Pitch = Pitch * ALBuffer->frequency / Frequency; break; } BufferListItem = BufferListItem->next; } + if(Pitch > (float)MAX_PITCH) + ALSource->Params.Step = MAX_PITCH< 0.0f)) + ALSource->Params.Step = 1<Params.Step = Pitch*(1<Params.Step == 0) + ALSource->Params.Step = 1; + } + DryGain = SourceVolume; DryGain = __min(DryGain,MaxVolume); DryGain = __max(DryGain,MinVolume); @@ -663,12 +687,23 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALbuffer *ALBuffer; if((ALBuffer=BufferListItem->buffer) != NULL) { - ALSource->Params.Pitch = Pitch*ALBuffer->frequency / Frequency; + Pitch = Pitch * ALBuffer->frequency / Frequency; break; } BufferListItem = BufferListItem->next; } + if(Pitch > (float)MAX_PITCH) + ALSource->Params.Step = MAX_PITCH< 0.0f)) + ALSource->Params.Step = 1<Params.Step = Pitch*(1<Params.Step == 0) + ALSource->Params.Step = 1; + } + // Use energy-preserving panning algorithm for multi-speaker playback length = __max(OrigDist, MinDist); if(length > 0.0f) diff --git a/Alc/mixer.c b/Alc/mixer.c index 6b0406b..64b4a13 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -36,9 +36,6 @@ #include "alu.h" #include "bs2b.h" -#define FRACTIONBITS 14 -#define FRACTIONMASK ((1L<Params.WetGains[i]-WetSend[i]) / rampLength; - /* Compute 18.14 fixed point step */ - if(ALSource->Params.Pitch > (float)MAX_PITCH) - increment = MAX_PITCH << FRACTIONBITS; - else if(!(ALSource->Params.Pitch > 0.f)) - increment = (1<Params.Pitch*(1L<Params.Step; DryFilter = &ALSource->Params.iirFilter; for(i = 0;i < MAX_SENDS;i++) diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h index 97ecbec..9cee835 100644 --- a/OpenAL32/Include/alSource.h +++ b/OpenAL32/Include/alSource.h @@ -91,7 +91,7 @@ typedef struct ALsource struct { ALfloat DryGains[OUTPUTCHANNELS]; ALfloat WetGains[MAX_SENDS]; - ALfloat Pitch; + ALint Step; struct { FILTER iirFilter; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 73f7022..fe2f42b 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -5,6 +5,7 @@ #include "AL/alc.h" #include "AL/alext.h" +#include #include #ifdef HAVE_FLOAT_H #include @@ -76,6 +77,10 @@ typedef enum { #define BUFFERSIZE 8192 +#define FRACTIONBITS (14) +#define FRACTIONMASK ((1<