diff options
-rw-r--r-- | al/source.cpp | 11 | ||||
-rw-r--r-- | alc/alu.cpp | 4 | ||||
-rw-r--r-- | alc/alu.h | 2 | ||||
-rw-r--r-- | alc/context.cpp | 10 | ||||
-rw-r--r-- | alc/context.h | 5 | ||||
-rw-r--r-- | core/context.h | 6 |
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; }); @@ -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{}; |