Use a fixed array for the effect state factory list

This commit is contained in:
Chris Robinson 2018-01-28 00:10:12 -08:00
parent 0051ebace0
commit dcc5a10c7b
3 changed files with 24 additions and 35 deletions

View File

@ -1127,8 +1127,6 @@ static void alc_initconfig(void)
} while(next++); } while(next++);
} }
InitEffectFactoryMap();
InitEffect(&DefaultEffect); InitEffect(&DefaultEffect);
str = getenv("ALSOFT_DEFAULT_REVERB"); str = getenv("ALSOFT_DEFAULT_REVERB");
if((str && str[0]) || ConfigValueStr(NULL, NULL, "default-reverb", &str)) if((str && str[0]) || ConfigValueStr(NULL, NULL, "default-reverb", &str))
@ -1229,8 +1227,6 @@ static void alc_cleanup(void)
} while((dev=dev->next) != NULL); } while((dev=dev->next) != NULL);
ERR("%u device%s not closed\n", num, (num>1)?"s":""); ERR("%u device%s not closed\n", num, (num>1)?"s":"");
} }
DeinitEffectFactoryMap();
} }
static void alc_deinit_safe(void) static void alc_deinit_safe(void)

View File

@ -171,9 +171,6 @@ ALeffectStateFactory *ALdedicatedStateFactory_getFactory(void);
ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect); ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect);
void InitEffectFactoryMap(void);
void DeinitEffectFactoryMap(void);
void ALeffectState_DecRef(ALeffectState *state); void ALeffectState_DecRef(ALeffectState *state);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -39,12 +39,32 @@
extern inline void LockEffectSlotList(ALCcontext *context); extern inline void LockEffectSlotList(ALCcontext *context);
extern inline void UnlockEffectSlotList(ALCcontext *context); extern inline void UnlockEffectSlotList(ALCcontext *context);
static UIntMap EffectStateFactoryMap; static const struct {
ALenum Type;
ALeffectStateFactory* (*GetFactory)(void);
} FactoryList[] = {
{ AL_EFFECT_NULL, ALnullStateFactory_getFactory },
{ AL_EFFECT_EAXREVERB, ALreverbStateFactory_getFactory },
{ AL_EFFECT_REVERB, ALreverbStateFactory_getFactory },
{ AL_EFFECT_CHORUS, ALchorusStateFactory_getFactory },
{ AL_EFFECT_COMPRESSOR, ALcompressorStateFactory_getFactory },
{ AL_EFFECT_DISTORTION, ALdistortionStateFactory_getFactory },
{ AL_EFFECT_ECHO, ALechoStateFactory_getFactory },
{ AL_EFFECT_EQUALIZER, ALequalizerStateFactory_getFactory },
{ AL_EFFECT_FLANGER, ALflangerStateFactory_getFactory },
{ AL_EFFECT_RING_MODULATOR, ALmodulatorStateFactory_getFactory },
{ AL_EFFECT_DEDICATED_DIALOGUE, ALdedicatedStateFactory_getFactory },
{ AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, ALdedicatedStateFactory_getFactory }
};
static inline ALeffectStateFactory *getFactoryByType(ALenum type) static inline ALeffectStateFactory *getFactoryByType(ALenum type)
{ {
ALeffectStateFactory* (*getFactory)(void) = LookupUIntMapKey(&EffectStateFactoryMap, type); size_t i;
if(getFactory != NULL) for(i = 0;i < COUNTOF(FactoryList);i++)
return getFactory(); {
if(FactoryList[i].Type == type)
return FactoryList[i].GetFactory();
}
return NULL; return NULL;
} }
@ -517,30 +537,6 @@ done:
} }
void InitEffectFactoryMap(void)
{
InitUIntMap(&EffectStateFactoryMap, INT_MAX);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_NULL, ALnullStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_EAXREVERB, ALreverbStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_REVERB, ALreverbStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_CHORUS, ALchorusStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_COMPRESSOR, ALcompressorStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DISTORTION, ALdistortionStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_ECHO, ALechoStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_EQUALIZER, ALequalizerStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_FLANGER, ALflangerStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_RING_MODULATOR, ALmodulatorStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DEDICATED_DIALOGUE, ALdedicatedStateFactory_getFactory);
InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, ALdedicatedStateFactory_getFactory);
}
void DeinitEffectFactoryMap(void)
{
ResetUIntMap(&EffectStateFactoryMap);
}
ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect) ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect)
{ {
ALCdevice *Device = Context->Device; ALCdevice *Device = Context->Device;