Use separate lines for HRTF history and values

This commit is contained in:
Chris Robinson 2011-06-17 16:22:39 -07:00
parent 753e64c76c
commit edf78b077e
5 changed files with 35 additions and 35 deletions

View File

@ -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;

View File

@ -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; \

View File

@ -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);

View File

@ -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 */

View File

@ -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;