11 #include "backends/base.h"
12 #include "core/bformatdec.h"
13 #include "core/bs2b.h"
14 #include "core/front_stablizer.h"
15 #include "core/hrtf.h"
16 #include "core/logging.h"
17 #include "core/mastering.h"
18 #include "core/uhjfilter.h"
28 ALCdevice::ALCdevice(DeviceType type
) : DeviceBase
{type
}
31 ALCdevice::~ALCdevice()
33 TRACE("Freeing device %p\n", voidp
{this});
37 size_t count
{std::accumulate(BufferList
.cbegin(), BufferList
.cend(), size_t{0u},
38 [](size_t cur
, const BufferSubList
&sublist
) noexcept
-> size_t
39 { return cur
+ static_cast<uint
>(al::popcount(~sublist
.FreeMask
)); })};
41 WARN("%zu Buffer%s not deleted\n", count
, (count
==1)?"":"s");
43 count
= std::accumulate(EffectList
.cbegin(), EffectList
.cend(), size_t{0u},
44 [](size_t cur
, const EffectSubList
&sublist
) noexcept
-> size_t
45 { return cur
+ static_cast<uint
>(al::popcount(~sublist
.FreeMask
)); });
47 WARN("%zu Effect%s not deleted\n", count
, (count
==1)?"":"s");
49 count
= std::accumulate(FilterList
.cbegin(), FilterList
.cend(), size_t{0u},
50 [](size_t cur
, const FilterSubList
&sublist
) noexcept
-> size_t
51 { return cur
+ static_cast<uint
>(al::popcount(~sublist
.FreeMask
)); });
53 WARN("%zu Filter%s not deleted\n", count
, (count
==1)?"":"s");
56 void ALCdevice::enumerateHrtfs()
58 mHrtfList
= EnumerateHrtf(configValue
<std::string
>(nullptr, "hrtf-paths"));
59 if(auto defhrtfopt
= configValue
<std::string
>(nullptr, "default-hrtf"))
61 auto iter
= std::find(mHrtfList
.begin(), mHrtfList
.end(), *defhrtfopt
);
62 if(iter
== mHrtfList
.end())
63 WARN("Failed to find default HRTF \"%s\"\n", defhrtfopt
->c_str());
64 else if(iter
!= mHrtfList
.begin())
65 std::rotate(mHrtfList
.begin(), iter
, iter
+1);
69 auto ALCdevice::getOutputMode1() const noexcept
-> OutputMode1
71 if(mContexts
.load(std::memory_order_relaxed
)->empty())
72 return OutputMode1::Any
;
76 case DevFmtMono
: return OutputMode1::Mono
;
79 return OutputMode1::Hrtf
;
81 return OutputMode1::Uhj2
;
82 return OutputMode1::StereoBasic
;
83 case DevFmtQuad
: return OutputMode1::Quad
;
84 case DevFmtX51
: return OutputMode1::X51
;
85 case DevFmtX61
: return OutputMode1::X61
;
86 case DevFmtX71
: return OutputMode1::X71
;
88 case DevFmtAmbi3D
: break;
90 return OutputMode1::Any
;