Merge remote-tracking branch 'origin/release/webrtc-voice' into release/2024.06-atlasaurus
# Conflicts: # indra/newview/llpanelpeople.cppmaster
commit
5f26ba8014
|
|
@ -2793,11 +2793,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>baabb11f324be350253b1fb58cf262c1aa19fa70</string>
|
||||
<string>194b4f5957c9f003c46e61a434e23a7c3d1180d6</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.67-debug/webrtc-m114.5735.08.67-debug.10190042668-darwin64-10190042668.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.70-debug/webrtc-m114.5735.08.70-debug.10377605436-darwin64-10377605436.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -2807,11 +2807,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>a13776c8f99f8975665be66ff8b51a80ba46c718</string>
|
||||
<string>38e0c7d30b4c40eb04e60ab199440b847cc7c6cf</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.67-debug/webrtc-m114.5735.08.67-debug.10190042668-linux64-10190042668.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.70-debug/webrtc-m114.5735.08.70-debug.10377605436-linux64-10377605436.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -2821,11 +2821,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>965ef5d65a14191a52ee9ec6a9a8a1d2ce3f2ffb</string>
|
||||
<string>053fb5c873df9192e34cddcf2db1c5fdcff76ba1</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.67-debug/webrtc-m114.5735.08.67-debug.10190042668-windows64-10190042668.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.70-debug/webrtc-m114.5735.08.70-debug.10377605436-windows64-10377605436.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
@ -2838,7 +2838,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>copyright</key>
|
||||
<string>Copyright (c) 2011, The WebRTC project authors. All rights reserved.</string>
|
||||
<key>version</key>
|
||||
<string>m114.5735.08.67-debug.10190042668</string>
|
||||
<string>m114.5735.08.70-debug.10377605436</string>
|
||||
<key>name</key>
|
||||
<string>webrtc</string>
|
||||
<key>vcs_branch</key>
|
||||
|
|
|
|||
|
|
@ -98,10 +98,7 @@ LLConversationViewSession::~LLConversationViewSession()
|
|||
|
||||
if (mVoiceClientObserver)
|
||||
{
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
|
||||
}
|
||||
LLVoiceClient::removeObserver(mVoiceClientObserver);
|
||||
delete mVoiceClientObserver;
|
||||
}
|
||||
|
||||
|
|
@ -259,16 +256,15 @@ bool LLConversationViewSession::postBuild()
|
|||
icon->setVisible(true);
|
||||
mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true);
|
||||
mIsInActiveVoiceChannel = true;
|
||||
if(LLVoiceClient::instanceExists())
|
||||
|
||||
if (mVoiceClientObserver)
|
||||
{
|
||||
if (mVoiceClientObserver)
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
|
||||
delete mVoiceClientObserver;
|
||||
}
|
||||
mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
|
||||
LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver);
|
||||
LLVoiceClient::removeObserver(mVoiceClientObserver);
|
||||
delete mVoiceClientObserver;
|
||||
}
|
||||
mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
|
||||
LLVoiceClient::addObserver(mVoiceClientObserver);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -775,7 +775,7 @@ bool LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
|
|||
}
|
||||
}
|
||||
|
||||
if (volume->mDrawable.isNull())
|
||||
if (volume->mDrawable.isNull() || volume->mDrawable->isDead())
|
||||
{
|
||||
return true; // No update to complete
|
||||
}
|
||||
|
|
|
|||
|
|
@ -287,10 +287,8 @@ void LLFloaterIMSession::sendMsg(const std::string& msg)
|
|||
LLFloaterIMSession::~LLFloaterIMSession()
|
||||
{
|
||||
mVoiceChannelStateChangeConnection.disconnect();
|
||||
if(LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
|
||||
LLVoiceClient::removeObserver(this);
|
||||
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
|
||||
|
||||
|
|
@ -366,7 +364,7 @@ bool LLFloaterIMSession::postBuild()
|
|||
|
||||
childSetAction("voice_call_btn", boost::bind(&LLFloaterIMSession::onCallButtonClicked, this));
|
||||
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
|
||||
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
|
||||
//see LLFloaterIMPanel for how it is done (IB)
|
||||
|
|
@ -537,6 +535,7 @@ void LLFloaterIMSession::boundVoiceChannel()
|
|||
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
|
||||
if(voice_channel)
|
||||
{
|
||||
mVoiceChannelStateChangeConnection.disconnect();
|
||||
mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(
|
||||
boost::bind(&LLFloaterIMSession::onVoiceChannelStateChanged, this, _1, _2));
|
||||
|
||||
|
|
|
|||
|
|
@ -546,6 +546,12 @@ void LLFloaterIMSessionTab::closeFloater(bool app_quitting)
|
|||
super::closeFloater(app_quitting);
|
||||
}
|
||||
|
||||
void LLFloaterIMSessionTab::deleteAllChildren()
|
||||
{
|
||||
super::deleteAllChildren();
|
||||
mVoiceButton = NULL;
|
||||
}
|
||||
|
||||
std::string LLFloaterIMSessionTab::appendTime()
|
||||
{
|
||||
std::string timeStr = "[" + LLTrans::getString("TimeHour") + "]:"
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ public:
|
|||
/*virtual*/ void setVisible(bool visible);
|
||||
/*virtual*/ void setFocus(bool focus);
|
||||
/*virtual*/ void closeFloater(bool app_quitting = false);
|
||||
/*virtual*/ void deleteAllChildren();
|
||||
|
||||
// Handle the left hand participant list widgets
|
||||
void addConversationViewParticipant(LLConversationItem* item, bool update_view = true);
|
||||
|
|
|
|||
|
|
@ -3859,6 +3859,11 @@ bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection dir
|
|||
{
|
||||
voice_channel->setChannelInfo(voice_channel_info);
|
||||
}
|
||||
else if (voice_channel->getState() < LLVoiceChannel::STATE_READY)
|
||||
{
|
||||
// restart if there wa an error or it was hang up
|
||||
voice_channel->resetChannelInfo();
|
||||
}
|
||||
voice_channel->setCallDirection(direction);
|
||||
voice_channel->activate();
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -98,10 +98,7 @@ LLPanelGroup::LLPanelGroup()
|
|||
LLPanelGroup::~LLPanelGroup()
|
||||
{
|
||||
LLGroupMgr::getInstance()->removeObserver(this);
|
||||
if(LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
LLVoiceClient::removeObserver(this);
|
||||
}
|
||||
|
||||
void LLPanelGroup::onOpen(const LLSD& key)
|
||||
|
|
@ -194,7 +191,7 @@ bool LLPanelGroup::postBuild()
|
|||
mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text");
|
||||
}
|
||||
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ public:
|
|||
LLAvatarTracker::instance().addObserver(this);
|
||||
|
||||
// For notification when SIP online status changes.
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
mInvObserver = new LLInventoryFriendCardObserver(this);
|
||||
}
|
||||
|
||||
|
|
@ -346,10 +346,7 @@ public:
|
|||
{
|
||||
// will be deleted by ~LLInventoryModel
|
||||
//delete mInvObserver;
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
LLVoiceClient::removeObserver(this);
|
||||
LLAvatarTracker::instance().removeObserver(this);
|
||||
}
|
||||
|
||||
|
|
@ -577,15 +574,13 @@ LLPanelPeople::~LLPanelPeople()
|
|||
delete mFriendListUpdater;
|
||||
delete mRecentListUpdater;
|
||||
|
||||
LLVoiceClient::removeObserver(this);
|
||||
|
||||
mNearbyFilterCommitConnection.disconnect();
|
||||
mFriedsFilterCommitConnection.disconnect();
|
||||
mGroupsFilterCommitConnection.disconnect();
|
||||
mRecentFilterCommitConnection.disconnect();
|
||||
|
||||
if(LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)
|
||||
|
|
@ -726,7 +721,7 @@ bool LLPanelPeople::postBuild()
|
|||
// Must go after setting commit callback and initializing all pointers to children.
|
||||
mTabContainer->selectTabByName(NEARBY_TAB_NAME);
|
||||
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
|
||||
// call this method in case some list is empty and buttons can be in inconsistent state
|
||||
updateButtons();
|
||||
|
|
|
|||
|
|
@ -703,10 +703,7 @@ LLPanelProfileSecondLife::~LLPanelProfileSecondLife()
|
|||
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
|
||||
}
|
||||
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
|
||||
}
|
||||
LLVoiceClient::removeObserver((LLVoiceClientStatusObserver*)this);
|
||||
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ void SpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker
|
|||
SpeakingIndicatorManager::SpeakingIndicatorManager()
|
||||
{
|
||||
LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&SpeakingIndicatorManager::sOnCurrentChannelChanged, this, _1));
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
}
|
||||
|
||||
SpeakingIndicatorManager::~SpeakingIndicatorManager()
|
||||
|
|
@ -193,10 +193,7 @@ void SpeakingIndicatorManager::cleanupSingleton()
|
|||
{
|
||||
// Don't use LLVoiceClient::getInstance() here without a check,
|
||||
// singleton MAY have already been destroyed.
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
LLVoiceClient::removeObserver(this);
|
||||
}
|
||||
|
||||
void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
|
||||
|
|
|
|||
|
|
@ -1753,9 +1753,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
|
|||
bool javascript_enabled = gSavedSettings.getBOOL("BrowserJavascriptEnabled");
|
||||
media_source->setJavascriptEnabled(javascript_enabled || clean_browser);
|
||||
|
||||
// collect 'web security disabled' (see Chrome --web-security-disabled) setting from prefs and send to embedded browser
|
||||
bool web_security_disabled = gSavedSettings.getBOOL("BrowserWebSecurityDisabled");
|
||||
media_source->setWebSecurityDisabled(web_security_disabled || clean_browser);
|
||||
media_source->setWebSecurityDisabled(clean_browser);
|
||||
|
||||
// collect setting indicates if local file access from file URLs is allowed from prefs and send to embedded browser
|
||||
bool file_access_from_file_urls = gSavedSettings.getBOOL("BrowserFileAccessFromFileUrls");
|
||||
|
|
|
|||
|
|
@ -805,7 +805,7 @@ S32 LLViewerTexture::getTotalNumFaces() const
|
|||
S32 LLViewerTexture::getNumFaces(U32 ch) const
|
||||
{
|
||||
llassert(ch < LLRender::NUM_TEXTURE_CHANNELS);
|
||||
return mNumFaces[ch];
|
||||
return ch < LLRender::NUM_TEXTURE_CHANNELS ? mNumFaces[ch] : 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -81,10 +81,7 @@ LLVoiceChannel::~LLVoiceChannel()
|
|||
{
|
||||
sCurrentVoiceChannel = NULL;
|
||||
// Must check instance exists here, the singleton MAY have already been destroyed.
|
||||
if(LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
LLVoiceClient::removeObserver(this);
|
||||
}
|
||||
|
||||
sVoiceChannelMap.erase(mSessionID);
|
||||
|
|
@ -118,6 +115,12 @@ void LLVoiceChannel::setChannelInfo(const LLSD &channelInfo)
|
|||
}
|
||||
}
|
||||
|
||||
void LLVoiceChannel::resetChannelInfo()
|
||||
{
|
||||
mChannelInfo = LLSD();
|
||||
mState = STATE_NO_CHANNEL_INFO;
|
||||
}
|
||||
|
||||
void LLVoiceChannel::onChange(EStatusType type, const LLSD& channelInfo, bool proximal)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Incoming channel info: " << channelInfo << LL_ENDL;
|
||||
|
|
@ -219,7 +222,7 @@ void LLVoiceChannel::deactivate()
|
|||
LLVoiceClient::getInstance()->setUserPTTState(false);
|
||||
}
|
||||
}
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
LLVoiceClient::removeObserver(this);
|
||||
|
||||
if (sCurrentVoiceChannel == this)
|
||||
{
|
||||
|
|
@ -259,7 +262,7 @@ void LLVoiceChannel::activate()
|
|||
setState(STATE_CALL_STARTED);
|
||||
}
|
||||
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
LLVoiceClient::addObserver(this);
|
||||
|
||||
//do not send earlier, channel should be initialized, should not be in STATE_NO_CHANNEL_INFO state
|
||||
sCurrentVoiceChannelChangedSignal(this->mSessionID);
|
||||
|
|
@ -751,7 +754,7 @@ void LLVoiceChannelProximal::deactivate()
|
|||
{
|
||||
setState(STATE_HUNG_UP);
|
||||
}
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
LLVoiceClient::removeObserver(this);
|
||||
LLVoiceClient::getInstance()->activateSpatialChannel(false);
|
||||
}
|
||||
|
||||
|
|
@ -918,6 +921,12 @@ void LLVoiceChannelP2P::setChannelInfo(const LLSD& channel_info)
|
|||
}
|
||||
}
|
||||
|
||||
void LLVoiceChannelP2P::resetChannelInfo()
|
||||
{
|
||||
mChannelInfo = LLVoiceClient::getInstance()->getP2PChannelInfoTemplate(mOtherUserID);
|
||||
mState = STATE_NO_CHANNEL_INFO; // we have template, not full info
|
||||
}
|
||||
|
||||
void LLVoiceChannelP2P::setState(EState state)
|
||||
{
|
||||
LL_INFOS("Voice") << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -72,7 +72,8 @@ public:
|
|||
virtual void handleError(EStatusType status);
|
||||
virtual void deactivate();
|
||||
virtual void activate();
|
||||
virtual void setChannelInfo(const LLSD &channelInfo);
|
||||
virtual void setChannelInfo(const LLSD& channelInfo);
|
||||
virtual void resetChannelInfo();
|
||||
virtual void requestChannelInfo();
|
||||
virtual bool isActive() const;
|
||||
virtual bool callStarted() const;
|
||||
|
|
@ -189,6 +190,7 @@ class LLVoiceChannelP2P : public LLVoiceChannelGroup
|
|||
void requestChannelInfo() override;
|
||||
void deactivate() override;
|
||||
void setChannelInfo(const LLSD& channel_info) override;
|
||||
void resetChannelInfo() override;
|
||||
|
||||
protected:
|
||||
void setState(EState state) override;
|
||||
|
|
|
|||
|
|
@ -796,8 +796,14 @@ void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer)
|
|||
|
||||
void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
if (LLVivoxVoiceClient::instanceExists())
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
if (LLWebRTCVoiceClient::instanceExists())
|
||||
{
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVoiceClient::addObserver(LLFriendObserver* observer)
|
||||
|
|
@ -808,8 +814,14 @@ void LLVoiceClient::addObserver(LLFriendObserver* observer)
|
|||
|
||||
void LLVoiceClient::removeObserver(LLFriendObserver* observer)
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
if (LLVivoxVoiceClient::instanceExists())
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
if (LLWebRTCVoiceClient::instanceExists())
|
||||
{
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
|
||||
|
|
@ -820,8 +832,14 @@ void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
|
|||
|
||||
void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
if (LLVivoxVoiceClient::instanceExists())
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
if (LLWebRTCVoiceClient::instanceExists())
|
||||
{
|
||||
LLWebRTCVoiceClient::getInstance()->removeObserver(observer);
|
||||
}
|
||||
}
|
||||
|
||||
std::string LLVoiceClient::sipURIFromID(const LLUUID &id) const
|
||||
|
|
|
|||
|
|
@ -482,12 +482,12 @@ public:
|
|||
|
||||
void onRegionChanged();
|
||||
|
||||
void addObserver(LLVoiceClientStatusObserver* observer);
|
||||
void removeObserver(LLVoiceClientStatusObserver* observer);
|
||||
void addObserver(LLFriendObserver* observer);
|
||||
void removeObserver(LLFriendObserver* observer);
|
||||
void addObserver(LLVoiceClientParticipantObserver* observer);
|
||||
void removeObserver(LLVoiceClientParticipantObserver* observer);
|
||||
static void addObserver(LLVoiceClientStatusObserver* observer);
|
||||
static void removeObserver(LLVoiceClientStatusObserver* observer);
|
||||
static void addObserver(LLFriendObserver* observer);
|
||||
static void removeObserver(LLFriendObserver* observer);
|
||||
static void addObserver(LLVoiceClientParticipantObserver* observer);
|
||||
static void removeObserver(LLVoiceClientParticipantObserver* observer);
|
||||
|
||||
std::string sipURIFromID(const LLUUID &id) const;
|
||||
LLSD getP2PChannelInfoTemplate(const LLUUID& id) const;
|
||||
|
|
|
|||
|
|
@ -236,12 +236,27 @@ LLWebRTCVoiceClient::LLWebRTCVoiceClient() :
|
|||
//---------------------------------------------------
|
||||
|
||||
LLWebRTCVoiceClient::~LLWebRTCVoiceClient()
|
||||
{
|
||||
}
|
||||
|
||||
void LLWebRTCVoiceClient::cleanupSingleton()
|
||||
{
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
|
||||
sShuttingDown = true;
|
||||
if (mSession)
|
||||
{
|
||||
mSession->shutdownAllConnections();
|
||||
}
|
||||
if (mNextSession)
|
||||
{
|
||||
mNextSession->shutdownAllConnections();
|
||||
}
|
||||
cleanUp();
|
||||
sessionState::clearSessions();
|
||||
}
|
||||
|
||||
//---------------------------------------------------
|
||||
|
|
@ -655,6 +670,10 @@ void LLWebRTCVoiceClient::OnDevicesChanged(const llwebrtc::LLWebRTCVoiceDeviceLi
|
|||
void LLWebRTCVoiceClient::OnDevicesChangedImpl(const llwebrtc::LLWebRTCVoiceDeviceList &render_devices,
|
||||
const llwebrtc::LLWebRTCVoiceDeviceList &capture_devices)
|
||||
{
|
||||
if (sShuttingDown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||
std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
|
||||
std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
|
||||
|
|
@ -1706,7 +1725,7 @@ void LLWebRTCVoiceClient::predSetUserMute(const LLWebRTCVoiceClient::sessionStat
|
|||
//------------------------------------------------------------------------
|
||||
// Sessions
|
||||
|
||||
std::map<std::string, LLWebRTCVoiceClient::sessionState::ptr_t> LLWebRTCVoiceClient::sessionState::mSessions;
|
||||
std::map<std::string, LLWebRTCVoiceClient::sessionState::ptr_t> LLWebRTCVoiceClient::sessionState::sSessions;
|
||||
|
||||
|
||||
LLWebRTCVoiceClient::sessionState::sessionState() :
|
||||
|
|
@ -1793,13 +1812,19 @@ void LLWebRTCVoiceClient::sessionState::addSession(
|
|||
const std::string & channelID,
|
||||
LLWebRTCVoiceClient::sessionState::ptr_t& session)
|
||||
{
|
||||
mSessions[channelID] = session;
|
||||
sSessions[channelID] = session;
|
||||
}
|
||||
|
||||
LLWebRTCVoiceClient::sessionState::~sessionState()
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Destroying session CHANNEL=" << mChannelID << LL_ENDL;
|
||||
|
||||
if (!mShuttingDown)
|
||||
{
|
||||
shutdownAllConnections();
|
||||
}
|
||||
mWebRTCConnections.clear();
|
||||
|
||||
removeAllParticipants();
|
||||
}
|
||||
|
||||
|
|
@ -1809,8 +1834,8 @@ LLWebRTCVoiceClient::sessionState::ptr_t LLWebRTCVoiceClient::sessionState::matc
|
|||
sessionStatePtr_t result;
|
||||
|
||||
// *TODO: My kingdom for a lambda!
|
||||
std::map<std::string, ptr_t>::iterator it = mSessions.find(channel_id);
|
||||
if (it != mSessions.end())
|
||||
std::map<std::string, ptr_t>::iterator it = sSessions.find(channel_id);
|
||||
if (it != sSessions.end())
|
||||
{
|
||||
result = (*it).second;
|
||||
}
|
||||
|
|
@ -1819,17 +1844,17 @@ LLWebRTCVoiceClient::sessionState::ptr_t LLWebRTCVoiceClient::sessionState::matc
|
|||
|
||||
void LLWebRTCVoiceClient::sessionState::for_each(sessionFunc_t func)
|
||||
{
|
||||
std::for_each(mSessions.begin(), mSessions.end(), boost::bind(for_eachPredicate, _1, func));
|
||||
std::for_each(sSessions.begin(), sSessions.end(), boost::bind(for_eachPredicate, _1, func));
|
||||
}
|
||||
|
||||
void LLWebRTCVoiceClient::sessionState::reapEmptySessions()
|
||||
{
|
||||
std::map<std::string, ptr_t>::iterator iter;
|
||||
for (iter = mSessions.begin(); iter != mSessions.end();)
|
||||
for (iter = sSessions.begin(); iter != sSessions.end();)
|
||||
{
|
||||
if (iter->second->isEmpty())
|
||||
{
|
||||
iter = mSessions.erase(iter);
|
||||
iter = sSessions.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1875,6 +1900,11 @@ LLWebRTCVoiceClient::sessionStatePtr_t LLWebRTCVoiceClient::addSession(const std
|
|||
}
|
||||
}
|
||||
|
||||
void LLWebRTCVoiceClient::sessionState::clearSessions()
|
||||
{
|
||||
sSessions.clear();
|
||||
}
|
||||
|
||||
LLWebRTCVoiceClient::sessionStatePtr_t LLWebRTCVoiceClient::findP2PSession(const LLUUID &agent_id)
|
||||
{
|
||||
sessionStatePtr_t result = sessionState::matchSessionByChannelID(agent_id.asString());
|
||||
|
|
@ -1914,14 +1944,14 @@ void LLWebRTCVoiceClient::sessionState::processSessionStates()
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||
|
||||
auto iter = mSessions.begin();
|
||||
while (iter != mSessions.end())
|
||||
auto iter = sSessions.begin();
|
||||
while (iter != sSessions.end())
|
||||
{
|
||||
if (!iter->second->processConnectionStates() && iter->second->mShuttingDown)
|
||||
{
|
||||
// if the connections associated with a session are gone,
|
||||
// and this session is shutting down, remove it.
|
||||
iter = mSessions.erase(iter);
|
||||
iter = sSessions.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2122,8 +2152,10 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s
|
|||
mOutstandingRequests(0),
|
||||
mChannelID(channelID),
|
||||
mRegionID(regionID),
|
||||
mPrimary(true),
|
||||
mRetryWaitPeriod(0)
|
||||
{
|
||||
|
||||
// retries wait a short period...randomize it so
|
||||
// all clients don't try to reconnect at once.
|
||||
mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5;
|
||||
|
|
@ -2369,6 +2401,12 @@ void LLVoiceWebRTCConnection::OnPeerConnectionClosed()
|
|||
setVoiceConnectionState(VOICE_STATE_CLOSED);
|
||||
mOutstandingRequests--;
|
||||
}
|
||||
else if (LLWebRTCVoiceClient::isShuttingDown())
|
||||
{
|
||||
// disconnect was initialized by llwebrtc::terminate() instead of connectionStateMachine
|
||||
LL_INFOS("Voice") << "Peer connection has closed, but state is " << mVoiceConnectionState << LL_ENDL;
|
||||
setVoiceConnectionState(VOICE_STATE_CLOSED);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -2475,7 +2513,11 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio
|
|||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts);
|
||||
|
||||
connection->mOutstandingRequests--;
|
||||
connection->setVoiceConnectionState(VOICE_STATE_SESSION_EXIT);
|
||||
|
||||
if (connection->getVoiceConnectionState() == VOICE_STATE_WAIT_FOR_EXIT)
|
||||
{
|
||||
connection->setVoiceConnectionState(VOICE_STATE_SESSION_EXIT);
|
||||
}
|
||||
}
|
||||
|
||||
// Tell the simulator to tell the Secondlife WebRTC server that we want a voice
|
||||
|
|
@ -2709,6 +2751,17 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
|||
{
|
||||
mRetryWaitPeriod = 0;
|
||||
mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5;
|
||||
LLUUID agentRegionID;
|
||||
if (isSpatial() && gAgent.getRegion())
|
||||
{
|
||||
|
||||
bool primary = (mRegionID == gAgent.getRegion()->getRegionID());
|
||||
if (primary != mPrimary)
|
||||
{
|
||||
mPrimary = primary;
|
||||
sendJoin();
|
||||
}
|
||||
}
|
||||
|
||||
// we'll stay here as long as the session remains up.
|
||||
if (mShutDown)
|
||||
|
|
@ -2737,9 +2790,18 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
|||
break;
|
||||
|
||||
case VOICE_STATE_DISCONNECT:
|
||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_EXIT);
|
||||
LLCoros::instance().launch("LLVoiceWebRTCConnection::breakVoiceConnectionCoro",
|
||||
boost::bind(&LLVoiceWebRTCConnection::breakVoiceConnectionCoro, this->shared_from_this()));
|
||||
if (!LLWebRTCVoiceClient::isShuttingDown())
|
||||
{
|
||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_EXIT);
|
||||
LLCoros::instance().launch("LLVoiceWebRTCConnection::breakVoiceConnectionCoro",
|
||||
boost::bind(&LLVoiceWebRTCConnection::breakVoiceConnectionCoro, this->shared_from_this()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// llwebrtc::terminate() is already shuting down the connection.
|
||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_CLOSE);
|
||||
mOutstandingRequests++;
|
||||
}
|
||||
break;
|
||||
|
||||
case VOICE_STATE_WAIT_FOR_EXIT:
|
||||
|
|
@ -2749,7 +2811,11 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
|||
{
|
||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_CLOSE);
|
||||
mOutstandingRequests++;
|
||||
mWebRTCPeerConnectionInterface->shutdownConnection();
|
||||
if (!LLWebRTCVoiceClient::isShuttingDown())
|
||||
{
|
||||
mWebRTCPeerConnectionInterface->shutdownConnection();
|
||||
}
|
||||
// else was already posted by llwebrtc::terminate().
|
||||
break;
|
||||
case VOICE_STATE_WAIT_FOR_CLOSE:
|
||||
break;
|
||||
|
|
@ -2979,7 +3045,7 @@ void LLVoiceWebRTCConnection::sendJoin()
|
|||
boost::json::object root;
|
||||
boost::json::object join_obj;
|
||||
LLUUID regionID = gAgent.getRegion()->getRegionID();
|
||||
if ((regionID == mRegionID) || !isSpatial())
|
||||
if (mPrimary)
|
||||
{
|
||||
join_obj["p"] = true;
|
||||
}
|
||||
|
|
@ -2997,6 +3063,10 @@ LLVoiceWebRTCSpatialConnection::LLVoiceWebRTCSpatialConnection(const LLUUID ®
|
|||
LLVoiceWebRTCConnection(regionID, channelID),
|
||||
mParcelLocalID(parcelLocalID)
|
||||
{
|
||||
if (gAgent.getRegion())
|
||||
{
|
||||
mPrimary = (regionID == gAgent.getRegion()->getRegionID());
|
||||
}
|
||||
}
|
||||
|
||||
LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection()
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ class LLWebRTCVoiceClient : public LLSingleton<LLWebRTCVoiceClient>,
|
|||
virtual ~LLWebRTCVoiceClient();
|
||||
|
||||
public:
|
||||
void cleanupSingleton() override;
|
||||
/// @name LLVoiceModuleInterface virtual implementations
|
||||
/// @see LLVoiceModuleInterface
|
||||
//@{
|
||||
|
|
@ -300,6 +301,7 @@ public:
|
|||
static void for_each(sessionFunc_t func);
|
||||
|
||||
static void reapEmptySessions();
|
||||
static void clearSessions();
|
||||
|
||||
bool isEmpty() { return mWebRTCConnections.empty(); }
|
||||
|
||||
|
|
@ -319,7 +321,7 @@ public:
|
|||
participantUUIDMap mParticipantsByUUID;
|
||||
|
||||
static bool hasSession(const std::string &sessionID)
|
||||
{ return mSessions.find(sessionID) != mSessions.end(); }
|
||||
{ return sSessions.find(sessionID) != sSessions.end(); }
|
||||
|
||||
bool mHangupOnLastLeave; // notify observers after the session becomes empty.
|
||||
bool mNotifyOnFirstJoin; // notify observers when the first peer joins.
|
||||
|
|
@ -330,7 +332,7 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
static std::map<std::string, ptr_t> mSessions; // canonical list of outstanding sessions.
|
||||
static std::map<std::string, ptr_t> sSessions; // canonical list of outstanding sessions.
|
||||
|
||||
static void for_eachPredicate(const std::pair<std::string,
|
||||
LLWebRTCVoiceClient::sessionState::wptr_t> &a,
|
||||
|
|
@ -620,7 +622,7 @@ class LLVoiceWebRTCConnection :
|
|||
|
||||
bool connectionStateMachine();
|
||||
|
||||
virtual bool isSpatial() = 0;
|
||||
virtual bool isSpatial() { return false; }
|
||||
|
||||
LLUUID getRegionID() { return mRegionID; }
|
||||
|
||||
|
|
@ -684,6 +686,7 @@ class LLVoiceWebRTCConnection :
|
|||
LLVoiceClientStatusObserver::EStatusType mCurrentStatus;
|
||||
|
||||
LLUUID mRegionID;
|
||||
bool mPrimary;
|
||||
LLUUID mViewerSession;
|
||||
std::string mChannelID;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue