effect.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef AL_EFFECT_H
  2. #define AL_EFFECT_H
  3. #include <array>
  4. #include <bitset>
  5. #include <cstdint>
  6. #include <string_view>
  7. #include <utility>
  8. #include <variant>
  9. #include "AL/al.h"
  10. #include "AL/alc.h"
  11. #include "AL/efx.h"
  12. #include "almalloc.h"
  13. #include "alnumeric.h"
  14. #include "core/effects/base.h"
  15. #include "effects/effects.h"
  16. enum {
  17. EAXREVERB_EFFECT = 0,
  18. REVERB_EFFECT,
  19. AUTOWAH_EFFECT,
  20. CHORUS_EFFECT,
  21. COMPRESSOR_EFFECT,
  22. DISTORTION_EFFECT,
  23. ECHO_EFFECT,
  24. EQUALIZER_EFFECT,
  25. FLANGER_EFFECT,
  26. FSHIFTER_EFFECT,
  27. MODULATOR_EFFECT,
  28. PSHIFTER_EFFECT,
  29. VMORPHER_EFFECT,
  30. DEDICATED_EFFECT,
  31. CONVOLUTION_EFFECT,
  32. MAX_EFFECTS
  33. };
  34. inline std::bitset<MAX_EFFECTS> DisabledEffects;
  35. struct EffectList {
  36. const char name[16]; /* NOLINT(*-avoid-c-arrays) */
  37. ALuint type;
  38. ALenum val;
  39. };
  40. DECL_HIDDEN extern const std::array<EffectList,16> gEffectList;
  41. using EffectHandlerVariant = std::variant<NullEffectHandler,ReverbEffectHandler,
  42. StdReverbEffectHandler,AutowahEffectHandler,ChorusEffectHandler,CompressorEffectHandler,
  43. DistortionEffectHandler,EchoEffectHandler,EqualizerEffectHandler,FlangerEffectHandler,
  44. FshifterEffectHandler,ModulatorEffectHandler,PshifterEffectHandler,VmorpherEffectHandler,
  45. DedicatedDialogEffectHandler,DedicatedLfeEffectHandler,ConvolutionEffectHandler>;
  46. struct ALeffect {
  47. // Effect type (AL_EFFECT_NULL, ...)
  48. ALenum type{AL_EFFECT_NULL};
  49. EffectHandlerVariant PropsVariant;
  50. EffectProps Props;
  51. /* Self ID */
  52. ALuint id{0u};
  53. static void SetName(ALCcontext *context, ALuint id, std::string_view name);
  54. DISABLE_ALLOC
  55. };
  56. void InitEffect(ALeffect *effect);
  57. void LoadReverbPreset(const std::string_view name, ALeffect *effect);
  58. bool IsValidEffectType(ALenum type) noexcept;
  59. struct EffectSubList {
  60. uint64_t FreeMask{~0_u64};
  61. gsl::owner<std::array<ALeffect,64>*> Effects{nullptr}; /* 64 */
  62. EffectSubList() noexcept = default;
  63. EffectSubList(const EffectSubList&) = delete;
  64. EffectSubList(EffectSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Effects{rhs.Effects}
  65. { rhs.FreeMask = ~0_u64; rhs.Effects = nullptr; }
  66. ~EffectSubList();
  67. EffectSubList& operator=(const EffectSubList&) = delete;
  68. EffectSubList& operator=(EffectSubList&& rhs) noexcept
  69. { std::swap(FreeMask, rhs.FreeMask); std::swap(Effects, rhs.Effects); return *this; }
  70. };
  71. #endif