aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-01-11 04:48:18 -0800
committerChris Robinson <[email protected]>2018-01-11 04:48:18 -0800
commit9c33f4aea8c573a239050c3e93f784eb6a70e841 (patch)
tree24695c867f93ec588c7a5c43ae3a81da3fbc847b /Alc
parentf55583330baa5e0ce40aba22629b08dc608e6d84 (diff)
Use MixSamples for the dedicated and ring modulator effect output
Diffstat (limited to 'Alc')
-rw-r--r--Alc/effects/dedicated.c38
-rw-r--r--Alc/effects/modulator.c59
2 files changed, 40 insertions, 57 deletions
diff --git a/Alc/effects/dedicated.c b/Alc/effects/dedicated.c
index af8dc954..7dc2545b 100644
--- a/Alc/effects/dedicated.c
+++ b/Alc/effects/dedicated.c
@@ -32,7 +32,8 @@
typedef struct ALdedicatedState {
DERIVE_FROM_TYPE(ALeffectState);
- ALfloat gains[MAX_OUTPUT_CHANNELS];
+ ALfloat CurrentGains[MAX_OUTPUT_CHANNELS];
+ ALfloat TargetGains[MAX_OUTPUT_CHANNELS];
} ALdedicatedState;
static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state);
@@ -46,13 +47,8 @@ DEFINE_ALEFFECTSTATE_VTABLE(ALdedicatedState);
static void ALdedicatedState_Construct(ALdedicatedState *state)
{
- ALsizei s;
-
ALeffectState_Construct(STATIC_CAST(ALeffectState, state));
SET_VTABLE2(ALdedicatedState, ALeffectState, state);
-
- for(s = 0;s < MAX_OUTPUT_CHANNELS;s++)
- state->gains[s] = 0.0f;
}
static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state)
@@ -60,8 +56,11 @@ static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state)
ALeffectState_Destruct(STATIC_CAST(ALeffectState,state));
}
-static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *UNUSED(state), ALCdevice *UNUSED(device))
+static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *state, ALCdevice *UNUSED(device))
{
+ ALsizei i;
+ for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
+ state->CurrentGains[i] = 0.0f;
return AL_TRUE;
}
@@ -69,10 +68,10 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext
{
const ALCdevice *device = context->Device;
ALfloat Gain;
- ALuint i;
+ ALsizei i;
for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
- state->gains[i] = 0.0f;
+ state->TargetGains[i] = 0.0f;
Gain = slot->Params.Gain * props->Dedicated.Gain;
if(slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT)
@@ -82,7 +81,7 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext
{
STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer;
STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels;
- state->gains[idx] = Gain;
+ state->TargetGains[idx] = Gain;
}
}
else if(slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE)
@@ -94,7 +93,7 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext
{
STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer;
STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels;
- state->gains[idx] = Gain;
+ state->TargetGains[idx] = Gain;
}
else
{
@@ -103,26 +102,15 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext
STATIC_CAST(ALeffectState,state)->OutBuffer = device->Dry.Buffer;
STATIC_CAST(ALeffectState,state)->OutChannels = device->Dry.NumChannels;
- ComputeDryPanGains(&device->Dry, coeffs, Gain, state->gains);
+ ComputeDryPanGains(&device->Dry, coeffs, Gain, state->TargetGains);
}
}
}
static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
{
- ALsizei i, c;
-
- SamplesIn = ASSUME_ALIGNED(SamplesIn, 16);
- SamplesOut = ASSUME_ALIGNED(SamplesOut, 16);
- for(c = 0;c < NumChannels;c++)
- {
- const ALfloat gain = state->gains[c];
- if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD))
- continue;
-
- for(i = 0;i < SamplesToDo;i++)
- SamplesOut[c][i] += SamplesIn[0][i] * gain;
- }
+ MixSamples(SamplesIn[0], NumChannels, SamplesOut, state->CurrentGains,
+ state->TargetGains, SamplesToDo, 0, SamplesToDo);
}
diff --git a/Alc/effects/modulator.c b/Alc/effects/modulator.c
index 70751d87..431941ce 100644
--- a/Alc/effects/modulator.c
+++ b/Alc/effects/modulator.c
@@ -38,9 +38,12 @@ typedef struct ALmodulatorState {
ALsizei index;
ALsizei step;
- ALfloat Gain[MAX_EFFECT_CHANNELS][MAX_OUTPUT_CHANNELS];
+ struct {
+ ALfilterState Filter;
- ALfilterState Filter[MAX_EFFECT_CHANNELS];
+ ALfloat CurrentGains[MAX_OUTPUT_CHANNELS];
+ ALfloat TargetGains[MAX_OUTPUT_CHANNELS];
+ } Chans[MAX_EFFECT_CHANNELS];
} ALmodulatorState;
static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state);
@@ -93,16 +96,11 @@ DECL_TEMPLATE(Square)
static void ALmodulatorState_Construct(ALmodulatorState *state)
{
- ALuint i;
-
ALeffectState_Construct(STATIC_CAST(ALeffectState, state));
SET_VTABLE2(ALmodulatorState, ALeffectState, state);
state->index = 0;
state->step = 1;
-
- for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
- ALfilterState_clear(&state->Filter[i]);
}
static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state)
@@ -110,8 +108,15 @@ static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state)
ALeffectState_Destruct(STATIC_CAST(ALeffectState,state));
}
-static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *UNUSED(state), ALCdevice *UNUSED(device))
+static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *state, ALCdevice *UNUSED(device))
{
+ ALsizei i, j;
+ for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
+ {
+ ALfilterState_clear(&state->Chans[i].Filter);
+ for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
+ state->Chans[i].CurrentGains[j] = 0.0f;
+ }
return AL_TRUE;
}
@@ -136,20 +141,19 @@ static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCcontext
cw = cosf(F_TAU * props->Modulator.HighPassCutoff / device->Frequency);
a = (2.0f-cw) - sqrtf(powf(2.0f-cw, 2.0f) - 1.0f);
- for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
- {
- state->Filter[i].b0 = a;
- state->Filter[i].b1 = -a;
- state->Filter[i].b2 = 0.0f;
- state->Filter[i].a1 = -a;
- state->Filter[i].a2 = 0.0f;
- }
+ state->Chans[0].Filter.b0 = a;
+ state->Chans[0].Filter.b1 = -a;
+ state->Chans[0].Filter.b2 = 0.0f;
+ state->Chans[0].Filter.a1 = -a;
+ state->Chans[0].Filter.a2 = 0.0f;
+ for(i = 1;i < MAX_EFFECT_CHANNELS;i++)
+ ALfilterState_copyParams(&state->Chans[i].Filter, &state->Chans[0].Filter);
STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer;
STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels;
for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
ComputeFirstOrderGains(&device->FOAOut, IdentityMatrixf.m[i],
- slot->Params.Gain, state->Gain[i]);
+ slot->Params.Gain, state->Chans[i].TargetGains);
}
static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels)
@@ -162,29 +166,20 @@ static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesT
{
ALfloat temps[2][128];
ALsizei td = mini(128, SamplesToDo-base);
- ALsizei i, j, k;
+ ALsizei i;
- for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
+ for(i = 0;i < MAX_EFFECT_CHANNELS;i++)
{
- ALfilterState_process(&state->Filter[j], temps[0], &SamplesIn[j][base], td);
+ ALfilterState_process(&state->Chans[i].Filter, temps[0], &SamplesIn[i][base], td);
state->Process(temps[1], temps[0], index, step, td);
- for(k = 0;k < NumChannels;k++)
- {
- ALfloat gain = state->Gain[j][k];
- if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD))
- continue;
-
- for(i = 0;i < td;i++)
- SamplesOut[k][base+i] += gain * temps[1][i];
- }
+ MixSamples(temps[1], NumChannels, SamplesOut, state->Chans[i].CurrentGains,
+ state->Chans[i].TargetGains, SamplesToDo-base, base, td);
}
for(i = 0;i < td;i++)
- {
index += step;
- index &= WAVEFORM_FRACMASK;
- }
+ index &= WAVEFORM_FRACMASK;
base += td;
}
state->index = index;