Use a fixed array for the effect state factory list
This commit is contained in:
parent
0051ebace0
commit
dcc5a10c7b
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user