Use separate lines for HRTF history and values
This commit is contained in:
parent
753e64c76c
commit
edf78b077e
@ -82,7 +82,7 @@ void InitHrtf(void)
|
|||||||
}
|
}
|
||||||
if(f != NULL)
|
if(f != NULL)
|
||||||
{
|
{
|
||||||
const ALubyte maxDelay = SRC_HISTORY_LENGTH - HRIR_LENGTH;
|
const ALubyte maxDelay = SRC_HISTORY_LENGTH;
|
||||||
ALboolean failed = AL_FALSE;
|
ALboolean failed = AL_FALSE;
|
||||||
struct HRTF newdata;
|
struct HRTF newdata;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
|
55
Alc/mixer.c
55
Alc/mixer.c
@ -98,10 +98,10 @@ static void Mix_Hrtf_##T##_##sampler(ALsource *Source, ALCdevice *Device, \
|
|||||||
\
|
\
|
||||||
for(i = 0;i < NumChannels;i++) \
|
for(i = 0;i < NumChannels;i++) \
|
||||||
{ \
|
{ \
|
||||||
static const ALuint MaxDelay = SRC_HISTORY_LENGTH - HRIR_LENGTH; \
|
|
||||||
ALfloat (*RESTRICT Coeffs)[2] = Source->Params.HrtfCoeffs[i]; \
|
ALfloat (*RESTRICT Coeffs)[2] = Source->Params.HrtfCoeffs[i]; \
|
||||||
const ALuint *RESTRICT Delay = Source->Params.HrtfDelay[i]; \
|
const ALuint *RESTRICT Delay = Source->Params.HrtfDelay[i]; \
|
||||||
ALfloat (*RESTRICT History)[2] = Source->HrtfHistory[i]; \
|
ALfloat *RESTRICT History = Source->HrtfHistory[i]; \
|
||||||
|
ALfloat (*RESTRICT Values)[2] = Source->HrtfValues[i]; \
|
||||||
ALuint Offset = Source->HrtfOffset + OutPos; \
|
ALuint Offset = Source->HrtfOffset + OutPos; \
|
||||||
\
|
\
|
||||||
pos = 0; \
|
pos = 0; \
|
||||||
@ -112,18 +112,17 @@ static void Mix_Hrtf_##T##_##sampler(ALsource *Source, ALCdevice *Device, \
|
|||||||
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
||||||
value = lpFilter2PC(DryFilter, i, value); \
|
value = lpFilter2PC(DryFilter, i, value); \
|
||||||
\
|
\
|
||||||
History[Offset&SRC_HISTORY_MASK][0] = value; \
|
History[Offset&SRC_HISTORY_MASK] = value; \
|
||||||
History[Offset&SRC_HISTORY_MASK][1] = value; \
|
|
||||||
\
|
\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][0] = \
|
Values[Offset&HRIR_MASK][0] = \
|
||||||
History[(Offset-Delay[0])&SRC_HISTORY_MASK][0];\
|
History[(Offset-Delay[0])&SRC_HISTORY_MASK];\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][1] = \
|
Values[Offset&HRIR_MASK][1] = \
|
||||||
History[(Offset-Delay[1])&SRC_HISTORY_MASK][1];\
|
History[(Offset-Delay[1])&SRC_HISTORY_MASK];\
|
||||||
for(c = 0;c < HRIR_LENGTH;c++) \
|
for(c = 0;c < HRIR_LENGTH;c++) \
|
||||||
{ \
|
{ \
|
||||||
const ALuint off = (Offset-MaxDelay-c)&SRC_HISTORY_MASK; \
|
const ALuint off = (Offset-c)&HRIR_MASK; \
|
||||||
ClickRemoval[FRONT_LEFT] -= History[off][0] * Coeffs[c][0]; \
|
ClickRemoval[FRONT_LEFT] -= Values[off][0] * Coeffs[c][0]; \
|
||||||
ClickRemoval[FRONT_RIGHT] -= History[off][1] * Coeffs[c][1]; \
|
ClickRemoval[FRONT_RIGHT] -= Values[off][1] * Coeffs[c][1]; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
|
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
|
||||||
@ -131,18 +130,17 @@ static void Mix_Hrtf_##T##_##sampler(ALsource *Source, ALCdevice *Device, \
|
|||||||
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
||||||
value = lpFilter2P(DryFilter, i, value); \
|
value = lpFilter2P(DryFilter, i, value); \
|
||||||
\
|
\
|
||||||
History[Offset&SRC_HISTORY_MASK][0] = value; \
|
History[Offset&SRC_HISTORY_MASK] = value; \
|
||||||
History[Offset&SRC_HISTORY_MASK][1] = value; \
|
|
||||||
\
|
\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][0] = \
|
Values[Offset&HRIR_MASK][0] = \
|
||||||
History[(Offset-Delay[0])&SRC_HISTORY_MASK][0];\
|
History[(Offset-Delay[0])&SRC_HISTORY_MASK];\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][1] = \
|
Values[Offset&HRIR_MASK][1] = \
|
||||||
History[(Offset-Delay[1])&SRC_HISTORY_MASK][1];\
|
History[(Offset-Delay[1])&SRC_HISTORY_MASK];\
|
||||||
for(c = 0;c < HRIR_LENGTH;c++) \
|
for(c = 0;c < HRIR_LENGTH;c++) \
|
||||||
{ \
|
{ \
|
||||||
const ALuint off = (Offset-MaxDelay-c)&SRC_HISTORY_MASK; \
|
const ALuint off = (Offset-c)&HRIR_MASK; \
|
||||||
DryBuffer[OutPos][FRONT_LEFT] += History[off][0] * Coeffs[c][0];\
|
DryBuffer[OutPos][FRONT_LEFT] += Values[off][0] * Coeffs[c][0];\
|
||||||
DryBuffer[OutPos][FRONT_RIGHT] += History[off][1] * Coeffs[c][1];\
|
DryBuffer[OutPos][FRONT_RIGHT] += Values[off][1] * Coeffs[c][1];\
|
||||||
} \
|
} \
|
||||||
Offset++; \
|
Offset++; \
|
||||||
\
|
\
|
||||||
@ -156,18 +154,17 @@ static void Mix_Hrtf_##T##_##sampler(ALsource *Source, ALCdevice *Device, \
|
|||||||
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
value = sampler(data + pos*NumChannels + i, NumChannels, frac); \
|
||||||
value = lpFilter2PC(DryFilter, i, value); \
|
value = lpFilter2PC(DryFilter, i, value); \
|
||||||
\
|
\
|
||||||
History[Offset&SRC_HISTORY_MASK][0] = value; \
|
History[Offset&SRC_HISTORY_MASK] = value; \
|
||||||
History[Offset&SRC_HISTORY_MASK][1] = value; \
|
|
||||||
\
|
\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][0] = \
|
Values[Offset&HRIR_MASK][0] = \
|
||||||
History[(Offset-Delay[0])&SRC_HISTORY_MASK][0];\
|
History[(Offset-Delay[0])&SRC_HISTORY_MASK];\
|
||||||
History[(Offset-MaxDelay)&SRC_HISTORY_MASK][1] = \
|
Values[Offset&HRIR_MASK][1] = \
|
||||||
History[(Offset-Delay[1])&SRC_HISTORY_MASK][1];\
|
History[(Offset-Delay[1])&SRC_HISTORY_MASK];\
|
||||||
for(c = 0;c < HRIR_LENGTH;c++) \
|
for(c = 0;c < HRIR_LENGTH;c++) \
|
||||||
{ \
|
{ \
|
||||||
const ALuint off = (Offset-MaxDelay-c)&SRC_HISTORY_MASK; \
|
const ALuint off = (Offset-c)&HRIR_MASK; \
|
||||||
PendingClicks[FRONT_LEFT] += History[off][0] * Coeffs[c][0]; \
|
PendingClicks[FRONT_LEFT] += Values[off][0] * Coeffs[c][0]; \
|
||||||
PendingClicks[FRONT_RIGHT] += History[off][1] * Coeffs[c][1]; \
|
PendingClicks[FRONT_RIGHT] += Values[off][1] * Coeffs[c][1]; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
OutPos -= BufferSize; \
|
OutPos -= BufferSize; \
|
||||||
|
@ -497,7 +497,7 @@ ALboolean IsValidChannels(ALenum type);
|
|||||||
|
|
||||||
#define HRIR_BITS (5)
|
#define HRIR_BITS (5)
|
||||||
#define HRIR_LENGTH (1<<HRIR_BITS)
|
#define HRIR_LENGTH (1<<HRIR_BITS)
|
||||||
#define HRIR_LENGTH_MASK (HRIR_LENGTH-1)
|
#define HRIR_MASK (HRIR_LENGTH-1)
|
||||||
void InitHrtf(void);
|
void InitHrtf(void);
|
||||||
void GetHrtfCoeffs(ALfloat elevation, ALfloat angle, const ALshort **left, const ALshort **right, ALuint *ldelay, ALuint *rdelay);
|
void GetHrtfCoeffs(ALfloat elevation, ALfloat angle, const ALshort **left, const ALshort **right, ALuint *ldelay, ALuint *rdelay);
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SRC_HISTORY_BITS (7)
|
#define SRC_HISTORY_BITS (6)
|
||||||
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
|
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
|
||||||
#define SRC_HISTORY_MASK (SRC_HISTORY_LENGTH-1)
|
#define SRC_HISTORY_MASK (SRC_HISTORY_LENGTH-1)
|
||||||
|
|
||||||
@ -94,7 +94,8 @@ typedef struct ALsource
|
|||||||
ALuint SampleSize;
|
ALuint SampleSize;
|
||||||
|
|
||||||
/* HRTF info */
|
/* HRTF info */
|
||||||
ALfloat HrtfHistory[MAXCHANNELS][SRC_HISTORY_LENGTH][2];
|
ALfloat HrtfHistory[MAXCHANNELS][SRC_HISTORY_LENGTH];
|
||||||
|
ALfloat HrtfValues[MAXCHANNELS][HRIR_LENGTH][2];
|
||||||
ALuint HrtfOffset;
|
ALuint HrtfOffset;
|
||||||
|
|
||||||
/* Current target parameters used for mixing */
|
/* Current target parameters used for mixing */
|
||||||
|
@ -1382,9 +1382,11 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
|
|||||||
{
|
{
|
||||||
ALuint k;
|
ALuint k;
|
||||||
for(k = 0;k < SRC_HISTORY_LENGTH;k++)
|
for(k = 0;k < SRC_HISTORY_LENGTH;k++)
|
||||||
|
Source->HrtfHistory[j][k] = 0.0f;
|
||||||
|
for(k = 0;k < HRIR_LENGTH;k++)
|
||||||
{
|
{
|
||||||
Source->HrtfHistory[j][k][0] = 0.0f;
|
Source->HrtfValues[j][k][0] = 0.0f;
|
||||||
Source->HrtfHistory[j][k][1] = 0.0f;
|
Source->HrtfValues[j][k][1] = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Source->HrtfOffset = 0;
|
Source->HrtfOffset = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user