00001 00033 #include "llviewerprecompiledheaders.h" 00034 00035 #include "llaudiosourcevo.h" 00036 00037 #include "llagent.h" 00038 #include "llmutelist.h" 00039 #include "llviewerparcelmgr.h" 00040 00041 LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp) 00042 : LLAudioSource(sound_id, owner_id, gain), 00043 mObjectp(objectp), 00044 mActualGain(gain) 00045 { 00046 setAmbient(FALSE); 00047 updateGain(); 00048 update(); 00049 } 00050 00051 LLAudioSourceVO::~LLAudioSourceVO() 00052 { 00053 if (mObjectp) 00054 { 00055 mObjectp->clearAttachedSound(); 00056 } 00057 mObjectp = NULL; 00058 } 00059 00060 void LLAudioSourceVO::setGain(const F32 gain) 00061 { 00062 mActualGain = llclamp(gain, 0.f, 1.f); 00063 updateGain(); 00064 } 00065 00066 void LLAudioSourceVO::updateGain() 00067 { 00068 if (!mObjectp) 00069 { 00070 return; 00071 } 00072 00073 BOOL mute = FALSE; 00074 LLVector3d pos_global; 00075 00076 if (mObjectp->isAttachment()) 00077 { 00078 LLViewerObject* parent = mObjectp; 00079 while (parent && !parent->isAvatar()) 00080 { 00081 parent = (LLViewerObject*)parent->getParent(); 00082 } 00083 if (parent) 00084 { 00085 pos_global = parent->getPositionGlobal(); 00086 } 00087 } 00088 else 00089 { 00090 pos_global = mObjectp->getPositionGlobal(); 00091 } 00092 00093 if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global)) 00094 { 00095 mute = TRUE; 00096 } 00097 00098 if (!mute) 00099 { 00100 if (LLMuteList::getInstance()->isMuted(mObjectp->getID())) 00101 { 00102 mute = TRUE; 00103 } 00104 else if (LLMuteList::getInstance()->isMuted(mOwnerID, LLMute::flagObjectSounds)) 00105 { 00106 mute = TRUE; 00107 } 00108 else if (mObjectp->isAttachment()) 00109 { 00110 LLViewerObject* parent = mObjectp; 00111 while (parent && !parent->isAvatar()) 00112 { 00113 parent = (LLViewerObject*)parent->getParent(); 00114 } 00115 if (parent 00116 && LLMuteList::getInstance()->isMuted(parent->getID())) 00117 { 00118 mute = TRUE; 00119 } 00120 } 00121 } 00122 00123 if (!mute) 00124 { 00125 mGain = mActualGain; 00126 } 00127 else 00128 { 00129 mGain = 0.f; 00130 } 00131 } 00132 00133 00134 void LLAudioSourceVO::update() 00135 { 00136 if (!mObjectp) 00137 { 00138 return; 00139 } 00140 00141 if (mObjectp->isDead()) 00142 { 00143 mObjectp = NULL; 00144 return; 00145 } 00146 00147 updateGain(); 00148 if (mObjectp->isHUDAttachment()) 00149 { 00150 mPositionGlobal = gAgent.getCameraPositionGlobal(); 00151 } 00152 else 00153 { 00154 mPositionGlobal = mObjectp->getPositionGlobal(); 00155 } 00156 if (mObjectp->getSubParent()) 00157 { 00158 mVelocity = mObjectp->getSubParent()->getVelocity(); 00159 } 00160 else 00161 { 00162 mVelocity = mObjectp->getVelocity(); 00163 } 00164 00165 LLAudioSource::update(); 00166 }