echo.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. static_assert(EchoMaxDelay >= AL_ECHO_MAX_DELAY, "Echo max delay too short");
  8. static_assert(EchoMaxLRDelay >= AL_ECHO_MAX_LRDELAY, "Echo max left-right delay too short");
  9. void Echo_setParami(EffectProps*, ALenum param, int)
  10. { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param}; }
  11. void Echo_setParamiv(EffectProps*, ALenum param, const int*)
  12. { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param}; }
  13. void Echo_setParamf(EffectProps *props, ALenum param, float val)
  14. {
  15. switch(param)
  16. {
  17. case AL_ECHO_DELAY:
  18. if(!(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY))
  19. throw effect_exception{AL_INVALID_VALUE, "Echo delay out of range"};
  20. props->Echo.Delay = val;
  21. break;
  22. case AL_ECHO_LRDELAY:
  23. if(!(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY))
  24. throw effect_exception{AL_INVALID_VALUE, "Echo LR delay out of range"};
  25. props->Echo.LRDelay = val;
  26. break;
  27. case AL_ECHO_DAMPING:
  28. if(!(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING))
  29. throw effect_exception{AL_INVALID_VALUE, "Echo damping out of range"};
  30. props->Echo.Damping = val;
  31. break;
  32. case AL_ECHO_FEEDBACK:
  33. if(!(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK))
  34. throw effect_exception{AL_INVALID_VALUE, "Echo feedback out of range"};
  35. props->Echo.Feedback = val;
  36. break;
  37. case AL_ECHO_SPREAD:
  38. if(!(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD))
  39. throw effect_exception{AL_INVALID_VALUE, "Echo spread out of range"};
  40. props->Echo.Spread = val;
  41. break;
  42. default:
  43. throw effect_exception{AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param};
  44. }
  45. }
  46. void Echo_setParamfv(EffectProps *props, ALenum param, const float *vals)
  47. { Echo_setParamf(props, param, vals[0]); }
  48. void Echo_getParami(const EffectProps*, ALenum param, int*)
  49. { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param}; }
  50. void Echo_getParamiv(const EffectProps*, ALenum param, int*)
  51. { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param}; }
  52. void Echo_getParamf(const EffectProps *props, ALenum param, float *val)
  53. {
  54. switch(param)
  55. {
  56. case AL_ECHO_DELAY:
  57. *val = props->Echo.Delay;
  58. break;
  59. case AL_ECHO_LRDELAY:
  60. *val = props->Echo.LRDelay;
  61. break;
  62. case AL_ECHO_DAMPING:
  63. *val = props->Echo.Damping;
  64. break;
  65. case AL_ECHO_FEEDBACK:
  66. *val = props->Echo.Feedback;
  67. break;
  68. case AL_ECHO_SPREAD:
  69. *val = props->Echo.Spread;
  70. break;
  71. default:
  72. throw effect_exception{AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param};
  73. }
  74. }
  75. void Echo_getParamfv(const EffectProps *props, ALenum param, float *vals)
  76. { Echo_getParamf(props, param, vals); }
  77. EffectProps genDefaultProps() noexcept
  78. {
  79. EffectProps props{};
  80. props.Echo.Delay = AL_ECHO_DEFAULT_DELAY;
  81. props.Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY;
  82. props.Echo.Damping = AL_ECHO_DEFAULT_DAMPING;
  83. props.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK;
  84. props.Echo.Spread = AL_ECHO_DEFAULT_SPREAD;
  85. return props;
  86. }
  87. } // namespace
  88. DEFINE_ALEFFECT_VTABLE(Echo);
  89. const EffectProps EchoEffectProps{genDefaultProps()};