1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
8 CCryVoice::CCryVoice(CCryLobby
* pLobby
, CCryLobbyService
* pService
)
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
;
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
];
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
;
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
];
101 if ((pRemoteUser
->m_remoteUserFlags
& UF_REGISTERED
) && pRemoteUser
->m_userID
.IsValid() && (pRemoteUser
->m_userID
== remoteUser
))
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
]);
119 m_pUserRelationship
[localUser
][remoteUserID
]->m_relationshipFlags
|= RF_MUTED_GAME
;
123 m_pUserRelationship
[localUser
][remoteUserID
]->m_relationshipFlags
&= ~RF_MUTED_GAME
;
128 void CCryVoice::MuteLocalPlayer(uint32 localUser
, bool mute
)
132 m_localUserFlags
[localUser
] |= LUF_IS_MUTED
;
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
);
153 void CCryVoice::MuteExternally(uint32 localUser
, CryUserID remoteUser
, bool mute
)
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
);
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
));
184 CryUserID localUserID
= m_pService
->GetUserID(localUser
);
185 if (localUserID
== remoteUser
)
187 return IsSpeaking(localUser
);
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
));
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
];
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