diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index bddadf6e26..573dab030e 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -730,6 +730,7 @@ float approximateGain(const AvatarAudioStream& listeningNodeStream, const Positi float d = (1.0f / ATTN_DISTANCE_REF) * std::max(distance, HRTF_NEARFIELD_MIN); gain = gain / d; + gain = std::min(gain, ATTN_GAIN_MAX); // avatar: skip master gain - it is constant for all streams return gain; @@ -780,6 +781,7 @@ float computeGain(float masterListenerGain, const AvatarAudioStream& listeningNo // reference attenuation of 0dB at distance = ATTN_DISTANCE_REF float d = (1.0f / ATTN_DISTANCE_REF) * std::max(distance, HRTF_NEARFIELD_MIN); gain *= fastExp2f(fastLog2f(g) * fastLog2f(d)); + gain = std::min(gain, ATTN_GAIN_MAX); return gain; } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 82674ddc72..990834fcb8 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1955,6 +1955,7 @@ float AudioClient::gainForSource(float distance, float volume) { // reference attenuation of 0dB at distance = ATTN_DISTANCE_REF float d = (1.0f / ATTN_DISTANCE_REF) * std::max(distance, HRTF_NEARFIELD_MIN); float gain = volume / d; + gain = std::min(gain, ATTN_GAIN_MAX); return gain; } diff --git a/libraries/audio/src/AudioHRTF.h b/libraries/audio/src/AudioHRTF.h index 952c4e4af6..de104db226 100644 --- a/libraries/audio/src/AudioHRTF.h +++ b/libraries/audio/src/AudioHRTF.h @@ -32,6 +32,7 @@ static const float HRTF_HEAD_RADIUS = 0.0875f; // average human head in meters // Distance attenuation static const float ATTN_DISTANCE_REF = 1.0f; // distance where attn is 0dB +static const float ATTN_GAIN_MAX = 8.0f; // max gain allowed by distance attn (+18dB) class AudioHRTF {