Add a flag to specify when the low-pass filter needs to apply
This commit is contained in:
@@ -581,23 +581,29 @@ ALvoid CalcNonAttnSourceParams(ALactivesource *src, const ALCcontext *ALContext)
|
||||
src->WetMix = SelectSendMixer();
|
||||
|
||||
{
|
||||
ALfloat gain = maxf(0.01f, DryGainHF);
|
||||
ALfloat gainhf = maxf(0.01f, DryGainHF);
|
||||
ALfloat hfscale = ALSource->Direct.HFReference / Frequency;
|
||||
for(c = 0;c < num_channels;c++)
|
||||
{
|
||||
src->Direct.Filters[c] = (gainhf != 1.0f) ? AF_LowPass : AF_None;
|
||||
ALfilterState_setParams(
|
||||
&src->Direct.LpFilter[c], ALfilterType_HighShelf, gain,
|
||||
&src->Direct.LpFilter[c], ALfilterType_HighShelf, gainhf,
|
||||
hfscale, 0.0f
|
||||
);
|
||||
}
|
||||
}
|
||||
for(i = 0;i < NumSends;i++)
|
||||
{
|
||||
ALfloat gain = maxf(0.01f, WetGainHF[i]);
|
||||
ALfloat gainhf = maxf(0.01f, WetGainHF[i]);
|
||||
ALfloat hfscale = ALSource->Send[i].HFReference / Frequency;
|
||||
for(c = 0;c < num_channels;c++)
|
||||
{
|
||||
src->Send[i].Filters[c] = (gainhf != 1.0f) ? AF_LowPass : AF_None;
|
||||
ALfilterState_setParams(
|
||||
&src->Send[i].LpFilter[c], ALfilterType_HighShelf, gain,
|
||||
&src->Send[i].LpFilter[c], ALfilterType_HighShelf, gainhf,
|
||||
hfscale, 0.0f
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1082,19 +1088,21 @@ ALvoid CalcSourceParams(ALactivesource *src, const ALCcontext *ALContext)
|
||||
src->WetMix = SelectSendMixer();
|
||||
|
||||
{
|
||||
ALfloat gain = maxf(0.01f, DryGainHF);
|
||||
ALfloat gainhf = maxf(0.01f, DryGainHF);
|
||||
ALfloat hfscale = ALSource->Direct.HFReference / Frequency;
|
||||
src->Direct.Filters[0] = (gainhf != 1.0f) ? AF_LowPass : AF_None;
|
||||
ALfilterState_setParams(
|
||||
&src->Direct.LpFilter[0], ALfilterType_HighShelf, gain,
|
||||
&src->Direct.LpFilter[0], ALfilterType_HighShelf, gainhf,
|
||||
hfscale, 0.0f
|
||||
);
|
||||
}
|
||||
for(i = 0;i < NumSends;i++)
|
||||
{
|
||||
ALfloat gain = maxf(0.01f, WetGainHF[i]);
|
||||
ALfloat gainhf = maxf(0.01f, WetGainHF[i]);
|
||||
ALfloat hfscale = ALSource->Send[i].HFReference / Frequency;
|
||||
src->Direct.Filters[0] = (gainhf != 1.0f) ? AF_LowPass : AF_None;
|
||||
ALfilterState_setParams(
|
||||
&src->Send[i].LpFilter[0], ALfilterType_HighShelf, gain,
|
||||
&src->Send[i].LpFilter[0], ALfilterType_HighShelf, gainhf,
|
||||
hfscale, 0.0f
|
||||
);
|
||||
}
|
||||
|
||||
+17
-8
@@ -84,12 +84,21 @@ static void SilenceData(ALfloat *dst, ALuint samples)
|
||||
}
|
||||
|
||||
|
||||
static void DoFilter(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src,
|
||||
ALuint numsamples)
|
||||
static void DoFilters(ALfilterState *lpfilter, ALfloat *restrict dst, const ALfloat *restrict src,
|
||||
ALuint numsamples, enum ActiveFilters type)
|
||||
{
|
||||
ALuint i;
|
||||
for(i = 0;i < numsamples;i++)
|
||||
dst[i] = ALfilterState_processSingle(filter, src[i]);
|
||||
switch(type)
|
||||
{
|
||||
case AF_None:
|
||||
memcpy(dst, src, numsamples * sizeof(ALfloat));
|
||||
break;
|
||||
|
||||
case AF_LowPass:
|
||||
for(i = 0;i < numsamples;i++)
|
||||
dst[i] = ALfilterState_processSingle(lpfilter, src[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -323,8 +332,8 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
|
||||
{
|
||||
DirectParams *directparms = &src->Direct;
|
||||
|
||||
DoFilter(&directparms->LpFilter[chan], SrcData, ResampledData,
|
||||
DstBufferSize);
|
||||
DoFilters(&directparms->LpFilter[chan], SrcData, ResampledData,
|
||||
DstBufferSize, directparms->Filters[chan]);
|
||||
src->DryMix(directparms, SrcData, chan, OutPos, DstBufferSize);
|
||||
}
|
||||
|
||||
@@ -334,8 +343,8 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
|
||||
if(!sendparms->OutBuffer)
|
||||
continue;
|
||||
|
||||
DoFilter(&sendparms->LpFilter[chan], SrcData, ResampledData,
|
||||
DstBufferSize);
|
||||
DoFilters(&sendparms->LpFilter[chan], SrcData, ResampledData,
|
||||
DstBufferSize, sendparms->Filters[chan]);
|
||||
src->WetMix(sendparms, SrcData, OutPos, DstBufferSize);
|
||||
}
|
||||
}
|
||||
|
||||
+21
-13
@@ -39,6 +39,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum ActiveFilters {
|
||||
AF_None = 0,
|
||||
AF_LowPass = 1,
|
||||
};
|
||||
|
||||
typedef struct HrtfState {
|
||||
alignas(16) ALfloat History[SRC_HISTORY_LENGTH];
|
||||
alignas(16) ALfloat Values[HRIR_LENGTH][2];
|
||||
@@ -54,6 +59,16 @@ typedef struct HrtfParams {
|
||||
typedef struct DirectParams {
|
||||
ALfloat (*OutBuffer)[BUFFERSIZE];
|
||||
|
||||
enum ActiveFilters Filters[MAX_INPUT_CHANNELS];
|
||||
ALfilterState LpFilter[MAX_INPUT_CHANNELS];
|
||||
|
||||
/* If not 'moving', gain/coefficients are set directly without fading. */
|
||||
ALboolean Moving;
|
||||
/* Stepping counter for gain/coefficient fading. */
|
||||
ALuint Counter;
|
||||
/* History/coefficient offset. */
|
||||
ALuint Offset;
|
||||
|
||||
union {
|
||||
struct {
|
||||
HrtfParams Params[MAX_INPUT_CHANNELS];
|
||||
@@ -72,19 +87,17 @@ typedef struct DirectParams {
|
||||
ALfloat Target[MAX_INPUT_CHANNELS][MaxChannels];
|
||||
} Gains;
|
||||
} Mix;
|
||||
/* If not 'moving', gain/coefficients are set directly without fading. */
|
||||
ALboolean Moving;
|
||||
/* Stepping counter for gain/coefficient fading. */
|
||||
ALuint Counter;
|
||||
/* History/coefficient offset. */
|
||||
ALuint Offset;
|
||||
|
||||
ALfilterState LpFilter[MAX_INPUT_CHANNELS];
|
||||
} DirectParams;
|
||||
|
||||
typedef struct SendParams {
|
||||
ALfloat (*OutBuffer)[BUFFERSIZE];
|
||||
|
||||
enum ActiveFilters Filters[MAX_INPUT_CHANNELS];
|
||||
ALfilterState LpFilter[MAX_INPUT_CHANNELS];
|
||||
|
||||
ALboolean Moving;
|
||||
ALuint Counter;
|
||||
|
||||
/* Gain control, which applies to all input channels to a single (mono)
|
||||
* output buffer. */
|
||||
struct {
|
||||
@@ -92,11 +105,6 @@ typedef struct SendParams {
|
||||
ALfloat Step;
|
||||
ALfloat Target;
|
||||
} Gain;
|
||||
|
||||
ALboolean Moving;
|
||||
ALuint Counter;
|
||||
|
||||
ALfilterState LpFilter[MAX_INPUT_CHANNELS];
|
||||
} SendParams;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user