diff options
author | Chris Robinson <[email protected]> | 2013-05-21 12:47:18 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-05-21 12:47:18 -0700 |
commit | a5d94f5d09be24bf34cbf8433a288cfd9ca396fb (patch) | |
tree | 456165199302b1b30bc68aadd4913f5d4ecf1572 /OpenAL32/Include | |
parent | af1936be5dd4724367bfb7a90965f8769aa4f705 (diff) |
Use factories to create and destroy effect states
Diffstat (limited to 'OpenAL32/Include')
-rw-r--r-- | OpenAL32/Include/alAuxEffectSlot.h | 65 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 5 |
2 files changed, 54 insertions, 16 deletions
diff --git a/OpenAL32/Include/alAuxEffectSlot.h b/OpenAL32/Include/alAuxEffectSlot.h index 547e7040..6d5ad8bb 100644 --- a/OpenAL32/Include/alAuxEffectSlot.h +++ b/OpenAL32/Include/alAuxEffectSlot.h @@ -8,6 +8,8 @@ extern "C" { #endif +typedef struct ALeffectStateFactory ALeffectStateFactory; + typedef struct ALeffectState ALeffectState; typedef struct ALeffectslot ALeffectslot; @@ -16,12 +18,19 @@ struct ALeffectStateVtable { ALboolean (*const DeviceUpdate)(ALeffectState *state, ALCdevice *device); ALvoid (*const Update)(ALeffectState *state, ALCdevice *device, const ALeffectslot *slot); ALvoid (*const Process)(ALeffectState *state, ALuint samplesToDo, const ALfloat *RESTRICT samplesIn, ALfloat (*RESTRICT samplesOut)[BUFFERSIZE]); + ALeffectStateFactory *(*const getCreator)(void); }; struct ALeffectState { const struct ALeffectStateVtable *vtbl; }; +#define ALeffectState_Destroy(a) ((a)->vtbl->Destroy((a))) +#define ALeffectState_DeviceUpdate(a,b) ((a)->vtbl->DeviceUpdate((a),(b))) +#define ALeffectState_Update(a,b,c) ((a)->vtbl->Update((a),(b),(c))) +#define ALeffectState_Process(a,b,c,d) ((a)->vtbl->Process((a),(b),(c),(d))) +#define ALeffectState_getCreator(a) ((a)->vtbl->getCreator()) + #define DEFINE_ALEFFECTSTATE_VTABLE(T) \ static ALvoid T##_ALeffectState_Destroy(ALeffectState *state) \ { T##_Destroy(STATIC_UPCAST(T, ALeffectState, state)); } \ @@ -31,16 +40,40 @@ static ALvoid T##_ALeffectState_Update(ALeffectState *state, ALCdevice *device, { T##_Update(STATIC_UPCAST(T, ALeffectState, state), device, slot); } \ static ALvoid T##_ALeffectState_Process(ALeffectState *state, ALuint samplesToDo, const ALfloat *RESTRICT samplesIn, ALfloat (*RESTRICT samplesOut)[BUFFERSIZE]) \ { T##_Process(STATIC_UPCAST(T, ALeffectState, state), samplesToDo, samplesIn, samplesOut); } \ +static ALeffectStateFactory* T##_ALeffectState_getCreator(void) \ +{ return T##_getCreator(); } \ \ static const struct ALeffectStateVtable T##_ALeffectState_vtable = { \ T##_ALeffectState_Destroy, \ T##_ALeffectState_DeviceUpdate, \ T##_ALeffectState_Update, \ - T##_ALeffectState_Process \ + T##_ALeffectState_Process, \ + T##_ALeffectState_getCreator, \ } -#define SET_VTABLE1(T1, obj) ((obj)->vtbl = &(T1##_vtable)) -#define SET_VTABLE2(T1, T2, obj) SET_VTABLE1(T1##_##T2, STATIC_CAST(T2, (obj))) + +struct ALeffectStateFactoryVtable { + ALeffectState *(*const create)(void); + ALvoid (*const destroy)(ALeffectState *state); +}; + +struct ALeffectStateFactory { + const struct ALeffectStateFactoryVtable *vtbl; +}; + +#define ALeffectStateFactory_create(p) ((p)->vtbl->create()) +#define ALeffectStateFactory_destroy(p,a) ((p)->vtbl->destroy((a))) + +#define DEFINE_ALEFFECTSTATEFACTORY_VTABLE(T) \ +static ALeffectState* T##_ALeffectStateFactory_create(void) \ +{ return T##_create(); } \ +static ALvoid T##_ALeffectStateFactory_destroy(ALeffectState *state) \ +{ T##_destroy(state); } \ + \ +static const struct ALeffectStateFactoryVtable T##_ALeffectStateFactory_vtable = { \ + T##_ALeffectStateFactory_create, \ + T##_ALeffectStateFactory_destroy \ +} struct ALeffectslot @@ -68,23 +101,23 @@ struct ALeffectslot ALenum InitEffectSlot(ALeffectslot *slot); ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context); -ALeffectState *NoneCreate(void); -ALeffectState *ReverbCreate(void); -ALeffectState *EchoCreate(void); -ALeffectState *ModulatorCreate(void); -ALeffectState *DedicatedCreate(void); -ALeffectState *ChorusCreate(void); -ALeffectState *FlangerCreate(void); -ALeffectState *EqualizerCreate(void); -ALeffectState *DistortionCreate(void); -#define ALeffectState_Destroy(a) ((a)->vtbl->Destroy((a))) -#define ALeffectState_DeviceUpdate(a,b) ((a)->vtbl->DeviceUpdate((a),(b))) -#define ALeffectState_Update(a,b,c) ((a)->vtbl->Update((a),(b),(c))) -#define ALeffectState_Process(a,b,c,d) ((a)->vtbl->Process((a),(b),(c),(d))) +ALeffectStateFactory *ALreverbStateFactory_getFactory(void); +ALeffectStateFactory *ALchorusStateFactory_getFactory(void); +ALeffectStateFactory *ALdistortionStateFactory_getFactory(void); +ALeffectStateFactory *ALechoStateFactory_getFactory(void); +ALeffectStateFactory *ALequalizerStateFactory_getFactory(void); +ALeffectStateFactory *ALflangerStateFactory_getFactory(void); +ALeffectStateFactory *ALmodulatorStateFactory_getFactory(void); + +ALeffectStateFactory *ALdedicatedStateFactory_getFactory(void); + ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *effect); +void InitEffectFactoryMap(void); +void DeinitEffectFactoryMap(void); + #ifdef __cplusplus } #endif diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 4cdaf783..fc078175 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -62,10 +62,15 @@ static const union { #define COUNTOF(x) (sizeof((x))/sizeof((x)[0])) + #define DERIVE_FROM_TYPE(t) t t##_parent #define STATIC_CAST(to, obj) (&(obj)->to##_parent) #define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent))) +#define SET_VTABLE1(T1, obj) ((obj)->vtbl = &(T1##_vtable)) +#define SET_VTABLE2(T1, T2, obj) SET_VTABLE1(T1##_##T2, STATIC_CAST(T2, (obj))) + + #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN |