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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvoiceclient.h
  3.  * @brief Declaration of LLVoiceClient class which is the interface to the voice client process.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-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_VOICE_CLIENT_H
  33. #define LL_VOICE_CLIENT_H
  34. class LLVOAvatar;
  35. class LLVivoxProtocolParser;
  36. #include "lliopipe.h"
  37. #include "llpumpio.h"
  38. #include "llchainio.h"
  39. #include "lliosocket.h"
  40. #include "v3math.h"
  41. #include "llframetimer.h"
  42. #include "llviewerregion.h"
  43. #include "m3math.h" // LLMatrix3
  44. class LLFriendObserver;
  45. class LLVoiceClientParticipantObserver
  46. {
  47. public:
  48. virtual ~LLVoiceClientParticipantObserver() { }
  49. virtual void onChange() = 0;
  50. };
  51. class LLVoiceClientStatusObserver
  52. {
  53. public:
  54. typedef enum e_voice_status_type
  55. {
  56. // NOTE: when updating this enum, please also update the switch in
  57. //  LLVoiceClientStatusObserver::status2string().
  58. STATUS_LOGIN_RETRY,
  59. STATUS_LOGGED_IN,
  60. STATUS_JOINING,
  61. STATUS_JOINED,
  62. STATUS_LEFT_CHANNEL,
  63. STATUS_VOICE_DISABLED,
  64. // Adding STATUS_VOICE_ENABLED as pair status for STATUS_VOICE_DISABLED
  65. // See LLVoiceClient::setVoiceEnabled()
  66. STATUS_VOICE_ENABLED,
  67. BEGIN_ERROR_STATUS,
  68. ERROR_CHANNEL_FULL,
  69. ERROR_CHANNEL_LOCKED,
  70. ERROR_NOT_AVAILABLE,
  71. ERROR_UNKNOWN
  72. } EStatusType;
  73. virtual ~LLVoiceClientStatusObserver() { }
  74. virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal) = 0;
  75. static std::string status2string(EStatusType inStatus);
  76. };
  77. class LLVoiceClient: public LLSingleton<LLVoiceClient>
  78. {
  79. LOG_CLASS(LLVoiceClient);
  80. public:
  81. LLVoiceClient();
  82. ~LLVoiceClient();
  83. public:
  84. static void init(LLPumpIO *pump); // Call this once at application startup (creates connector)
  85. static void terminate(); // Call this to clean up during shutdown
  86. protected:
  87. bool writeString(const std::string &str);
  88. public:
  89. static F32 OVERDRIVEN_POWER_LEVEL;
  90. void updateSettings(); // call after loading settings and whenever they change
  91. void getCaptureDevicesSendMessage();
  92. void getRenderDevicesSendMessage();
  93. void clearCaptureDevices();
  94. void addCaptureDevice(const std::string& name);
  95. void setCaptureDevice(const std::string& name);
  96. void clearRenderDevices();
  97. void addRenderDevice(const std::string& name);
  98. void setRenderDevice(const std::string& name);
  99. void tuningStart();
  100. void tuningStop();
  101. bool inTuningMode();
  102. bool inTuningStates();
  103. void tuningRenderStartSendMessage(const std::string& name, bool loop);
  104. void tuningRenderStopSendMessage();
  105. void tuningCaptureStartSendMessage(int duration);
  106. void tuningCaptureStopSendMessage();
  107. void tuningSetMicVolume(float volume);
  108. void tuningSetSpeakerVolume(float volume);
  109. float tuningGetEnergy(void);
  110. // This returns true when it's safe to bring up the "device settings" dialog in the prefs.
  111. // i.e. when the daemon is running and connected, and the device lists are populated.
  112. bool deviceSettingsAvailable();
  113. // Requery the vivox daemon for the current list of input/output devices.
  114. // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed
  115. // (use this if you want to know when it's done).
  116. // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim.
  117. void refreshDeviceLists(bool clearCurrentList = true);
  118. // Call this if the connection to the daemon terminates unexpectedly.  It will attempt to reset everything and relaunch.
  119. void daemonDied();
  120. // Call this if we're just giving up on voice (can't provision an account, etc.).  It will clean up and go away.
  121. void giveUp();
  122. /////////////////////////////
  123. // Response/Event handlers
  124. void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID);
  125. void loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases);
  126. void sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
  127. void sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
  128. void sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString);
  129. void logoutResponse(int statusCode, std::string &statusString);
  130. void connectorShutdownResponse(int statusCode, std::string &statusString);
  131. void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state);
  132. void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming);
  133. void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming);
  134. void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString);
  135. void sessionGroupAddedEvent(std::string &sessionGroupHandle);
  136. void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle);
  137. void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);
  138. void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
  139. void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
  140. void auxAudioPropertiesEvent(F32 energy);
  141. void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);
  142. void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
  143. void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType);
  144. void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType);
  145. void buddyListChanged();
  146. void muteListChanged();
  147. void updateFriends(U32 mask);
  148. /////////////////////////////
  149. // Sending updates of current state
  150. static void updatePosition(void);
  151. void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
  152. void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
  153. bool channelFromRegion(LLViewerRegion *region, std::string &name);
  154. void leaveChannel(void); // call this on logout or teleport begin
  155. void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
  156. bool getMuteMic() const;
  157. void setUserPTTState(bool ptt);
  158. bool getUserPTTState();
  159. void toggleUserPTTState(void);
  160. void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
  161. void setVoiceEnabled(bool enabled);
  162. static bool voiceEnabled();
  163. // Checks is voice working judging from mState
  164. // Returns true if vivox has successfully logged in and is not in error state
  165. bool voiceWorking();
  166. void setUsePTT(bool usePTT);
  167. void setPTTIsToggle(bool PTTIsToggle);
  168. bool getPTTIsToggle();
  169. void setPTTKey(std::string &key);
  170. void setEarLocation(S32 loc);
  171. void setVoiceVolume(F32 volume);
  172. void setMicGain(F32 volume);
  173. void setUserVolume(const LLUUID& id, F32 volume); // sets volume for specified agent, from 0-1 (where .5 is nominal)
  174. void setLipSyncEnabled(BOOL enabled);
  175. BOOL lipSyncEnabled();
  176. // PTT key triggering
  177. void keyDown(KEY key, MASK mask);
  178. void keyUp(KEY key, MASK mask);
  179. void middleMouseState(bool down);
  180. // Return the version of the Vivox library
  181. std::string getAPIVersion() const { return mAPIVersion; }
  182. /////////////////////////////
  183. // Accessors for data related to nearby speakers
  184. BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
  185. BOOL getIsSpeaking(const LLUUID& id);
  186. BOOL getIsModeratorMuted(const LLUUID& id);
  187. F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way.  I'm just not sure what the formula is...
  188. BOOL getOnMuteList(const LLUUID& id);
  189. F32 getUserVolume(const LLUUID& id);
  190. std::string getDisplayName(const LLUUID& id);
  191. // MBW -- XXX -- Not sure how to get this data out of the TVC
  192. BOOL getUsingPTT(const LLUUID& id);
  193. std::string getGroupID(const LLUUID& id); // group ID if the user is in group chat (empty string if not applicable)
  194. /////////////////////////////
  195. BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled.
  196. // Use this to determine whether to show a "no speech" icon in the menu bar.
  197. /////////////////////////////
  198. // Recording controls
  199. void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
  200. void recordingLoopSave(const std::string& filename);
  201. void recordingStop();
  202. // Playback controls
  203. void filePlaybackStart(const std::string& filename);
  204. void filePlaybackStop();
  205. void filePlaybackSetPaused(bool paused);
  206. void filePlaybackSetMode(bool vox = false, float speed = 1.0f);
  207. // This is used by the string-keyed maps below, to avoid storing the string twice.
  208. // The 'const std::string *' in the key points to a string actually stored in the object referenced by the map.
  209. // The add and delete operations for each map allocate and delete in the right order to avoid dangling references.
  210. // The default compare operation would just compare pointers, which is incorrect, so they must use this comparitor instead.
  211. struct stringMapComparitor
  212. {
  213. bool operator()(const std::string* a, const std::string * b) const
  214. {
  215. return a->compare(*b) < 0;
  216. }
  217. };
  218. struct uuidMapComparitor
  219. {
  220. bool operator()(const LLUUID* a, const LLUUID * b) const
  221. {
  222. return *a < *b;
  223. }
  224. };
  225. struct participantState
  226. {
  227. public:
  228. participantState(const std::string &uri);
  229. bool updateMuteState();
  230. bool isAvatar();
  231. std::string mURI;
  232. LLUUID mAvatarID;
  233. std::string mAccountName;
  234. std::string mDisplayName;
  235. LLFrameTimer mSpeakingTimeout;
  236. F32 mLastSpokeTimestamp;
  237. F32 mPower;
  238. int mVolume;
  239. std::string mGroupID;
  240. int mUserVolume;
  241. bool mPTT;
  242. bool mIsSpeaking;
  243. bool mIsModeratorMuted;
  244. bool mOnMuteList; // true if this avatar is on the user's mute list (and should be muted)
  245. bool mVolumeDirty; // true if this participant needs a volume command sent (either mOnMuteList or mUserVolume has changed)
  246. bool mAvatarIDValid;
  247. bool mIsSelf;
  248. };
  249. typedef std::map<const std::string *, participantState*, stringMapComparitor> participantMap;
  250. typedef std::map<const LLUUID *, participantState*, uuidMapComparitor> participantUUIDMap;
  251. enum streamState
  252. {
  253. streamStateUnknown = 0,
  254. streamStateIdle = 1,
  255. streamStateConnected = 2,
  256. streamStateRinging = 3,
  257. };
  258. struct sessionState
  259. {
  260. public:
  261. sessionState();
  262. ~sessionState();
  263. participantState *addParticipant(const std::string &uri);
  264. // Note: after removeParticipant returns, the participant* that was passed to it will have been deleted.
  265. // Take care not to use the pointer again after that.
  266. void removeParticipant(participantState *participant);
  267. void removeAllParticipants();
  268. participantState *findParticipant(const std::string &uri);
  269. participantState *findParticipantByID(const LLUUID& id);
  270. bool isCallBackPossible();
  271. bool isTextIMPossible();
  272. std::string mHandle;
  273. std::string mGroupHandle;
  274. std::string mSIPURI;
  275. std::string mAlias;
  276. std::string mName;
  277. std::string mAlternateSIPURI;
  278. std::string mHash; // Channel password
  279. std::string mErrorStatusString;
  280. std::queue<std::string> mTextMsgQueue;
  281. LLUUID mIMSessionID;
  282. LLUUID mCallerID;
  283. int mErrorStatusCode;
  284. int mMediaStreamState;
  285. int mTextStreamState;
  286. bool mCreateInProgress; // True if a Session.Create has been sent for this session and no response has been received yet.
  287. bool mMediaConnectInProgress; // True if a Session.MediaConnect has been sent for this session and no response has been received yet.
  288. bool mVoiceInvitePending; // True if a voice invite is pending for this session (usually waiting on a name lookup)
  289. bool mTextInvitePending; // True if a text invite is pending for this session (usually waiting on a name lookup)
  290. bool mSynthesizedCallerID; // True if the caller ID is a hash of the SIP URI -- this means we shouldn't do a name lookup.
  291. bool mIsChannel; // True for both group and spatial channels (false for p2p, PSTN)
  292. bool mIsSpatial; // True for spatial channels
  293. bool mIsP2P;
  294. bool mIncoming;
  295. bool mVoiceEnabled;
  296. bool mReconnect; // Whether we should try to reconnect to this session if it's dropped
  297. // Set to true when the mute state of someone in the participant list changes.
  298. // The code will have to walk the list to find the changed participant(s).
  299. bool mVolumeDirty;
  300. bool mParticipantsChanged;
  301. participantMap mParticipantsByURI;
  302. participantUUIDMap mParticipantsByUUID;
  303. };
  304. participantState *findParticipantByID(const LLUUID& id);
  305. participantMap *getParticipantList(void);
  306. void getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids);
  307. typedef std::map<const std::string*, sessionState*, stringMapComparitor> sessionMap;
  308. typedef std::set<sessionState*> sessionSet;
  309. typedef sessionSet::iterator sessionIterator;
  310. sessionIterator sessionsBegin(void);
  311. sessionIterator sessionsEnd(void);
  312. sessionState *findSession(const std::string &handle);
  313. sessionState *findSessionBeingCreatedByURI(const std::string &uri);
  314. sessionState *findSession(const LLUUID &participant_id);
  315. sessionState *findSessionByCreateID(const std::string &create_id);
  316. sessionState *addSession(const std::string &uri, const std::string &handle = LLStringUtil::null);
  317. void setSessionHandle(sessionState *session, const std::string &handle = LLStringUtil::null);
  318. void setSessionURI(sessionState *session, const std::string &uri);
  319. void deleteSession(sessionState *session);
  320. void deleteAllSessions(void);
  321. void verifySessionState(void);
  322. void joinedAudioSession(sessionState *session);
  323. void leftAudioSession(sessionState *session);
  324. // This is called in several places where the session _may_ need to be deleted.
  325. // It contains logic for whether to delete the session or keep it around.
  326. void reapSession(sessionState *session);
  327. // Returns true if the session seems to indicate we've moved to a region on a different voice server
  328. bool sessionNeedsRelog(sessionState *session);
  329. struct buddyListEntry
  330. {
  331. buddyListEntry(const std::string &uri);
  332. std::string mURI;
  333. std::string mDisplayName;
  334. LLUUID mUUID;
  335. bool mOnlineSL;
  336. bool mOnlineSLim;
  337. bool mCanSeeMeOnline;
  338. bool mHasBlockListEntry;
  339. bool mHasAutoAcceptListEntry;
  340. bool mNameResolved;
  341. bool mInSLFriends;
  342. bool mInVivoxBuddies;
  343. bool mNeedsNameUpdate;
  344. };
  345. typedef std::map<const std::string*, buddyListEntry*, stringMapComparitor> buddyListMap;
  346. // This should be called when parsing a buddy list entry sent by SLVoice.
  347. void processBuddyListEntry(const std::string &uri, const std::string &displayName);
  348. buddyListEntry *addBuddy(const std::string &uri);
  349. buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName);
  350. buddyListEntry *findBuddy(const std::string &uri);
  351. buddyListEntry *findBuddy(const LLUUID &id);
  352. buddyListEntry *findBuddyByDisplayName(const std::string &name);
  353. void deleteBuddy(const std::string &uri);
  354. void deleteAllBuddies(void);
  355. void deleteAllBlockRules(void);
  356. void addBlockRule(const std::string &blockMask, const std::string &presenceOnly);
  357. void deleteAllAutoAcceptRules(void);
  358. void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy);
  359. void accountListBlockRulesResponse(int statusCode, const std::string &statusString);
  360. void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString);
  361. /////////////////////////////
  362. // session control messages
  363. void connectorCreate();
  364. void connectorShutdown();
  365. void requestVoiceAccountProvision(S32 retries = 3);
  366. void userAuthorized(
  367. const std::string& firstName,
  368. const std::string& lastName,
  369. const LLUUID &agentID);
  370. void login(
  371. const std::string& account_name,
  372. const std::string& password,
  373. const std::string& voice_sip_uri_hostname,
  374. const std::string& voice_account_server_uri);
  375. void loginSendMessage();
  376. void logout();
  377. void logoutSendMessage();
  378. void accountListBlockRulesSendMessage();
  379. void accountListAutoAcceptRulesSendMessage();
  380. void sessionGroupCreateSendMessage();
  381. void sessionCreateSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
  382. void sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
  383. void sessionMediaConnectSendMessage(sessionState *session); // just joins the audio session
  384. void sessionTextConnectSendMessage(sessionState *session); // just joins the text session
  385. void sessionTerminateSendMessage(sessionState *session);
  386. void sessionGroupTerminateSendMessage(sessionState *session);
  387. void sessionMediaDisconnectSendMessage(sessionState *session);
  388. void sessionTextDisconnectSendMessage(sessionState *session);
  389. // Pokes the state machine to leave the audio session next time around.
  390. void sessionTerminate();
  391. // Pokes the state machine to shut down the connector and restart it.
  392. void requestRelog();
  393. // Does the actual work to get out of the audio session
  394. void leaveAudioSession();
  395. void addObserver(LLVoiceClientParticipantObserver* observer);
  396. void removeObserver(LLVoiceClientParticipantObserver* observer);
  397. void addObserver(LLVoiceClientStatusObserver* observer);
  398. void removeObserver(LLVoiceClientStatusObserver* observer);
  399. void addObserver(LLFriendObserver* observer);
  400. void removeObserver(LLFriendObserver* observer);
  401. void lookupName(const LLUUID &id);
  402. static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
  403. void avatarNameResolved(const LLUUID &id, const std::string &name);
  404. typedef std::vector<std::string> deviceList;
  405. deviceList *getCaptureDevices();
  406. deviceList *getRenderDevices();
  407. void setNonSpatialChannel(
  408. const std::string &uri,
  409. const std::string &credentials);
  410. void setSpatialChannel(
  411. const std::string &uri,
  412. const std::string &credentials);
  413. // start a voice session with the specified user
  414. void callUser(const LLUUID &uuid);
  415. // Send a text message to the specified user, initiating the session if necessary.
  416. bool sendTextMessage(const LLUUID& participant_id, const std::string& message);
  417. // close any existing text IM session with the specified user
  418. void endUserIMSession(const LLUUID &uuid);
  419. bool answerInvite(std::string &sessionHandle);
  420. void declineInvite(std::string &sessionHandle);
  421. void leaveNonSpatialChannel();
  422. // Returns the URI of the current channel, or an empty string if not currently in a channel.
  423. // NOTE that it will return an empty string if it's in the process of joining a channel.
  424. std::string getCurrentChannel();
  425. // returns true iff the user is currently in a proximal (local spatial) channel.
  426. // Note that gestures should only fire if this returns true.
  427. bool inProximalChannel();
  428. std::string sipURIFromID(const LLUUID &id);
  429. // Returns true if the indicated user is online via SIP presence according to SLVoice.
  430. // Note that we only get SIP presence data for other users that are in our vivox buddy list.
  431. bool isOnlineSIP(const LLUUID &id);
  432. // Returns true if the indicated participant is really an SL avatar.
  433. // This should be used to control the state of the "profile" button.
  434. // Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls.
  435. bool isParticipantAvatar(const LLUUID &id);
  436. // Returns true if calling back the session URI after the session has closed is possible.
  437. // Currently this will be false only for PSTN P2P calls.
  438. // NOTE: this will return true if the session can't be found. 
  439. bool isSessionCallBackPossible(const LLUUID &session_id);
  440. // Returns true if the session can accepte text IM's.
  441. // Currently this will be false only for PSTN P2P calls.
  442. // NOTE: this will return true if the session can't be found. 
  443. bool isSessionTextIMPossible(const LLUUID &session_id);
  444. private:
  445. // internal state for a simple state machine.  This is used to deal with the asynchronous nature of some of the messages.
  446. // Note: if you change this list, please make corresponding changes to LLVoiceClient::state2string().
  447. enum state
  448. {
  449. stateDisableCleanup,
  450. stateDisabled, // Voice is turned off.
  451. stateStart, // Class is initialized, socket is created
  452. stateDaemonLaunched, // Daemon has been launched
  453. stateConnecting, // connect() call has been issued
  454. stateConnected, // connection to the daemon has been made, send some initial setup commands.
  455. stateIdle, // socket is connected, ready for messaging
  456. stateMicTuningStart,
  457. stateMicTuningRunning,
  458. stateMicTuningStop,
  459. stateConnectorStart, // connector needs to be started
  460. stateConnectorStarting, // waiting for connector handle
  461. stateConnectorStarted, // connector handle received
  462. stateLoginRetry, // need to retry login (failed due to changing password)
  463. stateLoginRetryWait, // waiting for retry timer
  464. stateNeedsLogin, // send login request
  465. stateLoggingIn, // waiting for account handle
  466. stateLoggedIn, // account handle received
  467. stateCreatingSessionGroup, // Creating the main session group
  468. stateNoChannel, // 
  469. stateJoiningSession, // waiting for session handle
  470. stateSessionJoined, // session handle received
  471. stateRunning, // in session, steady state
  472. stateLeavingSession, // waiting for terminate session response
  473. stateSessionTerminated, // waiting for terminate session response
  474. stateLoggingOut, // waiting for logout response
  475. stateLoggedOut, // logout response received
  476. stateConnectorStopping, // waiting for connector stop
  477. stateConnectorStopped, // connector stop received
  478. // We go to this state if the login fails because the account needs to be provisioned.
  479. // error states.  No way to recover from these yet.
  480. stateConnectorFailed,
  481. stateConnectorFailedWaiting,
  482. stateLoginFailed,
  483. stateLoginFailedWaiting,
  484. stateJoinSessionFailed,
  485. stateJoinSessionFailedWaiting,
  486. stateJail // Go here when all else has failed.  Nothing will be retried, we're done.
  487. };
  488. state mState;
  489. bool mSessionTerminateRequested;
  490. bool mRelogRequested;
  491. void setState(state inState);
  492. state getState(void)  { return mState; };
  493. static std::string state2string(state inState);
  494. void stateMachine();
  495. static void idle(void *user_data);
  496. LLHost mDaemonHost;
  497. LLSocket::ptr_t mSocket;
  498. bool mConnected;
  499. void closeSocket(void);
  500. LLPumpIO *mPump;
  501. friend class LLVivoxProtocolParser;
  502. std::string mAccountName;
  503. std::string mAccountPassword;
  504. std::string mAccountDisplayName;
  505. std::string mAccountFirstName;
  506. std::string mAccountLastName;
  507. bool mTuningMode;
  508. float mTuningEnergy;
  509. std::string mTuningAudioFile;
  510. int mTuningMicVolume;
  511. bool mTuningMicVolumeDirty;
  512. int mTuningSpeakerVolume;
  513. bool mTuningSpeakerVolumeDirty;
  514. state mTuningExitState; // state to return to when we leave tuning mode.
  515. std::string mSpatialSessionURI;
  516. std::string mSpatialSessionCredentials;
  517. std::string mMainSessionGroupHandle; // handle of the "main" session group.
  518. std::string mChannelName; // Name of the channel to be looked up 
  519. bool mAreaVoiceDisabled;
  520. sessionState *mAudioSession; // Session state for the current audio session
  521. bool mAudioSessionChanged; // set to true when the above pointer gets changed, so observers can be notified.
  522. sessionState *mNextAudioSession; // Session state for the audio session we're trying to join
  523. // std::string mSessionURI; // URI of the session we're in.
  524. // std::string mSessionHandle; // returned by ?
  525. S32 mCurrentParcelLocalID; // Used to detect parcel boundary crossings
  526. std::string mCurrentRegionName; // Used to detect parcel boundary crossings
  527. std::string mConnectorHandle; // returned by "Create Connector" message
  528. std::string mAccountHandle; // returned by login message
  529. int  mNumberOfAliases;
  530. U32 mCommandCookie;
  531. std::string mVoiceAccountServerURI;
  532. std::string mVoiceSIPURIHostName;
  533. int mLoginRetryCount;
  534. sessionMap mSessionsByHandle; // Active sessions, indexed by session handle.  Sessions which are being initiated may not be in this map.
  535. sessionSet mSessions; // All sessions, not indexed.  This is the canonical session list.
  536. bool mBuddyListMapPopulated;
  537. bool mBlockRulesListReceived;
  538. bool mAutoAcceptRulesListReceived;
  539. buddyListMap mBuddyListMap;
  540. deviceList mCaptureDevices;
  541. deviceList mRenderDevices;
  542. std::string mCaptureDevice;
  543. std::string mRenderDevice;
  544. bool mCaptureDeviceDirty;
  545. bool mRenderDeviceDirty;
  546. // This should be called when the code detects we have changed parcels.
  547. // It initiates the call to the server that gets the parcel channel.
  548. void parcelChanged();
  549. void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
  550. void joinSession(sessionState *session);
  551. static  std::string nameFromAvatar(LLVOAvatar *avatar);
  552. static std::string nameFromID(const LLUUID &id);
  553. static bool IDFromName(const std::string name, LLUUID &uuid);
  554. static std::string displayNameFromAvatar(LLVOAvatar *avatar);
  555. std::string sipURIFromAvatar(LLVOAvatar *avatar);
  556. std::string sipURIFromName(std::string &name);
  557. // Returns the name portion of the SIP URI if the string looks vaguely like a SIP URI, or an empty string if not.
  558. static std::string nameFromsipURI(const std::string &uri);
  559. bool inSpatialChannel(void);
  560. std::string getAudioSessionURI();
  561. std::string getAudioSessionHandle();
  562. void sendPositionalUpdate(void);
  563. void buildSetCaptureDevice(std::ostringstream &stream);
  564. void buildSetRenderDevice(std::ostringstream &stream);
  565. void buildLocalAudioUpdates(std::ostringstream &stream);
  566. void clearAllLists();
  567. void checkFriend(const LLUUID& id);
  568. void sendFriendsListUpdates();
  569. // start a text IM session with the specified user
  570. // This will be asynchronous, the session may be established at a future time.
  571. sessionState* startUserIMSession(const LLUUID& uuid);
  572. void sendQueuedTextMessages(sessionState *session);
  573. void enforceTether(void);
  574. bool mSpatialCoordsDirty;
  575. LLVector3d mCameraPosition;
  576. LLVector3d mCameraRequestedPosition;
  577. LLVector3 mCameraVelocity;
  578. LLMatrix3 mCameraRot;
  579. LLVector3d mAvatarPosition;
  580. LLVector3 mAvatarVelocity;
  581. LLMatrix3 mAvatarRot;
  582. bool mPTTDirty;
  583. bool mPTT;
  584. bool mUsePTT;
  585. bool mPTTIsMiddleMouse;
  586. KEY mPTTKey;
  587. bool mPTTIsToggle;
  588. bool mUserPTTState;
  589. bool mMuteMic;
  590. // Set to true when the friends list is known to have changed.
  591. bool mFriendsListDirty;
  592. enum
  593. {
  594. earLocCamera = 0, // ear at camera
  595. earLocAvatar, // ear at avatar
  596. earLocMixed // ear at avatar location/camera direction
  597. };
  598. S32 mEarLocation;  
  599. bool mSpeakerVolumeDirty;
  600. bool mSpeakerMuteDirty;
  601. int mSpeakerVolume;
  602. int mMicVolume;
  603. bool mMicVolumeDirty;
  604. bool mVoiceEnabled;
  605. bool mWriteInProgress;
  606. std::string mWriteString;
  607. LLTimer mUpdateTimer;
  608. BOOL mLipSyncEnabled;
  609. std::string mAPIVersion;
  610. typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
  611. observer_set_t mParticipantObservers;
  612. void notifyParticipantObservers();
  613. typedef std::set<LLVoiceClientStatusObserver*> status_observer_set_t;
  614. status_observer_set_t mStatusObservers;
  615. void notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status);
  616. typedef std::set<LLFriendObserver*> friend_observer_set_t;
  617. friend_observer_set_t mFriendObservers;
  618. void notifyFriendObservers();
  619. };
  620. extern LLVoiceClient *gVoiceClient;
  621. #endif //LL_VOICE_CLIENT_H