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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llspeakers.h
  3.  * @brief Management interface for muting and controlling volume of residents currently speaking
  4.  *
  5.  * $LicenseInfo:firstyear=2005&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2005-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLSPEAKERS_H
  33. #define LL_LLSPEAKERS_H
  34. #include "llevent.h"
  35. #include "lleventtimer.h"
  36. #include "llspeakers.h"
  37. #include "llvoicechannel.h"
  38. class LLSpeakerMgr;
  39. // data for a given participant in a voice channel
  40. class LLSpeaker : public LLRefCount, public LLOldEvents::LLObservable, public LLHandleProvider<LLSpeaker>, public boost::signals2::trackable
  41. {
  42. public:
  43. typedef enum e_speaker_type
  44. {
  45. SPEAKER_AGENT,
  46. SPEAKER_OBJECT,
  47. SPEAKER_EXTERNAL // Speaker that doesn't map to an avatar or object (i.e. PSTN caller in a group)
  48. } ESpeakerType;
  49. typedef enum e_speaker_status
  50. {
  51. STATUS_SPEAKING,
  52. STATUS_HAS_SPOKEN,
  53. STATUS_VOICE_ACTIVE,
  54. STATUS_TEXT_ONLY,
  55. STATUS_NOT_IN_CHANNEL,
  56. STATUS_MUTED
  57. } ESpeakerStatus;
  58. LLSpeaker(const LLUUID& id, const std::string& name = LLStringUtil::null, const ESpeakerType type = SPEAKER_AGENT);
  59. ~LLSpeaker() {};
  60. void lookupName();
  61. void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
  62. bool isInVoiceChannel();
  63. ESpeakerStatus mStatus; // current activity status in speech group
  64. F32 mLastSpokeTime; // timestamp when this speaker last spoke
  65. F32 mSpeechVolume; // current speech amplitude (timea average rms amplitude?)
  66. std::string mDisplayName; // cache user name for this speaker
  67. BOOL mHasSpoken; // has this speaker said anything this session?
  68. BOOL mHasLeftCurrentCall; // has this speaker left the current voice call?
  69. LLColor4 mDotColor;
  70. LLUUID mID;
  71. BOOL mTyping;
  72. S32 mSortIndex;
  73. ESpeakerType mType;
  74. BOOL mIsModerator;
  75. BOOL mModeratorMutedVoice;
  76. BOOL mModeratorMutedText;
  77. };
  78. class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent
  79. {
  80. public:
  81. LLSpeakerUpdateModeratorEvent(LLSpeaker* source);
  82. /*virtual*/ LLSD getValue();
  83. private:
  84. const LLUUID& mSpeakerID;
  85. BOOL mIsModerator;
  86. };
  87. class LLSpeakerTextModerationEvent : public LLOldEvents::LLEvent
  88. {
  89. public:
  90. LLSpeakerTextModerationEvent(LLSpeaker* source);
  91. /*virtual*/ LLSD getValue();
  92. };
  93. class LLSpeakerVoiceModerationEvent : public LLOldEvents::LLEvent
  94. {
  95. public:
  96. LLSpeakerVoiceModerationEvent(LLSpeaker* source);
  97. /*virtual*/ LLSD getValue();
  98. };
  99. class LLSpeakerListChangeEvent : public LLOldEvents::LLEvent
  100. {
  101. public:
  102. LLSpeakerListChangeEvent(LLSpeakerMgr* source, const LLUUID& speaker_id);
  103. /*virtual*/ LLSD getValue();
  104. private:
  105. const LLUUID& mSpeakerID;
  106. };
  107. /**
  108.  * class LLSpeakerActionTimer
  109.  * 
  110.  * Implements a timer that calls stored callback action for stored speaker after passed period.
  111.  *
  112.  * Action is called until callback returns "true".
  113.  * In this case the timer will be removed via LLEventTimer::updateClass().
  114.  * Otherwise it should be deleted manually in place where it is used.
  115.  * If action callback is not set timer will tick only once and deleted.
  116.  */
  117. class LLSpeakerActionTimer : public LLEventTimer
  118. {
  119. public:
  120. typedef boost::function<bool(const LLUUID&)> action_callback_t;
  121. typedef std::map<LLUUID, LLSpeakerActionTimer*> action_timers_map_t;
  122. typedef action_timers_map_t::value_type action_value_t;
  123. typedef action_timers_map_t::const_iterator action_timer_const_iter_t;
  124. typedef action_timers_map_t::iterator action_timer_iter_t;
  125. /**
  126.  * Constructor.
  127.  *
  128.  * @param action_cb - callback which will be called each time after passed action period.
  129.  * @param action_period - time in seconds timer should tick.
  130.  * @param speaker_id - LLUUID of speaker which will be passed into action callback.
  131.  */
  132. LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id);
  133. virtual ~LLSpeakerActionTimer() {};
  134. /**
  135.  * Implements timer "tick".
  136.  *
  137.  * If action callback is not specified returns true. Instance will be deleted by LLEventTimer::updateClass().
  138.  */
  139. virtual BOOL tick();
  140. /**
  141.  * Clears the callback.
  142.  *
  143.  * Use this instead of deleteing this object. 
  144.  * The next call to tick() will return true and that will destroy this object.
  145.  */
  146. void unset();
  147. private:
  148. action_callback_t mActionCallback;
  149. LLUUID mSpeakerId;
  150. };
  151. /**
  152.  * Represents a functionality to store actions for speakers with delay.
  153.  * Is based on LLSpeakerActionTimer.
  154.  */
  155. class LLSpeakersDelayActionsStorage
  156. {
  157. public:
  158. LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay);
  159. ~LLSpeakersDelayActionsStorage();
  160. /**
  161.  * Sets new LLSpeakerActionTimer with passed speaker UUID.
  162.  */
  163. void setActionTimer(const LLUUID& speaker_id);
  164. /**
  165.  * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and optionally deletes it.
  166.  *
  167.  * @see onTimerActionCallback()
  168.  */
  169. void unsetActionTimer(const LLUUID& speaker_id);
  170. void removeAllTimers();
  171. private:
  172. /**
  173.  * Callback of the each instance of LLSpeakerActionTimer.
  174.  *
  175.  * Unsets an appropriate timer instance and calls action callback for specified speacker_id.
  176.  *
  177.  * @see unsetActionTimer()
  178.  */
  179. bool onTimerActionCallback(const LLUUID& speaker_id);
  180. LLSpeakerActionTimer::action_timers_map_t mActionTimersMap;
  181. LLSpeakerActionTimer::action_callback_t mActionCallback;
  182. /**
  183.  * Delay to call action callback for speakers after timer was set.
  184.  */
  185. F32 mActionDelay;
  186. };
  187. class LLSpeakerMgr : public LLOldEvents::LLObservable
  188. {
  189. public:
  190. LLSpeakerMgr(LLVoiceChannel* channelp);
  191. virtual ~LLSpeakerMgr();
  192. LLPointer<LLSpeaker> findSpeaker(const LLUUID& avatar_id);
  193. void update(BOOL resort_ok);
  194. void setSpeakerTyping(const LLUUID& speaker_id, BOOL typing);
  195. void speakerChatted(const LLUUID& speaker_id);
  196. LLPointer<LLSpeaker> setSpeaker(const LLUUID& id, 
  197. const std::string& name = LLStringUtil::null, 
  198. LLSpeaker::ESpeakerStatus status = LLSpeaker::STATUS_TEXT_ONLY, 
  199. LLSpeaker::ESpeakerType = LLSpeaker::SPEAKER_AGENT);
  200. BOOL isVoiceActive();
  201. typedef std::vector<LLPointer<LLSpeaker> > speaker_list_t;
  202. void getSpeakerList(speaker_list_t* speaker_list, BOOL include_text);
  203. LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
  204. const LLUUID getSessionID();
  205. protected:
  206. virtual void updateSpeakerList();
  207. void setSpeakerNotInChannel(LLSpeaker* speackerp);
  208. bool removeSpeaker(const LLUUID& speaker_id);
  209. typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
  210. speaker_map_t mSpeakers;
  211. speaker_list_t mSpeakersSorted;
  212. LLFrameTimer mSpeechTimer;
  213. LLVoiceChannel* mVoiceChannel;
  214. /**
  215.  * time out speakers when they are not part of current session
  216.  */
  217. LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
  218. };
  219. class LLIMSpeakerMgr : public LLSpeakerMgr
  220. {
  221. public:
  222. LLIMSpeakerMgr(LLVoiceChannel* channel);
  223. void updateSpeakers(const LLSD& update);
  224. void setSpeakers(const LLSD& speakers);
  225. void toggleAllowTextChat(const LLUUID& speaker_id);
  226. /**
  227.  * Mutes/Unmutes avatar for current group voice chat.
  228.  *
  229.  * It only marks avatar as muted for session and does not use local Agent's Block list.
  230.  * It does not mute Agent itself.
  231.  *
  232.  * @param[in] avatar_id UUID of avatar to be processed
  233.  * @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted.
  234.  *
  235.  * @see moderateVoiceOtherParticipants()
  236.  */
  237. void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
  238. /**
  239.  * Mutes/Unmutes all avatars except specified for current group voice chat.
  240.  *
  241.  * It only marks avatars as muted for session and does not use local Agent's Block list.
  242.  * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
  243.  *
  244.  * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
  245.  * @param[in] unmute_everyone_else if false - avatars will be muted, otherwise - unmuted.
  246.  *
  247.  * @see moderateVoiceParticipant()
  248.  */
  249. void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else);
  250. void processSessionUpdate(const LLSD& session_update);
  251. protected:
  252. virtual void updateSpeakerList();
  253. void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
  254. LLUUID mReverseVoiceModeratedAvatarID;
  255. };
  256. class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
  257. {
  258. public:
  259. LLActiveSpeakerMgr();
  260. protected:
  261. virtual void updateSpeakerList();
  262. };
  263. class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
  264. {
  265. public:
  266. LLLocalSpeakerMgr();
  267. ~LLLocalSpeakerMgr ();
  268. protected:
  269. virtual void updateSpeakerList();
  270. };
  271. #endif // LL_LLSPEAKERS_H