47 static constexpr uint32 cScratchSize = 480;
84 void SetTaps(std::span<const ERUpdateData> newERs);
107 mutable ERState State;
111 class RealtimeData final
114 RealtimeData() =
default;
115 ~RealtimeData() =
default;
118 RealtimeData(
const RealtimeData&) =
delete;
119 RealtimeData& operator=(
const RealtimeData&) =
delete;
131 float* ChannelGains =
nullptr;
134 std::atomic<ERState> State;
139 TargetERData TargetData;
140 RealtimeData* RealtimeState;
143 inline bool operator==(
const typename ERBus::ER& other)
145 return other.Id == Id;
148 inline bool operator==(
const typename ERBus::ERUpdateData& other)
150 return other.Id == Id;
166 ERStorage() =
delete;
168 explicit ERStorage(std::pmr::memory_resource& resource);
169 ERStorage(std::pmr::memory_resource& resource,
uint32 numChannels);
171 ERStorage(
const ERStorage& other);
172 ERStorage& operator=(
const ERStorage& other);
174 ERStorage(ERStorage&& other)
noexcept;
175 ERStorage& operator=(ERStorage&& other)
noexcept;
179 using AllocatorType = std::pmr::polymorphic_allocator<>;
180 AllocatorType GetAllocator()
const {
return mAllocator; }
182 void UpdateChannelGains(
float*& destination,
const float* source);
183 float* AllocateCopyChannelGains(
const float* source);
184 void DeallocateChannelGains(
float* gains);
186 const std::pmr::vector<ER>& GetERs()
const {
return ERs; }
187 std::pmr::vector<ER>& GetERs() {
return ERs; }
189 ER* FindERByID(
uint32 id);
191 template<std::ranges::range UpdateData>
192 void PartitionERs(
const UpdateData& updateERs, std::span<ER>& outFoundERs, std::span<ER>& outNotFoundERs);
194 TargetERData MakeTargetERData(
const JPL::simd& filterGains,
195 const float* channelGains,
196 float delayInSamples,
199 void UpdateTargetERData(TargetERData& er,
201 const float* channelGains,
202 float delayInSamples,
206 template <
class Predicate>
207 std::size_t EraseIf(Predicate predicate);
210 template <
class Predicate>
211 std::size_t EraseIf(std::size_t begin, std::size_t count, Predicate predicate);
213 std::size_t Erase(std::size_t begin, std::size_t count);
216 std::size_t InsertNewERs(std::pmr::vector<ER>&& newERs);
219 float* AllocateChannelGains();
220 void AllocateCopyChannelGains(
const std::pmr::vector<ER>& source);
223 std::pmr::polymorphic_allocator<float> mAllocator;
224 std::pmr::vector<ER> ERs;
229 using SafeERsWrite =
typename SafeERs::ScopedAccess<JPL::ThreadType::nonRealtime>;
230 using SafeERsRead =
typename SafeERs::ScopedAccess<JPL::ThreadType::realtime>;
233 RealtimeData* AllocateRTData();
234 RealtimeData* AllocateRTData(
const JPL::simd& filterGains,
float delayInSamples, ERState state);
235 void DeallocateRTData(RealtimeData* data);
239 std::pmr::unsynchronized_pool_resource mPool;
248 float mSampleRate = 48'000.0f;