summaryrefslogtreecommitdiff
path: root/indra/newview/llaudiosourcevo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llaudiosourcevo.cpp')
-rw-r--r--indra/newview/llaudiosourcevo.cpp98
1 files changed, 79 insertions, 19 deletions
diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp
index b37aba6c15..4b6c855bde 100644
--- a/indra/newview/llaudiosourcevo.cpp
+++ b/indra/newview/llaudiosourcevo.cpp
@@ -29,8 +29,10 @@
#include "llaudiosourcevo.h"
+#include "llagent.h"
#include "llagentcamera.h"
#include "llmutelist.h"
+#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp)
@@ -54,6 +56,79 @@ void LLAudioSourceVO::setGain(const F32 gain)
mGain = llclamp(gain, 0.f, 1.f);
}
+void LLAudioSourceVO::checkCutOffRadius()
+{
+ if (mSourceMuted // already muted by something, will be recalculated on update()
+ || !mObjectp)
+ {
+ return;
+ }
+
+ F32 cutoff = mObjectp->getSoundCutOffRadius();
+ if (cutoff < 0.1f)
+ {
+ // consider cutoff below 0.1m as off (to avoid near zero comparison)
+ return;
+ }
+
+ LLVector3d pos_global = getPosGlobal();
+ if (!isInCutOffRadius(pos_global, cutoff))
+ {
+ mSourceMuted = true;
+ }
+}
+
+LLVector3d LLAudioSourceVO::getPosGlobal() const
+{
+ if (mObjectp->isAttachment())
+ {
+ LLViewerObject* parent = mObjectp;
+ while (parent && !parent->isAvatar())
+ {
+ parent = (LLViewerObject*)parent->getParent();
+ }
+ if (parent)
+ {
+ return parent->getPositionGlobal();
+ }
+ }
+ else
+ {
+ return mObjectp->getPositionGlobal();
+ }
+ return LLVector3d();
+}
+
+bool LLAudioSourceVO::isInCutOffRadius(const LLVector3d pos_global, const F32 cutoff) const
+{
+ static LLCachedControl<S32> ear_mode(gSavedSettings, "VoiceEarLocation", 0);
+
+ LLVector3d pos_ear;
+
+ switch (ear_mode())
+ {
+ case 0: // camera
+ pos_ear = gAgentCamera.getCameraPositionGlobal();
+ break;
+
+ case 1: // avatar
+ case 2:
+ // voice support 'mixed' in '2' case with agent's position and camera's rotations
+ // but it is not defined in settings and uses camera as default
+ pos_ear = gAgent.getPositionGlobal();
+ break;
+
+ default:
+ pos_ear = gAgentCamera.getCameraPositionGlobal();
+ break;
+ }
+ LLVector3d to_vec = pos_global - pos_ear;
+
+ F32 dist = (F32)to_vec.magVec();
+
+ return dist < cutoff;
+}
+
void LLAudioSourceVO::updateMute()
{
if (!mObjectp || mObjectp->isDead())
@@ -63,26 +138,11 @@ void LLAudioSourceVO::updateMute()
}
bool mute = false;
- LLVector3d pos_global;
-
- if (mObjectp->isAttachment())
- {
- LLViewerObject* parent = mObjectp;
- while (parent && !parent->isAvatar())
- {
- parent = (LLViewerObject*)parent->getParent();
- }
- if (parent)
- {
- pos_global = parent->getPositionGlobal();
- }
- }
- else
- {
- pos_global = mObjectp->getPositionGlobal();
- }
+ LLVector3d pos_global = getPosGlobal();
- if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global))
+ F32 cutoff = mObjectp->getSoundCutOffRadius();
+ if ((cutoff > 0.1f && !isInCutOffRadius(pos_global, cutoff)) // consider cutoff below 0.1m as off
+ || !LLViewerParcelMgr::getInstance()->canHearSound(pos_global))
{
mute = true;
}