aboutsummaryrefslogtreecommitdiffstats
path: root/alc/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alc/context.cpp')
-rw-r--r--alc/context.cpp57
1 files changed, 35 insertions, 22 deletions
diff --git a/alc/context.cpp b/alc/context.cpp
index 1bee2ea7..525d4a5f 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -247,30 +247,27 @@ bool ALCcontext::deinit()
return ret;
}
-void ALCcontext::processUpdates()
+void ALCcontext::applyAllUpdates()
{
- if(mDeferUpdates.exchange(false, std::memory_order_acq_rel))
- {
- /* Tell the mixer to stop applying updates, then wait for any active
- * updating to finish, before providing updates.
- */
- mHoldUpdates.store(true, std::memory_order_release);
- while((mUpdateCount.load(std::memory_order_acquire)&1) != 0) {
- /* busy-wait */
- }
+ /* Tell the mixer to stop applying updates, then wait for any active
+ * updating to finish, before providing updates.
+ */
+ mHoldUpdates.store(true, std::memory_order_release);
+ while((mUpdateCount.load(std::memory_order_acquire)&1) != 0) {
+ /* busy-wait */
+ }
- if(mPropsDirty.test_and_clear(std::memory_order_acq_rel))
- UpdateContextProps(this);
- if(mListener.mPropsDirty.test_and_clear(std::memory_order_acq_rel))
- UpdateListenerProps(this);
- UpdateAllEffectSlotProps(this);
- UpdateAllSourceProps(this);
+ if(mPropsDirty.test_and_clear(std::memory_order_acq_rel))
+ UpdateContextProps(this);
+ if(mListener.mPropsDirty.test_and_clear(std::memory_order_acq_rel))
+ UpdateListenerProps(this);
+ UpdateAllEffectSlotProps(this);
+ UpdateAllSourceProps(this);
- /* Now with all updates declared, let the mixer continue applying them
- * so they all happen at once.
- */
- mHoldUpdates.store(false, std::memory_order_release);
- }
+ /* Now with all updates declared, let the mixer continue applying them so
+ * they all happen at once.
+ */
+ mHoldUpdates.store(false, std::memory_order_release);
}
#ifdef ALSOFT_EAX
@@ -950,7 +947,8 @@ void ALCcontext::eax_set_primary_fx_slot_id()
void ALCcontext::eax_set_distance_factor()
{
- eax_set_al_listener_meters_per_unit(*this, eax_.context.flDistanceFactor);
+ mListener.mMetersPerUnit = eax_.context.flDistanceFactor;
+ mListener.mPropsDirty.set(std::memory_order_release);
}
void ALCcontext::eax_set_air_absorbtion_hf()
@@ -1326,6 +1324,21 @@ void ALCcontext::eax_set(
if (!eax_call.is_deferred())
{
eax_apply_deferred();
+ if(!mDeferUpdates.load(std::memory_order_acquire))
+ {
+ mHoldUpdates.store(true, std::memory_order_release);
+ while((mUpdateCount.load(std::memory_order_acquire)&1) != 0) {
+ /* busy-wait */
+ }
+
+ if(mPropsDirty.test_and_clear(std::memory_order_acq_rel))
+ UpdateContextProps(this);
+ if(mListener.mPropsDirty.test_and_clear(std::memory_order_acq_rel))
+ UpdateListenerProps(this);
+ UpdateAllSourceProps(this);
+
+ mHoldUpdates.store(false, std::memory_order_release);
+ }
}
}