base.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #ifndef CORE_EFFECTS_BASE_H
  2. #define CORE_EFFECTS_BASE_H
  3. #include <array>
  4. #include <cstddef>
  5. #include <variant>
  6. #include "alspan.h"
  7. #include "core/bufferline.h"
  8. #include "intrusive_ptr.h"
  9. #include "opthelpers.h"
  10. struct BufferStorage;
  11. struct ContextBase;
  12. struct DeviceBase;
  13. struct EffectSlot;
  14. struct MixParams;
  15. struct RealMixParams;
  16. /** Target gain for the reverb decay feedback reaching the decay time. */
  17. inline constexpr float ReverbDecayGain{0.001f}; /* -60 dB */
  18. inline constexpr float ReverbMaxReflectionsDelay{0.3f};
  19. inline constexpr float ReverbMaxLateReverbDelay{0.1f};
  20. enum class ChorusWaveform {
  21. Sinusoid,
  22. Triangle
  23. };
  24. inline constexpr float ChorusMaxDelay{0.016f};
  25. inline constexpr float FlangerMaxDelay{0.004f};
  26. inline constexpr float EchoMaxDelay{0.207f};
  27. inline constexpr float EchoMaxLRDelay{0.404f};
  28. enum class FShifterDirection {
  29. Down,
  30. Up,
  31. Off
  32. };
  33. enum class ModulatorWaveform {
  34. Sinusoid,
  35. Sawtooth,
  36. Square
  37. };
  38. enum class VMorpherPhenome {
  39. A, E, I, O, U,
  40. AA, AE, AH, AO, EH, ER, IH, IY, UH, UW,
  41. B, D, F, G, J, K, L, M, N, P, R, S, T, V, Z
  42. };
  43. enum class VMorpherWaveform {
  44. Sinusoid,
  45. Triangle,
  46. Sawtooth
  47. };
  48. struct ReverbProps {
  49. float Density;
  50. float Diffusion;
  51. float Gain;
  52. float GainHF;
  53. float GainLF;
  54. float DecayTime;
  55. float DecayHFRatio;
  56. float DecayLFRatio;
  57. float ReflectionsGain;
  58. float ReflectionsDelay;
  59. std::array<float,3> ReflectionsPan;
  60. float LateReverbGain;
  61. float LateReverbDelay;
  62. std::array<float,3> LateReverbPan;
  63. float EchoTime;
  64. float EchoDepth;
  65. float ModulationTime;
  66. float ModulationDepth;
  67. float AirAbsorptionGainHF;
  68. float HFReference;
  69. float LFReference;
  70. float RoomRolloffFactor;
  71. bool DecayHFLimit;
  72. };
  73. struct AutowahProps {
  74. float AttackTime;
  75. float ReleaseTime;
  76. float Resonance;
  77. float PeakGain;
  78. };
  79. struct ChorusProps {
  80. ChorusWaveform Waveform;
  81. int Phase;
  82. float Rate;
  83. float Depth;
  84. float Feedback;
  85. float Delay;
  86. };
  87. struct CompressorProps {
  88. bool OnOff;
  89. };
  90. struct DistortionProps {
  91. float Edge;
  92. float Gain;
  93. float LowpassCutoff;
  94. float EQCenter;
  95. float EQBandwidth;
  96. };
  97. struct EchoProps {
  98. float Delay;
  99. float LRDelay;
  100. float Damping;
  101. float Feedback;
  102. float Spread;
  103. };
  104. struct EqualizerProps {
  105. float LowCutoff;
  106. float LowGain;
  107. float Mid1Center;
  108. float Mid1Gain;
  109. float Mid1Width;
  110. float Mid2Center;
  111. float Mid2Gain;
  112. float Mid2Width;
  113. float HighCutoff;
  114. float HighGain;
  115. };
  116. struct FshifterProps {
  117. float Frequency;
  118. FShifterDirection LeftDirection;
  119. FShifterDirection RightDirection;
  120. };
  121. struct ModulatorProps {
  122. float Frequency;
  123. float HighPassCutoff;
  124. ModulatorWaveform Waveform;
  125. };
  126. struct PshifterProps {
  127. int CoarseTune;
  128. int FineTune;
  129. };
  130. struct VmorpherProps {
  131. float Rate;
  132. VMorpherPhenome PhonemeA;
  133. VMorpherPhenome PhonemeB;
  134. int PhonemeACoarseTuning;
  135. int PhonemeBCoarseTuning;
  136. VMorpherWaveform Waveform;
  137. };
  138. struct DedicatedProps {
  139. enum TargetType : bool { Dialog, Lfe };
  140. TargetType Target;
  141. float Gain;
  142. };
  143. struct ConvolutionProps {
  144. std::array<float,3> OrientAt;
  145. std::array<float,3> OrientUp;
  146. };
  147. using EffectProps = std::variant<std::monostate,
  148. ReverbProps,
  149. AutowahProps,
  150. ChorusProps,
  151. CompressorProps,
  152. DistortionProps,
  153. EchoProps,
  154. EqualizerProps,
  155. FshifterProps,
  156. ModulatorProps,
  157. PshifterProps,
  158. VmorpherProps,
  159. DedicatedProps,
  160. ConvolutionProps>;
  161. struct EffectTarget {
  162. MixParams *Main;
  163. RealMixParams *RealOut;
  164. };
  165. struct SIMDALIGN EffectState : public al::intrusive_ref<EffectState> {
  166. al::span<FloatBufferLine> mOutTarget;
  167. virtual ~EffectState() = default;
  168. virtual void deviceUpdate(const DeviceBase *device, const BufferStorage *buffer) = 0;
  169. virtual void update(const ContextBase *context, const EffectSlot *slot,
  170. const EffectProps *props, const EffectTarget target) = 0;
  171. virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn,
  172. const al::span<FloatBufferLine> samplesOut) = 0;
  173. };
  174. struct EffectStateFactory {
  175. EffectStateFactory() = default;
  176. EffectStateFactory(const EffectStateFactory&) = delete;
  177. EffectStateFactory(EffectStateFactory&&) = delete;
  178. virtual ~EffectStateFactory() = default;
  179. void operator=(const EffectStateFactory&) = delete;
  180. void operator=(EffectStateFactory&&) = delete;
  181. virtual al::intrusive_ptr<EffectState> create() = 0;
  182. };
  183. #endif /* CORE_EFFECTS_BASE_H */