base.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef EFFECTS_BASE_H
  2. #define EFFECTS_BASE_H
  3. #include <cstddef>
  4. #include "albyte.h"
  5. #include "alcmain.h"
  6. #include "almalloc.h"
  7. #include "alspan.h"
  8. #include "atomic.h"
  9. #include "intrusive_ptr.h"
  10. struct EffectSlot;
  11. struct BufferStorage;
  12. enum class ChorusWaveform {
  13. Sinusoid,
  14. Triangle
  15. };
  16. constexpr float EchoMaxDelay{0.207f};
  17. constexpr float EchoMaxLRDelay{0.404f};
  18. enum class FShifterDirection {
  19. Down,
  20. Up,
  21. Off
  22. };
  23. enum class ModulatorWaveform {
  24. Sinusoid,
  25. Sawtooth,
  26. Square
  27. };
  28. enum class VMorpherPhenome {
  29. A, E, I, O, U,
  30. AA, AE, AH, AO, EH, ER, IH, IY, UH, UW,
  31. B, D, F, G, J, K, L, M, N, P, R, S, T, V, Z
  32. };
  33. enum class VMorpherWaveform {
  34. Sinusoid,
  35. Triangle,
  36. Sawtooth
  37. };
  38. union EffectProps {
  39. struct {
  40. // Shared Reverb Properties
  41. float Density;
  42. float Diffusion;
  43. float Gain;
  44. float GainHF;
  45. float DecayTime;
  46. float DecayHFRatio;
  47. float ReflectionsGain;
  48. float ReflectionsDelay;
  49. float LateReverbGain;
  50. float LateReverbDelay;
  51. float AirAbsorptionGainHF;
  52. float RoomRolloffFactor;
  53. bool DecayHFLimit;
  54. // Additional EAX Reverb Properties
  55. float GainLF;
  56. float DecayLFRatio;
  57. float ReflectionsPan[3];
  58. float LateReverbPan[3];
  59. float EchoTime;
  60. float EchoDepth;
  61. float ModulationTime;
  62. float ModulationDepth;
  63. float HFReference;
  64. float LFReference;
  65. } Reverb;
  66. struct {
  67. float AttackTime;
  68. float ReleaseTime;
  69. float Resonance;
  70. float PeakGain;
  71. } Autowah;
  72. struct {
  73. ChorusWaveform Waveform;
  74. int Phase;
  75. float Rate;
  76. float Depth;
  77. float Feedback;
  78. float Delay;
  79. } Chorus; /* Also Flanger */
  80. struct {
  81. bool OnOff;
  82. } Compressor;
  83. struct {
  84. float Edge;
  85. float Gain;
  86. float LowpassCutoff;
  87. float EQCenter;
  88. float EQBandwidth;
  89. } Distortion;
  90. struct {
  91. float Delay;
  92. float LRDelay;
  93. float Damping;
  94. float Feedback;
  95. float Spread;
  96. } Echo;
  97. struct {
  98. float LowCutoff;
  99. float LowGain;
  100. float Mid1Center;
  101. float Mid1Gain;
  102. float Mid1Width;
  103. float Mid2Center;
  104. float Mid2Gain;
  105. float Mid2Width;
  106. float HighCutoff;
  107. float HighGain;
  108. } Equalizer;
  109. struct {
  110. float Frequency;
  111. FShifterDirection LeftDirection;
  112. FShifterDirection RightDirection;
  113. } Fshifter;
  114. struct {
  115. float Frequency;
  116. float HighPassCutoff;
  117. ModulatorWaveform Waveform;
  118. } Modulator;
  119. struct {
  120. int CoarseTune;
  121. int FineTune;
  122. } Pshifter;
  123. struct {
  124. float Rate;
  125. VMorpherPhenome PhonemeA;
  126. VMorpherPhenome PhonemeB;
  127. int PhonemeACoarseTuning;
  128. int PhonemeBCoarseTuning;
  129. VMorpherWaveform Waveform;
  130. } Vmorpher;
  131. struct {
  132. float Gain;
  133. } Dedicated;
  134. };
  135. struct EffectTarget {
  136. MixParams *Main;
  137. RealMixParams *RealOut;
  138. };
  139. struct EffectState : public al::intrusive_ref<EffectState> {
  140. struct Buffer {
  141. const BufferStorage *storage;
  142. al::span<const al::byte> samples;
  143. };
  144. al::span<FloatBufferLine> mOutTarget;
  145. virtual ~EffectState() = default;
  146. virtual void deviceUpdate(const ALCdevice *device, const Buffer &buffer) = 0;
  147. virtual void update(const ALCcontext *context, const EffectSlot *slot,
  148. const EffectProps *props, const EffectTarget target) = 0;
  149. virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn,
  150. const al::span<FloatBufferLine> samplesOut) = 0;
  151. };
  152. struct EffectStateFactory {
  153. virtual ~EffectStateFactory() = default;
  154. virtual al::intrusive_ptr<EffectState> create() = 0;
  155. };
  156. EffectStateFactory *NullStateFactory_getFactory(void);
  157. EffectStateFactory *ReverbStateFactory_getFactory(void);
  158. EffectStateFactory *StdReverbStateFactory_getFactory(void);
  159. EffectStateFactory *AutowahStateFactory_getFactory(void);
  160. EffectStateFactory *ChorusStateFactory_getFactory(void);
  161. EffectStateFactory *CompressorStateFactory_getFactory(void);
  162. EffectStateFactory *DistortionStateFactory_getFactory(void);
  163. EffectStateFactory *EchoStateFactory_getFactory(void);
  164. EffectStateFactory *EqualizerStateFactory_getFactory(void);
  165. EffectStateFactory *FlangerStateFactory_getFactory(void);
  166. EffectStateFactory *FshifterStateFactory_getFactory(void);
  167. EffectStateFactory *ModulatorStateFactory_getFactory(void);
  168. EffectStateFactory *PshifterStateFactory_getFactory(void);
  169. EffectStateFactory* VmorpherStateFactory_getFactory(void);
  170. EffectStateFactory *DedicatedStateFactory_getFactory(void);
  171. EffectStateFactory *ConvolutionStateFactory_getFactory(void);
  172. #endif /* EFFECTS_BASE_H */