Calculate the source stepping value with the param calculations
This commit is contained in:
parent
d6dc855511
commit
5f22d30fc9
45
Alc/ALu.c
45
Alc/ALu.c
@ -84,6 +84,7 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
|||||||
ALfloat WetGain[MAX_SENDS];
|
ALfloat WetGain[MAX_SENDS];
|
||||||
ALfloat WetGainHF[MAX_SENDS];
|
ALfloat WetGainHF[MAX_SENDS];
|
||||||
ALint NumSends, Frequency;
|
ALint NumSends, Frequency;
|
||||||
|
ALfloat Pitch;
|
||||||
ALfloat cw;
|
ALfloat cw;
|
||||||
ALint i;
|
ALint i;
|
||||||
|
|
||||||
@ -100,19 +101,30 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
|||||||
MaxVolume = ALSource->flMaxGain;
|
MaxVolume = ALSource->flMaxGain;
|
||||||
|
|
||||||
//1. Multi-channel buffers always play "normal"
|
//1. Multi-channel buffers always play "normal"
|
||||||
|
Pitch = ALSource->flPitch;
|
||||||
BufferListItem = ALSource->queue;
|
BufferListItem = ALSource->queue;
|
||||||
while(BufferListItem != NULL)
|
while(BufferListItem != NULL)
|
||||||
{
|
{
|
||||||
ALbuffer *ALBuffer;
|
ALbuffer *ALBuffer;
|
||||||
if((ALBuffer=BufferListItem->buffer) != NULL)
|
if((ALBuffer=BufferListItem->buffer) != NULL)
|
||||||
{
|
{
|
||||||
ALSource->Params.Pitch = ALSource->flPitch*ALBuffer->frequency /
|
Pitch = Pitch * ALBuffer->frequency / Frequency;
|
||||||
Frequency;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferListItem = BufferListItem->next;
|
BufferListItem = BufferListItem->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Pitch > (float)MAX_PITCH)
|
||||||
|
ALSource->Params.Step = MAX_PITCH<<FRACTIONBITS;
|
||||||
|
else if(!(Pitch > 0.0f))
|
||||||
|
ALSource->Params.Step = 1<<FRACTIONBITS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALSource->Params.Step = Pitch*(1<<FRACTIONBITS);
|
||||||
|
if(ALSource->Params.Step == 0)
|
||||||
|
ALSource->Params.Step = 1;
|
||||||
|
}
|
||||||
|
|
||||||
DryGain = SourceVolume;
|
DryGain = SourceVolume;
|
||||||
DryGain = __min(DryGain,MaxVolume);
|
DryGain = __min(DryGain,MaxVolume);
|
||||||
DryGain = __max(DryGain,MinVolume);
|
DryGain = __max(DryGain,MinVolume);
|
||||||
@ -178,6 +190,7 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon
|
|||||||
ALfloat WetGainHF[MAX_SENDS];
|
ALfloat WetGainHF[MAX_SENDS];
|
||||||
ALint NumSends, Frequency;
|
ALint NumSends, Frequency;
|
||||||
ALboolean DupStereo;
|
ALboolean DupStereo;
|
||||||
|
ALfloat Pitch;
|
||||||
ALenum Format;
|
ALenum Format;
|
||||||
ALfloat cw;
|
ALfloat cw;
|
||||||
ALint i;
|
ALint i;
|
||||||
@ -197,19 +210,30 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon
|
|||||||
MaxVolume = ALSource->flMaxGain;
|
MaxVolume = ALSource->flMaxGain;
|
||||||
|
|
||||||
//1. Multi-channel buffers always play "normal"
|
//1. Multi-channel buffers always play "normal"
|
||||||
|
Pitch = ALSource->flPitch;
|
||||||
BufferListItem = ALSource->queue;
|
BufferListItem = ALSource->queue;
|
||||||
while(BufferListItem != NULL)
|
while(BufferListItem != NULL)
|
||||||
{
|
{
|
||||||
ALbuffer *ALBuffer;
|
ALbuffer *ALBuffer;
|
||||||
if((ALBuffer=BufferListItem->buffer) != NULL)
|
if((ALBuffer=BufferListItem->buffer) != NULL)
|
||||||
{
|
{
|
||||||
ALSource->Params.Pitch = ALSource->flPitch*ALBuffer->frequency /
|
Pitch = Pitch * ALBuffer->frequency / Frequency;
|
||||||
Frequency;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferListItem = BufferListItem->next;
|
BufferListItem = BufferListItem->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Pitch > (float)MAX_PITCH)
|
||||||
|
ALSource->Params.Step = MAX_PITCH<<FRACTIONBITS;
|
||||||
|
else if(!(Pitch > 0.0f))
|
||||||
|
ALSource->Params.Step = 1<<FRACTIONBITS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALSource->Params.Step = Pitch*(1<<FRACTIONBITS);
|
||||||
|
if(ALSource->Params.Step == 0)
|
||||||
|
ALSource->Params.Step = 1;
|
||||||
|
}
|
||||||
|
|
||||||
DryGain = SourceVolume;
|
DryGain = SourceVolume;
|
||||||
DryGain = __min(DryGain,MaxVolume);
|
DryGain = __min(DryGain,MaxVolume);
|
||||||
DryGain = __max(DryGain,MinVolume);
|
DryGain = __max(DryGain,MinVolume);
|
||||||
@ -663,12 +687,23 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
|||||||
ALbuffer *ALBuffer;
|
ALbuffer *ALBuffer;
|
||||||
if((ALBuffer=BufferListItem->buffer) != NULL)
|
if((ALBuffer=BufferListItem->buffer) != NULL)
|
||||||
{
|
{
|
||||||
ALSource->Params.Pitch = Pitch*ALBuffer->frequency / Frequency;
|
Pitch = Pitch * ALBuffer->frequency / Frequency;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferListItem = BufferListItem->next;
|
BufferListItem = BufferListItem->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Pitch > (float)MAX_PITCH)
|
||||||
|
ALSource->Params.Step = MAX_PITCH<<FRACTIONBITS;
|
||||||
|
else if(!(Pitch > 0.0f))
|
||||||
|
ALSource->Params.Step = 1<<FRACTIONBITS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALSource->Params.Step = Pitch*(1<<FRACTIONBITS);
|
||||||
|
if(ALSource->Params.Step == 0)
|
||||||
|
ALSource->Params.Step = 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Use energy-preserving panning algorithm for multi-speaker playback
|
// Use energy-preserving panning algorithm for multi-speaker playback
|
||||||
length = __max(OrigDist, MinDist);
|
length = __max(OrigDist, MinDist);
|
||||||
if(length > 0.0f)
|
if(length > 0.0f)
|
||||||
|
15
Alc/mixer.c
15
Alc/mixer.c
@ -36,9 +36,6 @@
|
|||||||
#include "alu.h"
|
#include "alu.h"
|
||||||
#include "bs2b.h"
|
#include "bs2b.h"
|
||||||
|
|
||||||
#define FRACTIONBITS 14
|
|
||||||
#define FRACTIONMASK ((1L<<FRACTIONBITS)-1)
|
|
||||||
#define MAX_PITCH 65536
|
|
||||||
|
|
||||||
/* Minimum ramp length in milliseconds. The value below was chosen to
|
/* Minimum ramp length in milliseconds. The value below was chosen to
|
||||||
* adequately reduce clicks and pops from harsh gain changes. */
|
* adequately reduce clicks and pops from harsh gain changes. */
|
||||||
@ -156,16 +153,8 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext,
|
|||||||
wetGainStep[i] = (ALSource->Params.WetGains[i]-WetSend[i]) /
|
wetGainStep[i] = (ALSource->Params.WetGains[i]-WetSend[i]) /
|
||||||
rampLength;
|
rampLength;
|
||||||
|
|
||||||
/* Compute 18.14 fixed point step */
|
/* Get fixed point step */
|
||||||
if(ALSource->Params.Pitch > (float)MAX_PITCH)
|
increment = ALSource->Params.Step;
|
||||||
increment = MAX_PITCH << FRACTIONBITS;
|
|
||||||
else if(!(ALSource->Params.Pitch > 0.f))
|
|
||||||
increment = (1<<FRACTIONBITS);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
increment = (ALint)(ALSource->Params.Pitch*(1L<<FRACTIONBITS));
|
|
||||||
if(increment == 0) increment = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
DryFilter = &ALSource->Params.iirFilter;
|
DryFilter = &ALSource->Params.iirFilter;
|
||||||
for(i = 0;i < MAX_SENDS;i++)
|
for(i = 0;i < MAX_SENDS;i++)
|
||||||
|
@ -91,7 +91,7 @@ typedef struct ALsource
|
|||||||
struct {
|
struct {
|
||||||
ALfloat DryGains[OUTPUTCHANNELS];
|
ALfloat DryGains[OUTPUTCHANNELS];
|
||||||
ALfloat WetGains[MAX_SENDS];
|
ALfloat WetGains[MAX_SENDS];
|
||||||
ALfloat Pitch;
|
ALint Step;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
FILTER iirFilter;
|
FILTER iirFilter;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "AL/alc.h"
|
#include "AL/alc.h"
|
||||||
#include "AL/alext.h"
|
#include "AL/alext.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#ifdef HAVE_FLOAT_H
|
#ifdef HAVE_FLOAT_H
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
@ -76,6 +77,10 @@ typedef enum {
|
|||||||
|
|
||||||
#define BUFFERSIZE 8192
|
#define BUFFERSIZE 8192
|
||||||
|
|
||||||
|
#define FRACTIONBITS (14)
|
||||||
|
#define FRACTIONMASK ((1<<FRACTIONBITS)-1)
|
||||||
|
#define MAX_PITCH (INT_MAX & ~FRACTIONMASK)
|
||||||
|
|
||||||
/* NOTE: The AL_FORMAT_REAR* enums aren't handled here because they're
|
/* NOTE: The AL_FORMAT_REAR* enums aren't handled here because they're
|
||||||
* converted to AL_FORMAT_QUAD* when loaded */
|
* converted to AL_FORMAT_QUAD* when loaded */
|
||||||
static __inline ALuint aluBytesFromFormat(ALenum format)
|
static __inline ALuint aluBytesFromFormat(ALenum format)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user