equalizer.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "config.h"
  2. #include "AL/al.h"
  3. #include "AL/efx.h"
  4. #include "effects.h"
  5. #include "effects/base.h"
  6. namespace {
  7. void Equalizer_setParami(EffectProps*, ALenum param, int)
  8. { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param}; }
  9. void Equalizer_setParamiv(EffectProps*, ALenum param, const int*)
  10. {
  11. throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x",
  12. param};
  13. }
  14. void Equalizer_setParamf(EffectProps *props, ALenum param, float val)
  15. {
  16. switch(param)
  17. {
  18. case AL_EQUALIZER_LOW_GAIN:
  19. if(!(val >= AL_EQUALIZER_MIN_LOW_GAIN && val <= AL_EQUALIZER_MAX_LOW_GAIN))
  20. throw effect_exception{AL_INVALID_VALUE, "Equalizer low-band gain out of range"};
  21. props->Equalizer.LowGain = val;
  22. break;
  23. case AL_EQUALIZER_LOW_CUTOFF:
  24. if(!(val >= AL_EQUALIZER_MIN_LOW_CUTOFF && val <= AL_EQUALIZER_MAX_LOW_CUTOFF))
  25. throw effect_exception{AL_INVALID_VALUE, "Equalizer low-band cutoff out of range"};
  26. props->Equalizer.LowCutoff = val;
  27. break;
  28. case AL_EQUALIZER_MID1_GAIN:
  29. if(!(val >= AL_EQUALIZER_MIN_MID1_GAIN && val <= AL_EQUALIZER_MAX_MID1_GAIN))
  30. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid1-band gain out of range"};
  31. props->Equalizer.Mid1Gain = val;
  32. break;
  33. case AL_EQUALIZER_MID1_CENTER:
  34. if(!(val >= AL_EQUALIZER_MIN_MID1_CENTER && val <= AL_EQUALIZER_MAX_MID1_CENTER))
  35. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid1-band center out of range"};
  36. props->Equalizer.Mid1Center = val;
  37. break;
  38. case AL_EQUALIZER_MID1_WIDTH:
  39. if(!(val >= AL_EQUALIZER_MIN_MID1_WIDTH && val <= AL_EQUALIZER_MAX_MID1_WIDTH))
  40. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid1-band width out of range"};
  41. props->Equalizer.Mid1Width = val;
  42. break;
  43. case AL_EQUALIZER_MID2_GAIN:
  44. if(!(val >= AL_EQUALIZER_MIN_MID2_GAIN && val <= AL_EQUALIZER_MAX_MID2_GAIN))
  45. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid2-band gain out of range"};
  46. props->Equalizer.Mid2Gain = val;
  47. break;
  48. case AL_EQUALIZER_MID2_CENTER:
  49. if(!(val >= AL_EQUALIZER_MIN_MID2_CENTER && val <= AL_EQUALIZER_MAX_MID2_CENTER))
  50. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid2-band center out of range"};
  51. props->Equalizer.Mid2Center = val;
  52. break;
  53. case AL_EQUALIZER_MID2_WIDTH:
  54. if(!(val >= AL_EQUALIZER_MIN_MID2_WIDTH && val <= AL_EQUALIZER_MAX_MID2_WIDTH))
  55. throw effect_exception{AL_INVALID_VALUE, "Equalizer mid2-band width out of range"};
  56. props->Equalizer.Mid2Width = val;
  57. break;
  58. case AL_EQUALIZER_HIGH_GAIN:
  59. if(!(val >= AL_EQUALIZER_MIN_HIGH_GAIN && val <= AL_EQUALIZER_MAX_HIGH_GAIN))
  60. throw effect_exception{AL_INVALID_VALUE, "Equalizer high-band gain out of range"};
  61. props->Equalizer.HighGain = val;
  62. break;
  63. case AL_EQUALIZER_HIGH_CUTOFF:
  64. if(!(val >= AL_EQUALIZER_MIN_HIGH_CUTOFF && val <= AL_EQUALIZER_MAX_HIGH_CUTOFF))
  65. throw effect_exception{AL_INVALID_VALUE, "Equalizer high-band cutoff out of range"};
  66. props->Equalizer.HighCutoff = val;
  67. break;
  68. default:
  69. throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param};
  70. }
  71. }
  72. void Equalizer_setParamfv(EffectProps *props, ALenum param, const float *vals)
  73. { Equalizer_setParamf(props, param, vals[0]); }
  74. void Equalizer_getParami(const EffectProps*, ALenum param, int*)
  75. { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param}; }
  76. void Equalizer_getParamiv(const EffectProps*, ALenum param, int*)
  77. {
  78. throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x",
  79. param};
  80. }
  81. void Equalizer_getParamf(const EffectProps *props, ALenum param, float *val)
  82. {
  83. switch(param)
  84. {
  85. case AL_EQUALIZER_LOW_GAIN:
  86. *val = props->Equalizer.LowGain;
  87. break;
  88. case AL_EQUALIZER_LOW_CUTOFF:
  89. *val = props->Equalizer.LowCutoff;
  90. break;
  91. case AL_EQUALIZER_MID1_GAIN:
  92. *val = props->Equalizer.Mid1Gain;
  93. break;
  94. case AL_EQUALIZER_MID1_CENTER:
  95. *val = props->Equalizer.Mid1Center;
  96. break;
  97. case AL_EQUALIZER_MID1_WIDTH:
  98. *val = props->Equalizer.Mid1Width;
  99. break;
  100. case AL_EQUALIZER_MID2_GAIN:
  101. *val = props->Equalizer.Mid2Gain;
  102. break;
  103. case AL_EQUALIZER_MID2_CENTER:
  104. *val = props->Equalizer.Mid2Center;
  105. break;
  106. case AL_EQUALIZER_MID2_WIDTH:
  107. *val = props->Equalizer.Mid2Width;
  108. break;
  109. case AL_EQUALIZER_HIGH_GAIN:
  110. *val = props->Equalizer.HighGain;
  111. break;
  112. case AL_EQUALIZER_HIGH_CUTOFF:
  113. *val = props->Equalizer.HighCutoff;
  114. break;
  115. default:
  116. throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param};
  117. }
  118. }
  119. void Equalizer_getParamfv(const EffectProps *props, ALenum param, float *vals)
  120. { Equalizer_getParamf(props, param, vals); }
  121. EffectProps genDefaultProps() noexcept
  122. {
  123. EffectProps props{};
  124. props.Equalizer.LowCutoff = AL_EQUALIZER_DEFAULT_LOW_CUTOFF;
  125. props.Equalizer.LowGain = AL_EQUALIZER_DEFAULT_LOW_GAIN;
  126. props.Equalizer.Mid1Center = AL_EQUALIZER_DEFAULT_MID1_CENTER;
  127. props.Equalizer.Mid1Gain = AL_EQUALIZER_DEFAULT_MID1_GAIN;
  128. props.Equalizer.Mid1Width = AL_EQUALIZER_DEFAULT_MID1_WIDTH;
  129. props.Equalizer.Mid2Center = AL_EQUALIZER_DEFAULT_MID2_CENTER;
  130. props.Equalizer.Mid2Gain = AL_EQUALIZER_DEFAULT_MID2_GAIN;
  131. props.Equalizer.Mid2Width = AL_EQUALIZER_DEFAULT_MID2_WIDTH;
  132. props.Equalizer.HighCutoff = AL_EQUALIZER_DEFAULT_HIGH_CUTOFF;
  133. props.Equalizer.HighGain = AL_EQUALIZER_DEFAULT_HIGH_GAIN;
  134. return props;
  135. }
  136. } // namespace
  137. DEFINE_ALEFFECT_VTABLE(Equalizer);
  138. const EffectProps EqualizerEffectProps{genDefaultProps()};