Only use the inner loop for the chorus/flanger template method

This commit is contained in:
Chris Robinson
2013-11-08 05:26:43 -08:00
parent d6eff654be
commit bca959f372
2 changed files with 114 additions and 112 deletions
+57 -56
View File
@@ -161,58 +161,31 @@ static inline void Sinusoid(ALint *delay_left, ALint *delay_right, ALint offset,
*delay_right = fastf2i(lfo_value) + state->delay;
}
#define DECL_TEMPLATE(func) \
static void Process##func(ALchorusState *state, ALuint SamplesToDo, \
const ALfloat *restrict SamplesIn, \
ALfloat (*restrict SamplesOut)[BUFFERSIZE]) \
{ \
const ALint mask = state->BufferLength-1; \
ALint offset = state->offset; \
ALuint it, kt; \
ALuint base; \
\
for(base = 0;base < SamplesToDo;) \
{ \
ALfloat temps[64][2]; \
ALuint td = minu(SamplesToDo-base, 64); \
\
for(it = 0;it < td;it++,offset++) \
{ \
ALint delay_left, delay_right; \
(func)(&delay_left, &delay_right, offset, state); \
\
temps[it][0] = state->SampleBufferLeft[(offset-delay_left)&mask]; \
state->SampleBufferLeft[offset&mask] = (temps[it][0] + \
SamplesIn[it+base]) * \
state->feedback; \
\
temps[it][1] = state->SampleBufferRight[(offset-delay_right)&mask];\
state->SampleBufferRight[offset&mask] = (temps[it][1] + \
SamplesIn[it+base]) * \
state->feedback; \
} \
\
for(kt = 0;kt < MaxChannels;kt++) \
{ \
ALfloat gain = state->Gain[0][kt]; \
if(gain > GAIN_SILENCE_THRESHOLD) \
{ \
for(it = 0;it < td;it++) \
SamplesOut[kt][it+base] += temps[it][0] * gain; \
} \
\
gain = state->Gain[1][kt]; \
if(gain > GAIN_SILENCE_THRESHOLD) \
{ \
for(it = 0;it < td;it++) \
SamplesOut[kt][it+base] += temps[it][1] * gain; \
} \
} \
\
base += td; \
} \
\
state->offset = offset; \
#define DECL_TEMPLATE(Func) \
static void Process##Func(ALchorusState *state, const ALuint SamplesToDo, \
const ALfloat *restrict SamplesIn, ALfloat (*restrict out)[2]) \
{ \
const ALuint bufmask = state->BufferLength-1; \
ALfloat *restrict leftbuf = state->SampleBufferLeft; \
ALfloat *restrict rightbuf = state->SampleBufferRight; \
ALuint offset = state->offset; \
const ALfloat feedback = state->feedback; \
ALuint it; \
\
for(it = 0;it < SamplesToDo;it++) \
{ \
ALint delay_left, delay_right; \
Func(&delay_left, &delay_right, offset, state); \
\
out[it][0] = leftbuf[(offset-delay_left)&bufmask]; \
leftbuf[offset&bufmask] = (out[it][0]+SamplesIn[it]) * feedback; \
\
out[it][1] = rightbuf[(offset-delay_right)&bufmask]; \
rightbuf[offset&bufmask] = (out[it][1]+SamplesIn[it]) * feedback; \
\
offset++; \
} \
state->offset = offset; \
}
DECL_TEMPLATE(Triangle)
@@ -222,10 +195,38 @@ DECL_TEMPLATE(Sinusoid)
static ALvoid ALchorusState_process(ALchorusState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
{
if(state->waveform == AL_CHORUS_WAVEFORM_TRIANGLE)
ProcessTriangle(state, SamplesToDo, SamplesIn, SamplesOut);
else if(state->waveform == AL_CHORUS_WAVEFORM_SINUSOID)
ProcessSinusoid(state, SamplesToDo, SamplesIn, SamplesOut);
ALuint it, kt;
ALuint base;
for(base = 0;base < SamplesToDo;)
{
ALfloat temps[64][2];
ALuint td = minu(SamplesToDo-base, 64);
if(state->waveform == AL_CHORUS_WAVEFORM_TRIANGLE)
ProcessTriangle(state, td, SamplesIn+base, temps);
else if(state->waveform == AL_CHORUS_WAVEFORM_SINUSOID)
ProcessSinusoid(state, td, SamplesIn+base, temps);
for(kt = 0;kt < MaxChannels;kt++)
{
ALfloat gain = state->Gain[0][kt];
if(gain > GAIN_SILENCE_THRESHOLD)
{
for(it = 0;it < td;it++)
SamplesOut[kt][it+base] += temps[it][0] * gain;
}
gain = state->Gain[1][kt];
if(gain > GAIN_SILENCE_THRESHOLD)
{
for(it = 0;it < td;it++)
SamplesOut[kt][it+base] += temps[it][1] * gain;
}
}
base += td;
}
}
static void ALchorusState_Delete(ALchorusState *state)
+57 -56
View File
@@ -161,58 +161,31 @@ static inline void Sinusoid(ALint *delay_left, ALint *delay_right, ALint offset,
*delay_right = fastf2i(lfo_value) + state->delay;
}
#define DECL_TEMPLATE(func) \
static void Process##func(ALflangerState *state, ALuint SamplesToDo, \
const ALfloat *restrict SamplesIn, \
ALfloat (*restrict SamplesOut)[BUFFERSIZE]) \
{ \
const ALint mask = state->BufferLength-1; \
ALint offset = state->offset; \
ALuint it, kt; \
ALuint base; \
\
for(base = 0;base < SamplesToDo;) \
{ \
ALfloat temps[64][2]; \
ALuint td = minu(SamplesToDo-base, 64); \
\
for(it = 0;it < td;it++,offset++) \
{ \
ALint delay_left, delay_right; \
(func)(&delay_left, &delay_right, offset, state); \
\
temps[it][0] = state->SampleBufferLeft[(offset-delay_left)&mask]; \
state->SampleBufferLeft[offset&mask] = (temps[it][0] + \
SamplesIn[it+base]) * \
state->feedback; \
\
temps[it][1] = state->SampleBufferRight[(offset-delay_right)&mask];\
state->SampleBufferRight[offset&mask] = (temps[it][1] + \
SamplesIn[it+base]) * \
state->feedback; \
} \
\
for(kt = 0;kt < MaxChannels;kt++) \
{ \
ALfloat gain = state->Gain[0][kt]; \
if(gain > GAIN_SILENCE_THRESHOLD) \
{ \
for(it = 0;it < td;it++) \
SamplesOut[kt][it+base] += temps[it][0] * gain; \
} \
\
gain = state->Gain[1][kt]; \
if(gain > GAIN_SILENCE_THRESHOLD) \
{ \
for(it = 0;it < td;it++) \
SamplesOut[kt][it+base] += temps[it][1] * gain; \
} \
} \
\
base += td; \
} \
\
state->offset = offset; \
#define DECL_TEMPLATE(Func) \
static void Process##Func(ALflangerState *state, const ALuint SamplesToDo, \
const ALfloat *restrict SamplesIn, ALfloat (*restrict out)[2]) \
{ \
const ALuint bufmask = state->BufferLength-1; \
ALfloat *restrict leftbuf = state->SampleBufferLeft; \
ALfloat *restrict rightbuf = state->SampleBufferRight; \
ALuint offset = state->offset; \
const ALfloat feedback = state->feedback; \
ALuint it; \
\
for(it = 0;it < SamplesToDo;it++) \
{ \
ALint delay_left, delay_right; \
Func(&delay_left, &delay_right, offset, state); \
\
out[it][0] = leftbuf[(offset-delay_left)&bufmask]; \
leftbuf[offset&bufmask] = (out[it][0]+SamplesIn[it]) * feedback; \
\
out[it][1] = rightbuf[(offset-delay_right)&bufmask]; \
rightbuf[offset&bufmask] = (out[it][1]+SamplesIn[it]) * feedback; \
\
offset++; \
} \
state->offset = offset; \
}
DECL_TEMPLATE(Triangle)
@@ -222,10 +195,38 @@ DECL_TEMPLATE(Sinusoid)
static ALvoid ALflangerState_process(ALflangerState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
{
if(state->waveform == AL_FLANGER_WAVEFORM_TRIANGLE)
ProcessTriangle(state, SamplesToDo, SamplesIn, SamplesOut);
else if(state->waveform == AL_FLANGER_WAVEFORM_SINUSOID)
ProcessSinusoid(state, SamplesToDo, SamplesIn, SamplesOut);
ALuint it, kt;
ALuint base;
for(base = 0;base < SamplesToDo;)
{
ALfloat temps[64][2];
ALuint td = minu(SamplesToDo-base, 64);
if(state->waveform == AL_FLANGER_WAVEFORM_TRIANGLE)
ProcessTriangle(state, td, SamplesIn+base, temps);
else if(state->waveform == AL_FLANGER_WAVEFORM_SINUSOID)
ProcessSinusoid(state, td, SamplesIn+base, temps);
for(kt = 0;kt < MaxChannels;kt++)
{
ALfloat gain = state->Gain[0][kt];
if(gain > GAIN_SILENCE_THRESHOLD)
{
for(it = 0;it < td;it++)
SamplesOut[kt][it+base] += temps[it][0] * gain;
}
gain = state->Gain[1][kt];
if(gain > GAIN_SILENCE_THRESHOLD)
{
for(it = 0;it < td;it++)
SamplesOut[kt][it+base] += temps[it][1] * gain;
}
}
base += td;
}
}
static void ALflangerState_Delete(ALflangerState *state)