🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.7 KiB

  1. #include "config.h"
  2. #include "device.h"
  3. #include <numeric>
  4. #include <stddef.h>
  5. #include "albit.h"
  6. #include "alconfig.h"
  7. #include "backends/base.h"
  8. #include "core/bformatdec.h"
  9. #include "core/bs2b.h"
  10. #include "core/front_stablizer.h"
  11. #include "core/hrtf.h"
  12. #include "core/logging.h"
  13. #include "core/mastering.h"
  14. #include "core/uhjfilter.h"
  15. namespace {
  16. using voidp = void*;
  17. } // namespace
  18. ALCdevice::ALCdevice(DeviceType type) : DeviceBase{type}
  19. { }
  20. ALCdevice::~ALCdevice()
  21. {
  22. TRACE("Freeing device %p\n", voidp{this});
  23. Backend = nullptr;
  24. size_t count{std::accumulate(BufferList.cbegin(), BufferList.cend(), size_t{0u},
  25. [](size_t cur, const BufferSubList &sublist) noexcept -> size_t
  26. { return cur + static_cast<uint>(al::popcount(~sublist.FreeMask)); })};
  27. if(count > 0)
  28. WARN("%zu Buffer%s not deleted\n", count, (count==1)?"":"s");
  29. count = std::accumulate(EffectList.cbegin(), EffectList.cend(), size_t{0u},
  30. [](size_t cur, const EffectSubList &sublist) noexcept -> size_t
  31. { return cur + static_cast<uint>(al::popcount(~sublist.FreeMask)); });
  32. if(count > 0)
  33. WARN("%zu Effect%s not deleted\n", count, (count==1)?"":"s");
  34. count = std::accumulate(FilterList.cbegin(), FilterList.cend(), size_t{0u},
  35. [](size_t cur, const FilterSubList &sublist) noexcept -> size_t
  36. { return cur + static_cast<uint>(al::popcount(~sublist.FreeMask)); });
  37. if(count > 0)
  38. WARN("%zu Filter%s not deleted\n", count, (count==1)?"":"s");
  39. }
  40. void ALCdevice::enumerateHrtfs()
  41. {
  42. mHrtfList = EnumerateHrtf(configValue<std::string>(nullptr, "hrtf-paths"));
  43. if(auto defhrtfopt = configValue<std::string>(nullptr, "default-hrtf"))
  44. {
  45. auto iter = std::find(mHrtfList.begin(), mHrtfList.end(), *defhrtfopt);
  46. if(iter == mHrtfList.end())
  47. WARN("Failed to find default HRTF \"%s\"\n", defhrtfopt->c_str());
  48. else if(iter != mHrtfList.begin())
  49. std::rotate(mHrtfList.begin(), iter, iter+1);
  50. }
  51. }
  52. auto ALCdevice::getOutputMode1() const noexcept -> OutputMode1
  53. {
  54. if(mContexts.load(std::memory_order_relaxed)->empty())
  55. return OutputMode1::Any;
  56. switch(FmtChans)
  57. {
  58. case DevFmtMono: return OutputMode1::Mono;
  59. case DevFmtStereo:
  60. if(mHrtf)
  61. return OutputMode1::Hrtf;
  62. else if(mUhjEncoder)
  63. return OutputMode1::Uhj2;
  64. return OutputMode1::StereoBasic;
  65. case DevFmtQuad: return OutputMode1::Quad;
  66. case DevFmtX51: return OutputMode1::X51;
  67. case DevFmtX61: return OutputMode1::X61;
  68. case DevFmtX71: return OutputMode1::X71;
  69. case DevFmtX3D71:
  70. case DevFmtAmbi3D: break;
  71. }
  72. return OutputMode1::Any;
  73. }