aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/source.cpp11
-rw-r--r--alc/alu.cpp4
-rw-r--r--alc/alu.h2
-rw-r--r--alc/context.cpp10
-rw-r--r--alc/context.h5
-rw-r--r--core/context.h6
6 files changed, 13 insertions, 25 deletions
diff --git a/al/source.cpp b/al/source.cpp
index 8361f83e..027cd535 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -3741,12 +3741,6 @@ void ALsource::eax_update(
eax_update_primary_fx_slot_id();
}
}
-
- if (dirty_flags.air_absorption_hf)
- {
- eax_set_air_absorption_factor();
- mPropsDirty.set(std::memory_order_release);
- }
}
void ALsource::eax_commit()
@@ -5364,10 +5358,7 @@ void ALsource::eax_set_room_rolloff_factor()
void ALsource::eax_set_air_absorption_factor()
{
- const auto air_absorption_factor =
- eax_al_context_->eax_get_air_absorption_factor() * eax_.source.flAirAbsorptionFactor;
-
- AirAbsorptionFactor = air_absorption_factor;
+ AirAbsorptionFactor = eax_.source.flAirAbsorptionFactor;
}
void ALsource::eax_set_direct_hf_auto_flag()
diff --git a/alc/alu.cpp b/alc/alu.cpp
index b8fd85ea..3e35d735 100644
--- a/alc/alu.cpp
+++ b/alc/alu.cpp
@@ -399,6 +399,7 @@ bool CalcContextParams(ContextBase *ctx)
ctx->mParams.Gain = props->Gain * ctx->mGainBoost;
ctx->mParams.MetersPerUnit = props->MetersPerUnit;
+ ctx->mParams.AirAbsorptionGainHF = props->AirAbsorptionGainHF;
ctx->mParams.DopplerFactor = props->DopplerFactor;
ctx->mParams.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity;
@@ -1434,7 +1435,8 @@ void CalcAttnSourceParams(Voice *voice, const VoiceProps *props, const ContextBa
context->mParams.MetersPerUnit};
if(props->AirAbsorptionFactor > 0.0f)
{
- const float hfattn{std::pow(AirAbsorbGainHF, meters_base*props->AirAbsorptionFactor)};
+ const float hfattn{std::pow(context->mParams.AirAbsorptionGainHF,
+ meters_base*props->AirAbsorptionFactor)};
DryGain.HF *= hfattn;
std::for_each(std::begin(WetGain), std::begin(WetGain)+NumSends,
[hfattn](GainTriplet &gain) noexcept -> void { gain.HF *= hfattn; });
diff --git a/alc/alu.h b/alc/alu.h
index 7b92bba1..b88f7cf5 100644
--- a/alc/alu.h
+++ b/alc/alu.h
@@ -12,8 +12,6 @@ enum class StereoEncoding : unsigned char;
constexpr float GainMixMax{1000.0f}; /* +60dB */
-constexpr float AirAbsorbGainHF{0.99426f}; /* -0.05dB */
-
void aluInit(void);
diff --git a/alc/context.cpp b/alc/context.cpp
index f24282f8..bd03eb67 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -181,6 +181,7 @@ void ALCcontext::init()
mParams.Velocity = alu::Vector{};
mParams.Gain = mListener.Gain;
mParams.MetersPerUnit = mListener.mMetersPerUnit;
+ mParams.AirAbsorptionGainHF = mAirAbsorptionGainHF;
mParams.DopplerFactor = mDopplerFactor;
mParams.SpeedOfSound = mSpeedOfSound * mDopplerVelocity;
mParams.SourceDistanceModel = mSourceDistanceModel;
@@ -572,11 +573,6 @@ float ALCcontext::eax_get_max_filter_gain() const noexcept
return eax_max_filter_gain_;
}
-float ALCcontext::eax_get_air_absorption_factor() const noexcept
-{
- return eax_air_absorption_factor_;
-}
-
EaxFxSlotIndex ALCcontext::eax_get_previous_primary_fx_slot_index() const noexcept
{
return eax_previous_primary_fx_slot_index_;
@@ -951,7 +947,8 @@ void ALCcontext::eax_set_distance_factor()
void ALCcontext::eax_set_air_absorbtion_hf()
{
- eax_air_absorption_factor_ = eax_.context.flAirAbsorptionHF / EAXCONTEXT_DEFAULTAIRABSORPTIONHF;
+ mAirAbsorptionGainHF = eax_.context.flAirAbsorptionHF;
+ mPropsDirty.set(std::memory_order_release);
}
void ALCcontext::eax_set_hf_reference()
@@ -1360,7 +1357,6 @@ void ALCcontext::eax_apply_deferred()
if (eax_context_dirty_flags_.flAirAbsorptionHF)
{
- eax_context_shared_dirty_flags_.air_absorption_hf = true;
eax_set_air_absorbtion_hf();
}
diff --git a/alc/context.h b/alc/context.h
index 26aeedb7..f2e88cd4 100644
--- a/alc/context.h
+++ b/alc/context.h
@@ -33,7 +33,6 @@ struct EaxContextSharedDirtyFlags
using EaxIsBitFieldStruct = bool;
EaxContextSharedDirtyFlagsValue primary_fx_slot_id : 1;
- EaxContextSharedDirtyFlagsValue air_absorption_hf : 1;
}; // EaxContextSharedDirtyFlags
@@ -116,6 +115,7 @@ struct ALCcontext : public al::intrusive_ref<ALCcontext>, ContextBase {
float mDopplerFactor{1.0f};
float mDopplerVelocity{1.0f};
float mSpeedOfSound{SpeedOfSoundMetersPerSec};
+ float mAirAbsorptionGainHF{AirAbsorbGainHF};
std::mutex mEventCbLock;
ALEVENTPROCSOFT mEventCb{};
@@ -252,8 +252,6 @@ public:
float eax_get_max_filter_gain() const noexcept;
- float eax_get_air_absorption_factor() const noexcept;
-
EaxFxSlotIndex eax_get_previous_primary_fx_slot_index() const noexcept;
EaxFxSlotIndex eax_get_primary_fx_slot_index() const noexcept;
@@ -342,7 +340,6 @@ private:
unsigned long eax_speaker_config_{};
float eax_max_filter_gain_{};
- float eax_air_absorption_factor_{};
EaxFxSlotIndex eax_previous_primary_fx_slot_index_{};
EaxFxSlotIndex eax_primary_fx_slot_index_{};
EaxFxSlots eax_fx_slots_{};
diff --git a/core/context.h b/core/context.h
index 5f1f2ae1..f5768629 100644
--- a/core/context.h
+++ b/core/context.h
@@ -28,6 +28,8 @@ using uint = unsigned int;
constexpr float SpeedOfSoundMetersPerSec{343.3f};
+constexpr float AirAbsorbGainHF{0.99426f}; /* -0.05dB */
+
enum class DistanceModel : unsigned char {
Disable,
Inverse, InverseClamped,
@@ -56,6 +58,7 @@ struct ContextProps {
std::array<float,3> OrientUp;
float Gain;
float MetersPerUnit;
+ float AirAbsorptionGainHF;
float DopplerFactor;
float DopplerVelocity;
@@ -78,9 +81,10 @@ struct ContextParams {
float Gain{1.0f};
float MetersPerUnit{1.0f};
+ float AirAbsorptionGainHF{AirAbsorbGainHF};
float DopplerFactor{1.0f};
- float SpeedOfSound{343.3f}; /* in units per sec! */
+ float SpeedOfSound{SpeedOfSoundMetersPerSec}; /* in units per sec! */
bool SourceDistanceModel{false};
DistanceModel mDistanceModel{};