aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/Include
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-05-21 12:47:18 -0700
committerChris Robinson <[email protected]>2013-05-21 12:47:18 -0700
commita5d94f5d09be24bf34cbf8433a288cfd9ca396fb (patch)
tree456165199302b1b30bc68aadd4913f5d4ecf1572 /OpenAL32/Include
parentaf1936be5dd4724367bfb7a90965f8769aa4f705 (diff)
Use factories to create and destroy effect states
Diffstat (limited to 'OpenAL32/Include')
-rw-r--r--OpenAL32/Include/alAuxEffectSlot.h65
-rw-r--r--OpenAL32/Include/alMain.h5
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