🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
5.1 KiB

  1. #ifndef EFFECTS_BASE_H
  2. #define EFFECTS_BASE_H
  3. #include "alMain.h"
  4. #include "almalloc.h"
  5. #include "atomic.h"
  6. struct ALeffectslot;
  7. union EffectProps {
  8. struct {
  9. // Shared Reverb Properties
  10. ALfloat Density;
  11. ALfloat Diffusion;
  12. ALfloat Gain;
  13. ALfloat GainHF;
  14. ALfloat DecayTime;
  15. ALfloat DecayHFRatio;
  16. ALfloat ReflectionsGain;
  17. ALfloat ReflectionsDelay;
  18. ALfloat LateReverbGain;
  19. ALfloat LateReverbDelay;
  20. ALfloat AirAbsorptionGainHF;
  21. ALfloat RoomRolloffFactor;
  22. ALboolean DecayHFLimit;
  23. // Additional EAX Reverb Properties
  24. ALfloat GainLF;
  25. ALfloat DecayLFRatio;
  26. ALfloat ReflectionsPan[3];
  27. ALfloat LateReverbPan[3];
  28. ALfloat EchoTime;
  29. ALfloat EchoDepth;
  30. ALfloat ModulationTime;
  31. ALfloat ModulationDepth;
  32. ALfloat HFReference;
  33. ALfloat LFReference;
  34. } Reverb;
  35. struct {
  36. ALfloat AttackTime;
  37. ALfloat ReleaseTime;
  38. ALfloat Resonance;
  39. ALfloat PeakGain;
  40. } Autowah;
  41. struct {
  42. ALint Waveform;
  43. ALint Phase;
  44. ALfloat Rate;
  45. ALfloat Depth;
  46. ALfloat Feedback;
  47. ALfloat Delay;
  48. } Chorus; /* Also Flanger */
  49. struct {
  50. ALboolean OnOff;
  51. } Compressor;
  52. struct {
  53. ALfloat Edge;
  54. ALfloat Gain;
  55. ALfloat LowpassCutoff;
  56. ALfloat EQCenter;
  57. ALfloat EQBandwidth;
  58. } Distortion;
  59. struct {
  60. ALfloat Delay;
  61. ALfloat LRDelay;
  62. ALfloat Damping;
  63. ALfloat Feedback;
  64. ALfloat Spread;
  65. } Echo;
  66. struct {
  67. ALfloat LowCutoff;
  68. ALfloat LowGain;
  69. ALfloat Mid1Center;
  70. ALfloat Mid1Gain;
  71. ALfloat Mid1Width;
  72. ALfloat Mid2Center;
  73. ALfloat Mid2Gain;
  74. ALfloat Mid2Width;
  75. ALfloat HighCutoff;
  76. ALfloat HighGain;
  77. } Equalizer;
  78. struct {
  79. ALfloat Frequency;
  80. ALint LeftDirection;
  81. ALint RightDirection;
  82. } Fshifter;
  83. struct {
  84. ALfloat Frequency;
  85. ALfloat HighPassCutoff;
  86. ALint Waveform;
  87. } Modulator;
  88. struct {
  89. ALint CoarseTune;
  90. ALint FineTune;
  91. } Pshifter;
  92. struct {
  93. ALfloat Gain;
  94. } Dedicated;
  95. };
  96. struct EffectVtable {
  97. void (*const setParami)(EffectProps *props, ALCcontext *context, ALenum param, ALint val);
  98. void (*const setParamiv)(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals);
  99. void (*const setParamf)(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val);
  100. void (*const setParamfv)(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals);
  101. void (*const getParami)(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val);
  102. void (*const getParamiv)(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals);
  103. void (*const getParamf)(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val);
  104. void (*const getParamfv)(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals);
  105. };
  106. #define DEFINE_ALEFFECT_VTABLE(T) \
  107. const EffectVtable T##_vtable = { \
  108. T##_setParami, T##_setParamiv, \
  109. T##_setParamf, T##_setParamfv, \
  110. T##_getParami, T##_getParamiv, \
  111. T##_getParamf, T##_getParamfv, \
  112. }
  113. struct EffectTarget {
  114. MixParams *Main;
  115. RealMixParams *RealOut;
  116. };
  117. struct EffectState {
  118. RefCount mRef{1u};
  119. ALfloat (*mOutBuffer)[BUFFERSIZE]{nullptr};
  120. ALsizei mOutChannels{0};
  121. virtual ~EffectState() = default;
  122. virtual ALboolean deviceUpdate(const ALCdevice *device) = 0;
  123. virtual void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) = 0;
  124. virtual void process(ALsizei samplesToDo, const ALfloat (*RESTRICT samplesIn)[BUFFERSIZE], const ALsizei numInput, ALfloat (*RESTRICT samplesOut)[BUFFERSIZE], const ALsizei numOutput) = 0;
  125. void IncRef() noexcept;
  126. void DecRef() noexcept;
  127. };
  128. struct EffectStateFactory {
  129. virtual ~EffectStateFactory() { }
  130. virtual EffectState *create() = 0;
  131. virtual EffectProps getDefaultProps() const noexcept = 0;
  132. virtual const EffectVtable *getEffectVtable() const noexcept = 0;
  133. };
  134. EffectStateFactory *NullStateFactory_getFactory(void);
  135. EffectStateFactory *ReverbStateFactory_getFactory(void);
  136. EffectStateFactory *StdReverbStateFactory_getFactory(void);
  137. EffectStateFactory *AutowahStateFactory_getFactory(void);
  138. EffectStateFactory *ChorusStateFactory_getFactory(void);
  139. EffectStateFactory *CompressorStateFactory_getFactory(void);
  140. EffectStateFactory *DistortionStateFactory_getFactory(void);
  141. EffectStateFactory *EchoStateFactory_getFactory(void);
  142. EffectStateFactory *EqualizerStateFactory_getFactory(void);
  143. EffectStateFactory *FlangerStateFactory_getFactory(void);
  144. EffectStateFactory *FshifterStateFactory_getFactory(void);
  145. EffectStateFactory *ModulatorStateFactory_getFactory(void);
  146. EffectStateFactory *PshifterStateFactory_getFactory(void);
  147. EffectStateFactory *DedicatedStateFactory_getFactory(void);
  148. #endif /* EFFECTS_BASE_H */