summaryrefslogtreecommitdiff
path: root/indra/newview/llspeakers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llspeakers.cpp')
-rw-r--r--indra/newview/llspeakers.cpp162
1 files changed, 70 insertions, 92 deletions
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 1c418feabd..4573520647 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -2,25 +2,31 @@
* @file llspeakers.cpp
* @brief Management interface for muting and controlling volume of residents currently speaking
*
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
@@ -78,7 +84,7 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c
bool LLSpeaker::isInVoiceChannel()
{
- return mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
+ return mStatus == LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
}
LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source)
@@ -245,8 +251,6 @@ bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_
LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) :
mVoiceChannel(channelp)
-, mVoiceModerated(false)
-, mModerateModeHandledFirstTime(false)
{
static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0);
@@ -293,36 +297,9 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
return speakerp;
}
-// *TODO: Once way to request the current voice channel moderation mode is implemented
-// this method with related code should be removed.
-/*
- Initializes "moderate_mode" of voice session on first join.
-
- This is WORKAROUND because a way to request the current voice channel moderation mode exists
- but is not implemented in viewer yet. See EXT-6937.
-*/
-void LLSpeakerMgr::initVoiceModerateMode()
-{
- if (!mModerateModeHandledFirstTime && (mVoiceChannel && mVoiceChannel->isActive()))
- {
- LLPointer<LLSpeaker> speakerp;
-
- if (mSpeakers.find(gAgentID) != mSpeakers.end())
- {
- speakerp = mSpeakers[gAgentID];
- }
-
- if (speakerp.notNull())
- {
- mVoiceModerated = speakerp->mModeratorMutedVoice;
- mModerateModeHandledFirstTime = true;
- }
- }
-}
-
void LLSpeakerMgr::update(BOOL resort_ok)
{
- if (!LLVoiceClient::getInstance())
+ if (!gVoiceClient)
{
return;
}
@@ -336,7 +313,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
}
// update status of all current speakers
- BOOL voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
+ BOOL voice_channel_active = (!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end();)
{
LLUUID speaker_id = speaker_it->first;
@@ -344,21 +321,21 @@ void LLSpeakerMgr::update(BOOL resort_ok)
speaker_map_t::iterator cur_speaker_it = speaker_it++;
- if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))
+ if (voice_channel_active && gVoiceClient->getVoiceEnabled(speaker_id))
{
- speakerp->mSpeechVolume = LLVoiceClient::getInstance()->getCurrentPower(speaker_id);
- BOOL moderator_muted_voice = LLVoiceClient::getInstance()->getIsModeratorMuted(speaker_id);
+ speakerp->mSpeechVolume = gVoiceClient->getCurrentPower(speaker_id);
+ BOOL moderator_muted_voice = gVoiceClient->getIsModeratorMuted(speaker_id);
if (moderator_muted_voice != speakerp->mModeratorMutedVoice)
{
speakerp->mModeratorMutedVoice = moderator_muted_voice;
speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));
}
- if (LLVoiceClient::getInstance()->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
+ if (gVoiceClient->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
{
speakerp->mStatus = LLSpeaker::STATUS_MUTED;
}
- else if (LLVoiceClient::getInstance()->getIsSpeaking(speaker_id))
+ else if (gVoiceClient->getIsSpeaking(speaker_id))
{
// reset inactivity expiration
if (speakerp->mStatus != LLSpeaker::STATUS_SPEAKING)
@@ -440,21 +417,19 @@ void LLSpeakerMgr::update(BOOL resort_ok)
void LLSpeakerMgr::updateSpeakerList()
{
// are we bound to the currently active voice channel?
- if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
- {
- std::set<LLUUID> participants;
- LLVoiceClient::getInstance()->getParticipantList(participants);
- // add new participants to our list of known speakers
- for (std::set<LLUUID>::iterator participant_it = participants.begin();
- participant_it != participants.end();
- ++participant_it)
+ if ((!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
+ {
+ LLVoiceClient::participantMap* participants = gVoiceClient->getParticipantList();
+ if(participants)
{
- setSpeaker(*participant_it,
- LLVoiceClient::getInstance()->getDisplayName(*participant_it),
- LLSpeaker::STATUS_VOICE_ACTIVE,
- (LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
-
+ LLVoiceClient::participantMap::iterator participant_it;
+ // add new participants to our list of known speakers
+ for (participant_it = participants->begin(); participant_it != participants->end(); ++participant_it)
+ {
+ LLVoiceClient::participantState* participantp = participant_it->second;
+ setSpeaker(participantp->mAvatarID, participantp->mDisplayName, LLSpeaker::STATUS_VOICE_ACTIVE, (participantp->isAvatar()?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
+ }
}
}
}
@@ -544,7 +519,7 @@ void LLSpeakerMgr::speakerChatted(const LLUUID& speaker_id)
BOOL LLSpeakerMgr::isVoiceActive()
{
// mVoiceChannel = NULL means current voice channel, whatever it is
- return LLVoiceClient::getInstance()->voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive();
+ return LLVoiceClient::voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive();
}
@@ -784,26 +759,43 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu
new ModerationResponder(getSessionID()));
}
-void LLIMSpeakerMgr::moderateVoiceAllParticipants( bool unmute_everyone )
+void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else)
{
- if (mVoiceModerated == !unmute_everyone)
- {
- // session already in requested state. Just force participants which do not match it.
- forceVoiceModeratedMode(mVoiceModerated);
- }
- else
- {
- // otherwise set moderated mode for a whole session.
- moderateVoiceSession(getSessionID(), !unmute_everyone);
- }
+ // *TODO: mantipov: add more intellectual processing of several following requests if it is needed.
+ /*
+ Such situation should be tested:
+ "Moderator sends the same second request before first response is come"
+ Moderator sends "mute everyone else" for A and then for B
+ two requests to disallow voice chat are sent
+ UUID of B is stored.
+ Then first response (to disallow voice chat) is come
+ request to allow voice for stored avatar (B)
+ Then second response (to disallow voice chat) is come
+ have nothing to do, the latest selected speaker is already enabled
+
+ What can happen?
+ If request to allow voice for stored avatar (B) is processed on server BEFORE
+ second request to disallow voice chat all speakers will be disabled on voice.
+ But I'm not sure such situation is possible.
+ See EXT-3431.
+ */
+
+ mReverseVoiceModeratedAvatarID = excluded_avatar_id;
+ moderateVoiceSession(getSessionID(), !unmute_everyone_else);
}
void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
{
+ if (mReverseVoiceModeratedAvatarID.isNull()) return;
+
if (session_update.has("moderated_mode") &&
session_update["moderated_mode"].has("voice"))
{
- mVoiceModerated = session_update["moderated_mode"]["voice"];
+ BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+
+ moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated);
+
+ mReverseVoiceModeratedAvatarID = LLUUID::null;
}
}
@@ -823,20 +815,6 @@ void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallo
LLHTTPClient::post(url, data, new ModerationResponder(session_id));
}
-void LLIMSpeakerMgr::forceVoiceModeratedMode(bool should_be_muted)
-{
- for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
- {
- LLUUID speaker_id = speaker_it->first;
- LLSpeaker* speakerp = speaker_it->second;
-
- // participant does not match requested state
- if (should_be_muted != (bool)speakerp->mModeratorMutedVoice)
- {
- moderateVoiceParticipant(speaker_id, !should_be_muted);
- }
- }
-}
//
// LLActiveSpeakerMgr