llcallfloater.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcallfloater.h
  3.  * @author Mike Antipov
  4.  * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
  5.  *
  6.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2009-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLCALLFLOATER_H
  34. #define LL_LLCALLFLOATER_H
  35. #include "lltransientdockablefloater.h"
  36. #include "llvoicechannel.h"
  37. #include "llvoiceclient.h"
  38. class LLAvatarList;
  39. class LLAvatarListItem;
  40. class LLNonAvatarCaller;
  41. class LLOutputMonitorCtrl;
  42. class LLParticipantList;
  43. class LLSpeakerMgr;
  44. class LLSpeakersDelayActionsStorage;
  45. /**
  46.  * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
  47.  * It can be torn-off and freely positioned onscreen.
  48.  *
  49.  * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over 
  50.  * the Resident's own microphone input volume, the audible volume of each of the other participants,
  51.  * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
  52.  *
  53.  * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an 
  54.  * 'Leave Call' button to allow the Resident to leave that voice channel.
  55.  */
  56. class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
  57. {
  58. public:
  59. LOG_CLASS(LLCallFloater);
  60. LLCallFloater(const LLSD& key);
  61. ~LLCallFloater();
  62. /*virtual*/ BOOL postBuild();
  63. /*virtual*/ void onOpen(const LLSD& key);
  64. /*virtual*/ void draw();
  65. /**
  66.  * Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
  67.  *
  68.  * Refreshes list to display participants not in voice as disabled.
  69.  */
  70. /*virtual*/ void onChange();
  71. static void sOnCurrentChannelChanged(const LLUUID& session_id);
  72. private:
  73. typedef enum e_voice_controls_type
  74. {
  75. VC_LOCAL_CHAT,
  76. VC_GROUP_CHAT,
  77. VC_AD_HOC_CHAT,
  78. VC_PEER_TO_PEER,
  79. VC_PEER_TO_PEER_AVALINE
  80. }EVoiceControls;
  81. typedef enum e_speaker_state
  82. {
  83. STATE_UNKNOWN,
  84. STATE_INVITED,
  85. STATE_JOINED,
  86. STATE_LEFT,
  87. } ESpeakerState;
  88. typedef std::map<LLUUID, ESpeakerState> speaker_state_map_t;
  89. void leaveCall();
  90. /**
  91.  * Updates mSpeakerManager and list according to current Voice Channel
  92.  *
  93.  * It compares mSpeakerManager & current Voice Channel session IDs.
  94.  * If they are different gets Speaker manager related to current channel and updates channel participant list.
  95.  */
  96. void updateSession();
  97. /**
  98.  * Refreshes participant list according to current Voice Channel
  99.  */
  100. void refreshParticipantList();
  101. /**
  102.  * Handles event on avatar list is refreshed after it was marked dirty.
  103.  *
  104.  * It sets initial participants voice states (once after the first refreshing)
  105.  * and updates voice states each time anybody is joined/left voice chat in session.
  106.  */
  107. void onAvatarListRefreshed();
  108. void updateTitle();
  109. void initAgentData();
  110. void setModeratorMutedVoice(bool moderator_muted);
  111. void updateAgentModeratorState();
  112. /**
  113.  * Sets initial participants voice states in avatar list (Invited, Joined, Has Left).
  114.  *
  115.  * @see refreshParticipantList()
  116.  * @see onAvatarListRefreshed()
  117.  * @see mInitParticipantsVoiceState
  118.  */
  119. void initParticipantsVoiceState();
  120. /**
  121.  * Updates participants voice states in avatar list (Invited, Joined, Has Left).
  122.  *
  123.  * @see onAvatarListRefreshed()
  124.  * @see onChanged()
  125.  */
  126. void updateParticipantsVoiceState();
  127. /**
  128.  * Updates voice state of participant not in current voice channel depend on its current state.
  129.  */
  130. void updateNotInVoiceParticipantState(LLAvatarListItem* item);
  131. void setState(LLAvatarListItem* item, ESpeakerState state);
  132. void setState(const LLUUID& speaker_id, ESpeakerState state)
  133. {
  134. lldebugs << "Storing state: " << speaker_id << ", " << state << llendl;
  135. mSpeakerStateMap[speaker_id] = state;
  136. }
  137. ESpeakerState getState(const LLUUID& speaker_id)
  138. {
  139. lldebugs << "Getting state: " << speaker_id << ", " << mSpeakerStateMap[speaker_id] << llendl;
  140. return mSpeakerStateMap[speaker_id];
  141. }
  142. /**
  143.  * Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created.
  144.  *
  145.  * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires.
  146.  */
  147. void setVoiceRemoveTimer(const LLUUID& voice_speaker_id);
  148. /**
  149.  * Removes specified by UUID Avatar List item.
  150.  *
  151.  * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
  152.  */
  153. bool removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
  154. /**
  155.  * Deletes all timers from the list to prevent started timers from ticking after destruction
  156.  * and after switching on another voice channel.
  157.  */
  158. void resetVoiceRemoveTimers();
  159. /**
  160.  * Removes specified by UUID timer from the map.
  161.  *
  162.  * @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map.
  163.  */
  164. void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id);
  165. /**
  166.  * Called by LLParticipantList before adding a speaker to the participant list.
  167.  *
  168.  * If false is returned, the speaker will not be added to the list.
  169.  *
  170.  * @param speaker_id Speaker to validate.
  171.  * @return true if this is a valid speaker, false otherwise.
  172.  */
  173. bool validateSpeaker(const LLUUID& speaker_id);
  174. /**
  175.  * Connects to passed channel to be updated according to channel's voice states.
  176.  */
  177. void connectToChannel(LLVoiceChannel* channel);
  178. /**
  179.  * Callback to process changing of voice channel's states.
  180.  */
  181. void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
  182. /**
  183.  * Updates floater according to passed channel's voice state.
  184.  */
  185. void updateState(const LLVoiceChannel::EState& new_state);
  186. /**
  187.  * Resets floater to be ready to show voice participants.
  188.  *
  189.  * Clears all data from the latest voice session.
  190.  */
  191. void reset(const LLVoiceChannel::EState& new_state);
  192. private:
  193. speaker_state_map_t mSpeakerStateMap;
  194. LLSpeakerMgr* mSpeakerManager;
  195. LLParticipantList* mParticipants;
  196. LLAvatarList* mAvatarList;
  197. LLNonAvatarCaller* mNonAvatarCaller;
  198. EVoiceControls mVoiceType;
  199. LLPanel* mAgentPanel;
  200. LLOutputMonitorCtrl* mSpeakingIndicator;
  201. bool mIsModeratorMutedVoice;
  202. /**
  203.  * Flag indicated that participants voice states should be initialized.
  204.  *
  205.  * It is used due to Avatar List has delayed refreshing after it content is changed.
  206.  * Real initializing is performed when Avatar List is first time refreshed.
  207.  *
  208.  * @see onAvatarListRefreshed()
  209.  * @see initParticipantsVoiceState()
  210.  */
  211. bool mInitParticipantsVoiceState;
  212. boost::signals2::connection mAvatarListRefreshConnection;
  213. /**
  214.  * time out speakers when they are not part of current session
  215.  */
  216. LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
  217. /**
  218.  * Stores reference to current voice channel.
  219.  *
  220.  * Is used to ignore voice channel changed callback for the same channel.
  221.  *
  222.  * @see sOnCurrentChannelChanged()
  223.  */
  224. static LLVoiceChannel* sCurrentVoiceCanel;
  225. /* virtual */
  226. LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
  227. boost::signals2::connection mVoiceChannelStateChangeConnection;
  228. };
  229. #endif //LL_LLCALLFLOATER_H