aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/effects/base.h3
-rw-r--r--alc/effects/convolution.cpp155
2 files changed, 157 insertions, 1 deletions
diff --git a/alc/effects/base.h b/alc/effects/base.h
index f4ca6df2..6aa0f9e9 100644
--- a/alc/effects/base.h
+++ b/alc/effects/base.h
@@ -176,7 +176,7 @@ struct EffectState : public al::intrusive_ref<EffectState> {
* detached and deleted or altered during a mix.
*/
virtual EffectBufferBase *createBuffer(const ALCdevice */*device*/,
- const al::byte */*samplesData*/, ALuint /*sampleRate*/, FmtType /*sampleType*/,
+ const al::byte */*sampleData*/, ALuint /*sampleRate*/, FmtType /*sampleType*/,
FmtChannels /*channelType*/, ALuint /*numSamples*/)
{ return nullptr; }
virtual void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) = 0;
@@ -210,5 +210,6 @@ EffectStateFactory* VmorpherStateFactory_getFactory(void);
EffectStateFactory *DedicatedStateFactory_getFactory(void);
+EffectStateFactory *ConvolutionStateFactory_getFactory(void);
#endif /* EFFECTS_BASE_H */
diff --git a/alc/effects/convolution.cpp b/alc/effects/convolution.cpp
new file mode 100644
index 00000000..56a09e5d
--- /dev/null
+++ b/alc/effects/convolution.cpp
@@ -0,0 +1,155 @@
+
+#include "config.h"
+
+#include "AL/al.h"
+#include "AL/alc.h"
+
+#include "al/auxeffectslot.h"
+#include "alcmain.h"
+#include "alcontext.h"
+#include "almalloc.h"
+#include "alspan.h"
+#include "effects/base.h"
+
+
+namespace {
+
+struct ConvolutionState final : public EffectState {
+ ConvolutionState() = default;
+ ~ConvolutionState() override = default;
+
+ void deviceUpdate(const ALCdevice *device) override;
+ EffectBufferBase *createBuffer(const ALCdevice *device, const al::byte *sampleData,
+ ALuint sampleRate, FmtType sampleType, FmtChannels channelType, ALuint numSamples) override;
+ void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override;
+ void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn, const al::span<FloatBufferLine> samplesOut) override;
+
+ DEF_NEWDEL(ConvolutionState)
+};
+
+void ConvolutionState::deviceUpdate(const ALCdevice* /*device*/)
+{
+}
+
+EffectBufferBase *ConvolutionState::createBuffer(const ALCdevice */*device*/,
+ const al::byte */*samplesData*/, ALuint /*sampleRate*/, FmtType /*sampleType*/,
+ FmtChannels /*channelType*/, ALuint /*numSamples*/)
+{
+ return nullptr;
+}
+
+void ConvolutionState::update(const ALCcontext* /*context*/, const ALeffectslot* /*slot*/,
+ const EffectProps* /*props*/, const EffectTarget /*target*/)
+{
+}
+
+void ConvolutionState::process(const size_t/*samplesToDo*/,
+ const al::span<const FloatBufferLine> /*samplesIn*/,
+ const al::span<FloatBufferLine> /*samplesOut*/)
+{
+}
+
+
+void ConvolutionEffect_setParami(EffectProps* /*props*/, ALenum param, int /*val*/)
+{
+ switch(param)
+ {
+ default:
+ throw effect_exception{AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x",
+ param};
+ }
+}
+void ConvolutionEffect_setParamiv(EffectProps *props, ALenum param, const int *vals)
+{
+ switch(param)
+ {
+ default:
+ ConvolutionEffect_setParami(props, param, vals[0]);
+ }
+}
+void ConvolutionEffect_setParamf(EffectProps* /*props*/, ALenum param, float /*val*/)
+{
+ switch(param)
+ {
+ default:
+ throw effect_exception{AL_INVALID_ENUM, "Invalid null effect float property 0x%04x",
+ param};
+ }
+}
+void ConvolutionEffect_setParamfv(EffectProps *props, ALenum param, const float *vals)
+{
+ switch(param)
+ {
+ default:
+ ConvolutionEffect_setParamf(props, param, vals[0]);
+ }
+}
+
+void ConvolutionEffect_getParami(const EffectProps* /*props*/, ALenum param, int* /*val*/)
+{
+ switch(param)
+ {
+ default:
+ throw effect_exception{AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x",
+ param};
+ }
+}
+void ConvolutionEffect_getParamiv(const EffectProps *props, ALenum param, int *vals)
+{
+ switch(param)
+ {
+ default:
+ ConvolutionEffect_getParami(props, param, vals);
+ }
+}
+void ConvolutionEffect_getParamf(const EffectProps* /*props*/, ALenum param, float* /*val*/)
+{
+ switch(param)
+ {
+ default:
+ throw effect_exception{AL_INVALID_ENUM, "Invalid null effect float property 0x%04x",
+ param};
+ }
+}
+void ConvolutionEffect_getParamfv(const EffectProps *props, ALenum param, float *vals)
+{
+ switch(param)
+ {
+ default:
+ ConvolutionEffect_getParamf(props, param, vals);
+ }
+}
+
+DEFINE_ALEFFECT_VTABLE(ConvolutionEffect);
+
+
+struct ConvolutionStateFactory final : public EffectStateFactory {
+ EffectState *create() override;
+ EffectProps getDefaultProps() const noexcept override;
+ const EffectVtable *getEffectVtable() const noexcept override;
+};
+
+/* Creates EffectState objects of the appropriate type. */
+EffectState *ConvolutionStateFactory::create()
+{ return new ConvolutionState{}; }
+
+/* Returns an ALeffectProps initialized with this effect type's default
+ * property values.
+ */
+EffectProps ConvolutionStateFactory::getDefaultProps() const noexcept
+{
+ EffectProps props{};
+ return props;
+}
+
+/* Returns a pointer to this effect type's global set/get vtable. */
+const EffectVtable *ConvolutionStateFactory::getEffectVtable() const noexcept
+{ return &ConvolutionEffect_vtable; }
+
+} // namespace
+
+EffectStateFactory *ConvolutionStateFactory_getFactory()
+{
+ static ConvolutionStateFactory ConvolutionFactory{};
+ return &ConvolutionFactory;
+}