aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2014-05-18 05:02:34 -0700
committerChris Robinson <[email protected]>2014-05-18 06:23:20 -0700
commita5631e05cc0273289cd5e2e86e554c9559cf2016 (patch)
tree46041845a14529fedfbce8ee7851f3a24c80d2f9
parentcd53a4b74c8bb2b1f8add3f95493f595cea548f9 (diff)
Add a ALfilterState method to process multiple samples at once
-rw-r--r--Alc/mixer.c20
-rw-r--r--Alc/mixer_c.c8
-rw-r--r--OpenAL32/Include/alFilter.h5
-rw-r--r--OpenAL32/alFilter.c2
4 files changed, 26 insertions, 9 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 32d4d308..8db0289e 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -96,20 +96,22 @@ static void DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter,
break;
case AF_LowPass:
- for(i = 0;i < numsamples;i++)
- dst[i] = ALfilterState_processSingle(lpfilter, src[i]);
+ ALfilterState_process(lpfilter, dst, src, numsamples);
break;
-
case AF_HighPass:
- for(i = 0;i < numsamples;i++)
- dst[i] = ALfilterState_processSingle(hpfilter, src[i]);
+ ALfilterState_process(hpfilter, dst, src, numsamples);
break;
case AF_BandPass:
- for(i = 0;i < numsamples;i++)
- dst[i] = ALfilterState_processSingle(hpfilter,
- ALfilterState_processSingle(lpfilter, src[i])
- );
+ for(i = 0;i < numsamples;)
+ {
+ ALfloat temp[64];
+ ALuint todo = minu(64, numsamples-i);
+
+ ALfilterState_process(lpfilter, temp, src, todo);
+ ALfilterState_process(hpfilter, dst, temp, todo);
+ i += todo;
+ }
break;
}
}
diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c
index 2b8325ae..61769547 100644
--- a/Alc/mixer_c.c
+++ b/Alc/mixer_c.c
@@ -46,6 +46,14 @@ DECL_TEMPLATE(cubic32)
#undef DECL_TEMPLATE
+void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *src, ALuint numsamples)
+{
+ ALuint i;
+ for(i = 0;i < numsamples;i++)
+ *(dst++) = ALfilterState_processSingle(filter, *(src++));
+}
+
+
static inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*restrict Values)[2],
const ALuint IrSize,
ALfloat (*restrict Coeffs)[2],
diff --git a/OpenAL32/Include/alFilter.h b/OpenAL32/Include/alFilter.h
index 0b3ab844..62b5fda8 100644
--- a/OpenAL32/Include/alFilter.h
+++ b/OpenAL32/Include/alFilter.h
@@ -36,7 +36,10 @@ typedef struct ALfilterState {
ALfloat y[2]; /* History of two last output samples */
ALfloat a[3]; /* Transfer function coefficients "a" */
ALfloat b[3]; /* Transfer function coefficients "b" */
+
+ void (*process)(struct ALfilterState *self, ALfloat *restrict dst, const ALfloat *src, ALuint numsamples);
} ALfilterState;
+#define ALfilterState_process(a, ...) ((a)->process((a), __VA_ARGS__))
void ALfilterState_clear(ALfilterState *filter);
void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat gain, ALfloat freq_mult, ALfloat bandwidth);
@@ -58,6 +61,8 @@ inline ALfloat ALfilterState_processSingle(ALfilterState *filter, ALfloat sample
return outsmp;
}
+void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *src, ALuint numsamples);
+
typedef struct ALfilter {
// Filter type (AL_FILTER_NULL, ...)
diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c
index ad204bfc..acfae8a6 100644
--- a/OpenAL32/alFilter.c
+++ b/OpenAL32/alFilter.c
@@ -412,6 +412,8 @@ void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat g
filter->a[2] /= filter->a[0];
filter->a[1] /= filter->a[0];
filter->a[0] /= filter->a[0];
+
+ filter->process = ALfilterState_processC;
}