phoenix-firestorm/indra/newview/llcallfloater.h

273 lines
8.1 KiB
C++

/**
* @file llcallfloater.h
* @author Mike Antipov
* @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* 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
*
* 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
*
* 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.
*
* 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$
*/
#ifndef LL_LLCALLFLOATER_H
#define LL_LLCALLFLOATER_H
#include "lltransientdockablefloater.h"
#include "llvoicechannel.h"
#include "llvoiceclient.h"
class LLAvatarList;
class LLAvatarListItem;
class LLNonAvatarCaller;
class LLOutputMonitorCtrl;
class LLParticipantList;
class LLSpeakerMgr;
class LLSpeakersDelayActionsStorage;
/**
* The Voice Control Panel is an ambient window summoned by clicking the flyout chevron
* on the Speak button. It can be torn-off and freely positioned onscreen.
*
* When the Resident is engaged in Voice Chat, the Voice Control Panel provides control
* over the audible volume of each of the other participants, the Resident's own Voice
* Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
*
* When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel
* also provides a 'Leave Call' button to allow the Resident to leave that voice channel.
*/
class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
{
public:
LOG_CLASS(LLCallFloater);
LLCallFloater(const LLSD& key);
~LLCallFloater();
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void draw();
/**
* Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
*
* Refreshes list to display participants not in voice as disabled.
*/
/*virtual*/ void onParticipantsChanged();
static void sOnCurrentChannelChanged(const LLUUID& session_id);
private:
typedef enum e_voice_controls_type
{
VC_LOCAL_CHAT,
VC_GROUP_CHAT,
VC_AD_HOC_CHAT,
VC_PEER_TO_PEER,
VC_PEER_TO_PEER_AVALINE
}EVoiceControls;
typedef enum e_speaker_state
{
STATE_UNKNOWN,
STATE_INVITED,
STATE_JOINED,
STATE_LEFT,
} ESpeakerState;
typedef std::map<LLUUID, ESpeakerState> speaker_state_map_t;
void leaveCall();
/**
* Updates mSpeakerManager and list according to current Voice Channel
*
* It compares mSpeakerManager & current Voice Channel session IDs.
* If they are different gets Speaker manager related to current channel and updates channel participant list.
*/
void updateSession();
/**
* Refreshes participant list according to current Voice Channel
*/
void refreshParticipantList();
/**
* Handles event on avatar list is refreshed after it was marked dirty.
*
* It sets initial participants voice states (once after the first refreshing)
* and updates voice states each time anybody is joined/left voice chat in session.
*/
void onAvatarListRefreshed();
void updateTitle();
void initAgentData();
void setModeratorMutedVoice(bool moderator_muted);
void updateAgentModeratorState();
/**
* Sets initial participants voice states in avatar list (Invited, Joined, Has Left).
*
* @see refreshParticipantList()
* @see onAvatarListRefreshed()
* @see mInitParticipantsVoiceState
*/
void initParticipantsVoiceState();
/**
* Updates participants voice states in avatar list (Invited, Joined, Has Left).
*
* @see onAvatarListRefreshed()
* @see onChanged()
*/
void updateParticipantsVoiceState();
/**
* Updates voice state of participant not in current voice channel depend on its current state.
*/
void updateNotInVoiceParticipantState(LLAvatarListItem* item);
void setState(LLAvatarListItem* item, ESpeakerState state);
void setState(const LLUUID& speaker_id, ESpeakerState state)
{
lldebugs << "Storing state: " << speaker_id << ", " << state << llendl;
mSpeakerStateMap[speaker_id] = state;
}
ESpeakerState getState(const LLUUID& speaker_id)
{
lldebugs << "Getting state: " << speaker_id << ", " << mSpeakerStateMap[speaker_id] << llendl;
return mSpeakerStateMap[speaker_id];
}
/**
* Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created.
*
* @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires.
*/
void setVoiceRemoveTimer(const LLUUID& voice_speaker_id);
/**
* Removes specified by UUID Avatar List item.
*
* @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
*/
bool removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
/**
* Deletes all timers from the list to prevent started timers from ticking after destruction
* and after switching on another voice channel.
*/
void resetVoiceRemoveTimers();
/**
* Removes specified by UUID timer from the map.
*
* @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map.
*/
void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id);
/**
* Called by LLParticipantList before adding a speaker to the participant list.
*
* If false is returned, the speaker will not be added to the list.
*
* @param speaker_id Speaker to validate.
* @return true if this is a valid speaker, false otherwise.
*/
bool validateSpeaker(const LLUUID& speaker_id);
/**
* Connects to passed channel to be updated according to channel's voice states.
*/
void connectToChannel(LLVoiceChannel* channel);
/**
* Callback to process changing of voice channel's states.
*/
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
/**
* Updates floater according to passed channel's voice state.
*/
void updateState(const LLVoiceChannel::EState& new_state);
/**
* Resets floater to be ready to show voice participants.
*
* Clears all data from the latest voice session.
*/
void reset(const LLVoiceChannel::EState& new_state);
private:
speaker_state_map_t mSpeakerStateMap;
LLSpeakerMgr* mSpeakerManager;
LLParticipantList* mParticipants;
LLAvatarList* mAvatarList;
LLNonAvatarCaller* mNonAvatarCaller;
EVoiceControls mVoiceType;
LLPanel* mAgentPanel;
LLOutputMonitorCtrl* mSpeakingIndicator;
bool mIsModeratorMutedVoice;
/**
* Flag indicated that participants voice states should be initialized.
*
* It is used due to Avatar List has delayed refreshing after it content is changed.
* Real initializing is performed when Avatar List is first time refreshed.
*
* @see onAvatarListRefreshed()
* @see initParticipantsVoiceState()
*/
bool mInitParticipantsVoiceState;
boost::signals2::connection mAvatarListRefreshConnection;
/**
* time out speakers when they are not part of current session
*/
LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
/**
* Stores reference to current voice channel.
*
* Is used to ignore voice channel changed callback for the same channel.
*
* @see sOnCurrentChannelChanged()
*/
static LLVoiceChannel* sCurrentVoiceChannel;
/* virtual */
LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
boost::signals2::connection mVoiceChannelStateChangeConnection;
};
#endif //LL_LLCALLFLOATER_H