base.h 5.3 KB

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