fshifter.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "config.h"
  2. #include "AL/al.h"
  3. #include "AL/efx.h"
  4. #include "aloptional.h"
  5. #include "effects.h"
  6. #include "effects/base.h"
  7. namespace {
  8. al::optional<FShifterDirection> DirectionFromEmum(ALenum value)
  9. {
  10. switch(value)
  11. {
  12. case AL_FREQUENCY_SHIFTER_DIRECTION_DOWN: return al::make_optional(FShifterDirection::Down);
  13. case AL_FREQUENCY_SHIFTER_DIRECTION_UP: return al::make_optional(FShifterDirection::Up);
  14. case AL_FREQUENCY_SHIFTER_DIRECTION_OFF: return al::make_optional(FShifterDirection::Off);
  15. }
  16. return al::nullopt;
  17. }
  18. ALenum EnumFromDirection(FShifterDirection dir)
  19. {
  20. switch(dir)
  21. {
  22. case FShifterDirection::Down: return AL_FREQUENCY_SHIFTER_DIRECTION_DOWN;
  23. case FShifterDirection::Up: return AL_FREQUENCY_SHIFTER_DIRECTION_UP;
  24. case FShifterDirection::Off: return AL_FREQUENCY_SHIFTER_DIRECTION_OFF;
  25. }
  26. throw std::runtime_error{"Invalid direction: "+std::to_string(static_cast<int>(dir))};
  27. }
  28. void Fshifter_setParamf(EffectProps *props, ALenum param, float val)
  29. {
  30. switch(param)
  31. {
  32. case AL_FREQUENCY_SHIFTER_FREQUENCY:
  33. if(!(val >= AL_FREQUENCY_SHIFTER_MIN_FREQUENCY && val <= AL_FREQUENCY_SHIFTER_MAX_FREQUENCY))
  34. throw effect_exception{AL_INVALID_VALUE, "Frequency shifter frequency out of range"};
  35. props->Fshifter.Frequency = val;
  36. break;
  37. default:
  38. throw effect_exception{AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x",
  39. param};
  40. }
  41. }
  42. void Fshifter_setParamfv(EffectProps *props, ALenum param, const float *vals)
  43. { Fshifter_setParamf(props, param, vals[0]); }
  44. void Fshifter_setParami(EffectProps *props, ALenum param, int val)
  45. {
  46. switch(param)
  47. {
  48. case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION:
  49. if(auto diropt = DirectionFromEmum(val))
  50. props->Fshifter.LeftDirection = *diropt;
  51. else
  52. throw effect_exception{AL_INVALID_VALUE,
  53. "Unsupported frequency shifter left direction: 0x%04x", val};
  54. break;
  55. case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION:
  56. if(auto diropt = DirectionFromEmum(val))
  57. props->Fshifter.RightDirection = *diropt;
  58. else
  59. throw effect_exception{AL_INVALID_VALUE,
  60. "Unsupported frequency shifter right direction: 0x%04x", val};
  61. break;
  62. default:
  63. throw effect_exception{AL_INVALID_ENUM,
  64. "Invalid frequency shifter integer property 0x%04x", param};
  65. }
  66. }
  67. void Fshifter_setParamiv(EffectProps *props, ALenum param, const int *vals)
  68. { Fshifter_setParami(props, param, vals[0]); }
  69. void Fshifter_getParami(const EffectProps *props, ALenum param, int *val)
  70. {
  71. switch(param)
  72. {
  73. case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION:
  74. *val = EnumFromDirection(props->Fshifter.LeftDirection);
  75. break;
  76. case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION:
  77. *val = EnumFromDirection(props->Fshifter.RightDirection);
  78. break;
  79. default:
  80. throw effect_exception{AL_INVALID_ENUM,
  81. "Invalid frequency shifter integer property 0x%04x", param};
  82. }
  83. }
  84. void Fshifter_getParamiv(const EffectProps *props, ALenum param, int *vals)
  85. { Fshifter_getParami(props, param, vals); }
  86. void Fshifter_getParamf(const EffectProps *props, ALenum param, float *val)
  87. {
  88. switch(param)
  89. {
  90. case AL_FREQUENCY_SHIFTER_FREQUENCY:
  91. *val = props->Fshifter.Frequency;
  92. break;
  93. default:
  94. throw effect_exception{AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x",
  95. param};
  96. }
  97. }
  98. void Fshifter_getParamfv(const EffectProps *props, ALenum param, float *vals)
  99. { Fshifter_getParamf(props, param, vals); }
  100. EffectProps genDefaultProps() noexcept
  101. {
  102. EffectProps props{};
  103. props.Fshifter.Frequency = AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY;
  104. props.Fshifter.LeftDirection = *DirectionFromEmum(AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION);
  105. props.Fshifter.RightDirection = *DirectionFromEmum(AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION);
  106. return props;
  107. }
  108. } // namespace
  109. DEFINE_ALEFFECT_VTABLE(Fshifter);
  110. const EffectProps FshifterEffectProps{genDefaultProps()};