!I integrate from //ce/main...
[CRYENGINE.git] / Code / CryPlugins / CryLobby / Module / CryVoice.cpp
blob40f78e6eff7a02d5b15f5b0240a63f7efc8c27f8
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
4 #include "CryVoice.h"
6 #if USE_CRY_VOICE
8 CCryVoice::CCryVoice(CCryLobby* pLobby, CCryLobbyService* pService)
10 assert(pLobby);
11 assert(pService);
13 m_pLobby = pLobby;
14 m_pService = pService;
16 for (uint32 i = 0; i < MAX_REMOTE_TALKERS; i++)
18 m_pRemoteUsers[i] = NULL;
21 for (uint32 i = 0; i < MAX_LOCAL_TALKERS; i++)
23 m_localUserFlags[i] = LUF_IS_MUTED; // Initialize with muted mic so the user doesn't accidentally sends voice data unwanted
25 for (uint32 j = 0; j < MAX_REMOTE_TALKERS; j++)
27 m_pUserRelationship[i][j] = NULL;
32 ECryLobbyError CCryVoice::Initialise()
34 m_notificationTimer = CTimeValue(0.0f);
36 for (uint32 i = 0; i < m_numRemoteTalkers; i++)
38 assert(m_pRemoteUsers[i]);
39 m_pRemoteUsers[i]->m_remoteUserFlags = 0;
40 m_pRemoteUsers[i]->m_userID = NULL;
43 return eCLE_Success;
46 CryVoiceRemoteUserID CCryVoice::RegisterRemoteUser(CryLobbyConnectionID connectionID, CryUserID remoteUserID)
48 CryVoiceRemoteUserID id = GetRemoteUser(remoteUserID);
50 if (id == CryVoiceInvalidRemoteUserID)
52 for (uint32 i = 0; i < m_numRemoteTalkers; i++)
54 SRemoteUser* pRemoteUser = m_pRemoteUsers[i];
56 assert(pRemoteUser);
58 if (!(pRemoteUser->m_remoteUserFlags & UF_REGISTERED))
60 pRemoteUser->m_remoteUserFlags |= (UF_REGISTERED | UF_REQUEST_MICROPHONE_STATUS);
61 pRemoteUser->m_remoteUserFlags &= ~(UF_IS_SPEAKING | UF_IS_MICROPHONE_CONNECTED | UF_SEND_MICROPHONE_STATUS);
62 pRemoteUser->m_connectionID = connectionID;
63 pRemoteUser->m_userID = remoteUserID;
65 for (uint32 j = 0; j < m_numLocalTalkers; j++)
67 SUserRelationship* pRelationship = m_pUserRelationship[j][i];
69 assert(pRelationship);
71 pRelationship->m_relationshipFlags |= (RF_MUTED_GAME | RF_PLAYBACK_ON);
72 pRelationship->m_relationshipFlags &= ~RF_MUTED_EXTERNAL;
75 return i;
80 return id;
83 void CCryVoice::UnRegisterRemoteUser(CryVoiceRemoteUserID user)
85 assert(m_pRemoteUsers[user]);
87 m_pRemoteUsers[user]->m_remoteUserFlags &= ~UF_REGISTERED;
88 m_pRemoteUsers[user]->m_remoteUserFlags &= ~UF_SEND_MICROPHONE_STATUS;
89 m_pRemoteUsers[user]->m_remoteUserFlags &= ~UF_REQUEST_MICROPHONE_STATUS;
90 m_pRemoteUsers[user]->m_userID = NULL;
93 CryVoiceRemoteUserID CCryVoice::GetRemoteUser(CryUserID remoteUser)
95 for (uint32 i = 0; i < m_numRemoteTalkers; i++)
97 SRemoteUser* pRemoteUser = m_pRemoteUsers[i];
99 assert(pRemoteUser);
101 if ((pRemoteUser->m_remoteUserFlags & UF_REGISTERED) && pRemoteUser->m_userID.IsValid() && (pRemoteUser->m_userID == remoteUser))
103 return i;
107 return CryVoiceInvalidRemoteUserID;
110 void CCryVoice::Mute(uint32 localUser, CryUserID remoteUser, bool mute)
112 CryVoiceRemoteUserID remoteUserID = GetRemoteUser(remoteUser);
114 if (remoteUserID != CryVoiceInvalidRemoteUserID)
116 assert(m_pUserRelationship[localUser][remoteUserID]);
117 if (mute)
119 m_pUserRelationship[localUser][remoteUserID]->m_relationshipFlags |= RF_MUTED_GAME;
121 else
123 m_pUserRelationship[localUser][remoteUserID]->m_relationshipFlags &= ~RF_MUTED_GAME;
128 void CCryVoice::MuteLocalPlayer(uint32 localUser, bool mute)
130 if (mute)
132 m_localUserFlags[localUser] |= LUF_IS_MUTED;
134 else
136 m_localUserFlags[localUser] &= ~LUF_IS_MUTED;
140 bool CCryVoice::IsMuted(uint32 localUser, CryUserID remoteUser)
142 CryVoiceRemoteUserID remoteUserID = GetRemoteUser(remoteUser);
144 if (remoteUserID != CryVoiceInvalidRemoteUserID)
146 assert(m_pUserRelationship[localUser][remoteUserID]);
147 return ((m_pUserRelationship[localUser][remoteUserID]->m_relationshipFlags & RF_MUTED_GAME) == RF_MUTED_GAME);
150 return false;
153 void CCryVoice::MuteExternally(uint32 localUser, CryUserID remoteUser, bool mute)
155 //-- Does nothing
158 bool CCryVoice::IsMutedExternally(uint32 localUser, CryUserID remoteUser)
160 CryVoiceRemoteUserID remoteUserID = GetRemoteUser(remoteUser);
162 if (remoteUserID != CryVoiceInvalidRemoteUserID)
164 assert(m_pUserRelationship[localUser][remoteUserID]);
165 return ((m_pUserRelationship[localUser][remoteUserID]->m_relationshipFlags & RF_MUTED_EXTERNAL) == RF_MUTED_EXTERNAL);
168 return false;
171 bool CCryVoice::IsSpeaking(uint32 localUser, CryUserID remoteUser)
173 CryVoiceRemoteUserID remoteUserID = GetRemoteUser(remoteUser);
175 if (remoteUserID != CryVoiceInvalidRemoteUserID)
177 assert(m_pRemoteUsers[remoteUserID]);
178 assert(m_pUserRelationship[localUser][remoteUserID]);
180 return (((m_pRemoteUsers[remoteUserID]->m_remoteUserFlags & (UF_REGISTERED | UF_IS_SPEAKING)) == (UF_REGISTERED | UF_IS_SPEAKING)) && ((m_pUserRelationship[localUser][remoteUserID]->m_relationshipFlags & RF_PLAYBACK_ON) == RF_PLAYBACK_ON));
182 else
184 CryUserID localUserID = m_pService->GetUserID(localUser);
185 if (localUserID == remoteUser)
187 return IsSpeaking(localUser);
191 return false;
194 bool CCryVoice::IsMicrophoneConnected(CryUserID userID)
196 CryVoiceRemoteUserID remoteUserID = GetRemoteUser(userID);
198 if (remoteUserID != CryVoiceInvalidRemoteUserID)
200 assert(m_pRemoteUsers[remoteUserID]);
202 return ((m_pRemoteUsers[remoteUserID]->m_remoteUserFlags & UF_REGISTERED) && (m_pRemoteUsers[remoteUserID]->m_remoteUserFlags & UF_IS_MICROPHONE_CONNECTED));
205 return false;
208 void CCryVoice::Tick(CTimeValue tv)
210 if (tv.GetSeconds() - m_notificationTimer.GetSeconds() > CLobbyCVars::Get().minMicrophonNotificationInterval)
212 for (uint32 i = 0; i < m_numRemoteTalkers; i++)
214 SRemoteUser* pRemoteUser = m_pRemoteUsers[i];
215 assert(pRemoteUser);
217 if (pRemoteUser->m_remoteUserFlags & UF_REGISTERED)
219 if (pRemoteUser->m_remoteUserFlags & UF_SEND_MICROPHONE_STATUS)
221 SendMicrophoneNotification(i);
223 if (pRemoteUser->m_remoteUserFlags & UF_REQUEST_MICROPHONE_STATUS)
225 SendMicrophoneRequest(i);
230 m_notificationTimer = tv;
234 #endif // USE_CRY_VOICE