aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-11-16 21:31:52 -0800
committerChris Robinson <[email protected]>2018-11-16 21:31:52 -0800
commit8410e71a34fc286579573ab55dc94be83c48e55b (patch)
treeb911eda075c3704c40d79a1ffe9a53b2cc2bc23f /Alc
parenta68d0b68d74a9f3fa65096fdfddc5a04fa118dfa (diff)
Convert the reverb effect to C++
Diffstat (limited to 'Alc')
-rw-r--r--Alc/effects/reverb.cpp (renamed from Alc/effects/reverb.c)40
1 files changed, 22 insertions, 18 deletions
diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.cpp
index ad4aae5c..5cfc0012 100644
--- a/Alc/effects/reverb.c
+++ b/Alc/effects/reverb.cpp
@@ -274,9 +274,7 @@ typedef struct LateReverb {
ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS];
} LateReverb;
-typedef struct ReverbState {
- DERIVE_FROM_TYPE(ALeffectState);
-
+struct ReverbState final : public ALeffectState {
/* All delay lines are allocated as a single buffer to reduce memory
* fragmentation and management code.
*/
@@ -329,7 +327,7 @@ typedef struct ReverbState {
/* Temporary storage used when processing. */
alignas(16) ALfloat TempSamples[NUM_LINES][MAX_UPDATE_SAMPLES];
alignas(16) ALfloat MixSamples[NUM_LINES][MAX_UPDATE_SAMPLES];
-} ReverbState;
+};
static ALvoid ReverbState_Destruct(ReverbState *State);
static ALboolean ReverbState_deviceUpdate(ReverbState *State, ALCdevice *Device);
@@ -341,7 +339,7 @@ DEFINE_ALEFFECTSTATE_VTABLE(ReverbState);
static void ReverbState_Construct(ReverbState *state)
{
- ALsizei i, j;
+ new (state) ReverbState{};
ALeffectState_Construct(STATIC_CAST(ALeffectState, state));
SET_VTABLE2(ReverbState, ALeffectState, state);
@@ -357,7 +355,7 @@ static void ReverbState_Construct(ReverbState *state)
state->Params.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE;
state->Params.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE;
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
BiquadFilter_clear(&state->Filter[i].Lp);
BiquadFilter_clear(&state->Filter[i].Hp);
@@ -366,7 +364,7 @@ static void ReverbState_Construct(ReverbState *state)
state->Delay.Mask = 0;
state->Delay.Line = NULL;
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
state->EarlyDelayTap[i][0] = 0;
state->EarlyDelayTap[i][1] = 0;
@@ -376,7 +374,7 @@ static void ReverbState_Construct(ReverbState *state)
state->LateFeedTap = 0;
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
state->LateDelayTap[i][0] = 0;
state->LateDelayTap[i][1] = 0;
@@ -390,7 +388,7 @@ static void ReverbState_Construct(ReverbState *state)
state->Early.VecAp.Coeff = 0.0f;
state->Early.Delay.Mask = 0;
state->Early.Delay.Line = NULL;
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
state->Early.VecAp.Offset[i][0] = 0;
state->Early.VecAp.Offset[i][1] = 0;
@@ -407,7 +405,7 @@ static void ReverbState_Construct(ReverbState *state)
state->Late.VecAp.Delay.Mask = 0;
state->Late.VecAp.Delay.Line = NULL;
state->Late.VecAp.Coeff = 0.0f;
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
state->Late.Offset[i][0] = 0;
state->Late.Offset[i][1] = 0;
@@ -421,9 +419,9 @@ static void ReverbState_Construct(ReverbState *state)
BiquadFilter_clear(&state->Late.T60[i].LFFilter);
}
- for(i = 0;i < NUM_LINES;i++)
+ for(ALsizei i{0};i < NUM_LINES;i++)
{
- for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
+ for(ALsizei j{0};j < MAX_OUTPUT_CHANNELS;j++)
{
state->Early.CurrentGain[i][j] = 0.0f;
state->Early.PanGain[i][j] = 0.0f;
@@ -444,6 +442,7 @@ static ALvoid ReverbState_Destruct(ReverbState *State)
State->SampleBuffer = NULL;
ALeffectState_Destruct(STATIC_CAST(ALeffectState,State));
+ State->~ReverbState();
}
/**************************************
@@ -545,7 +544,8 @@ static ALboolean AllocLines(const ALuint frequency, ReverbState *State)
ALfloat *newBuffer;
TRACE("New reverb buffer length: %ux4 samples\n", totalSamples);
- newBuffer = al_calloc(16, sizeof(ALfloat[NUM_LINES]) * totalSamples);
+ newBuffer = static_cast<ALfloat*>(al_calloc(16,
+ sizeof(ALfloat[NUM_LINES]) * totalSamples));
if(!newBuffer) return AL_FALSE;
al_free(State->SampleBuffer);
@@ -1583,9 +1583,9 @@ static ALvoid ReverbState_process(ReverbState *State, ALsizei SamplesToDo, const
}
-typedef struct ReverbStateFactory {
- DERIVE_FROM_TYPE(EffectStateFactory);
-} ReverbStateFactory;
+struct ReverbStateFactory final : public EffectStateFactory {
+ ReverbStateFactory() noexcept;
+};
static ALeffectState *ReverbStateFactory_create(ReverbStateFactory* UNUSED(factory))
{
@@ -1599,10 +1599,14 @@ static ALeffectState *ReverbStateFactory_create(ReverbStateFactory* UNUSED(facto
DEFINE_EFFECTSTATEFACTORY_VTABLE(ReverbStateFactory);
-EffectStateFactory *ReverbStateFactory_getFactory(void)
+ReverbStateFactory::ReverbStateFactory() noexcept
+ : EffectStateFactory{GET_VTABLE2(ReverbStateFactory, EffectStateFactory)}
{
- static ReverbStateFactory ReverbFactory = { { GET_VTABLE2(ReverbStateFactory, EffectStateFactory) } };
+}
+EffectStateFactory *ReverbStateFactory_getFactory(void)
+{
+ static ReverbStateFactory ReverbFactory{};
return STATIC_CAST(EffectStateFactory, &ReverbFactory);
}