filter.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef AL_FILTER_H
  2. #define AL_FILTER_H
  3. #include <array>
  4. #include <cstdint>
  5. #include <string_view>
  6. #include <utility>
  7. #include <variant>
  8. #include "AL/al.h"
  9. #include "AL/alc.h"
  10. #include "AL/efx.h"
  11. #include "almalloc.h"
  12. #include "alnumeric.h"
  13. struct ALfilter;
  14. inline constexpr float LowPassFreqRef{5000.0f};
  15. inline constexpr float HighPassFreqRef{250.0f};
  16. template<typename T>
  17. struct FilterTable {
  18. static void setParami(ALCcontext*, ALfilter*, ALenum, int);
  19. static void setParamiv(ALCcontext*, ALfilter*, ALenum, const int*);
  20. static void setParamf(ALCcontext*, ALfilter*, ALenum, float);
  21. static void setParamfv(ALCcontext*, ALfilter*, ALenum, const float*);
  22. static void getParami(ALCcontext*, const ALfilter*, ALenum, int*);
  23. static void getParamiv(ALCcontext*, const ALfilter*, ALenum, int*);
  24. static void getParamf(ALCcontext*, const ALfilter*, ALenum, float*);
  25. static void getParamfv(ALCcontext*, const ALfilter*, ALenum, float*);
  26. private:
  27. FilterTable() = default;
  28. friend T;
  29. };
  30. struct NullFilterTable : public FilterTable<NullFilterTable> { };
  31. struct LowpassFilterTable : public FilterTable<LowpassFilterTable> { };
  32. struct HighpassFilterTable : public FilterTable<HighpassFilterTable> { };
  33. struct BandpassFilterTable : public FilterTable<BandpassFilterTable> { };
  34. struct ALfilter {
  35. ALenum type{AL_FILTER_NULL};
  36. float Gain{1.0f};
  37. float GainHF{1.0f};
  38. float HFReference{LowPassFreqRef};
  39. float GainLF{1.0f};
  40. float LFReference{HighPassFreqRef};
  41. using TableTypes = std::variant<NullFilterTable,LowpassFilterTable,HighpassFilterTable,
  42. BandpassFilterTable>;
  43. TableTypes mTypeVariant;
  44. /* Self ID */
  45. ALuint id{0};
  46. static void SetName(ALCcontext *context, ALuint id, std::string_view name);
  47. DISABLE_ALLOC
  48. };
  49. struct FilterSubList {
  50. uint64_t FreeMask{~0_u64};
  51. gsl::owner<std::array<ALfilter,64>*> Filters{nullptr};
  52. FilterSubList() noexcept = default;
  53. FilterSubList(const FilterSubList&) = delete;
  54. FilterSubList(FilterSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Filters{rhs.Filters}
  55. { rhs.FreeMask = ~0_u64; rhs.Filters = nullptr; }
  56. ~FilterSubList();
  57. FilterSubList& operator=(const FilterSubList&) = delete;
  58. FilterSubList& operator=(FilterSubList&& rhs) noexcept
  59. { std::swap(FreeMask, rhs.FreeMask); std::swap(Filters, rhs.Filters); return *this; }
  60. };
  61. #endif