aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-08-24 20:04:16 -0700
committerChris Robinson <[email protected]>2020-08-24 20:04:16 -0700
commit1a9fbc1b2f7456f14e9cb74d95f4696cbe5c5af3 (patch)
tree63af2a2c4b3c7252ada0063c78c45bfbb85a0565
parentb955479e18a11a5d9dce8fbd305dc915a2d6942c (diff)
Stub out a convolution effect state
-rw-r--r--CMakeLists.txt1
-rw-r--r--al/effect.cpp3
-rw-r--r--alc/effects/base.h3
-rw-r--r--alc/effects/convolution.cpp155
4 files changed, 160 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 803f34de..f77f5a24 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -629,6 +629,7 @@ set(ALC_OBJS
alc/effects/autowah.cpp
alc/effects/chorus.cpp
alc/effects/compressor.cpp
+ alc/effects/convolution.cpp
alc/effects/dedicated.cpp
alc/effects/distortion.cpp
alc/effects/echo.cpp
diff --git a/al/effect.cpp b/al/effect.cpp
index fa39528b..350d0e69 100644
--- a/al/effect.cpp
+++ b/al/effect.cpp
@@ -101,7 +101,8 @@ constexpr struct FactoryItem {
{ AL_EFFECT_PITCH_SHIFTER, PshifterStateFactory_getFactory},
{ AL_EFFECT_VOCAL_MORPHER, VmorpherStateFactory_getFactory},
{ AL_EFFECT_DEDICATED_DIALOGUE, DedicatedStateFactory_getFactory },
- { AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, DedicatedStateFactory_getFactory }
+ { AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, DedicatedStateFactory_getFactory },
+ { AL_EFFECT_CONVOLUTION_REVERB_SOFT, ConvolutionStateFactory_getFactory }
};
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;
+}