diff options
| author | Roxie Linden <roxie@lindenlab.com> | 2023-12-18 11:45:15 -0800 | 
|---|---|---|
| committer | Roxie Linden <roxie@lindenlab.com> | 2024-02-08 18:34:02 -0800 | 
| commit | a7509747b20bb8c00a477e8bdacc41f0c657cfdf (patch) | |
| tree | ff48dc53730904044c8ad9768759d4086c512dc5 /indra/newview | |
| parent | a60593164e82057930d5e9da5173207700413197 (diff) | |
Touch up parcel voice enable/disable.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llvoicewebrtc.cpp | 437 | ||||
| -rw-r--r-- | indra/newview/llvoicewebrtc.h | 43 | 
2 files changed, 159 insertions, 321 deletions
| diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index ec1e6a353d..9a1b3525d7 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -455,17 +455,29 @@ void LLWebRTCVoiceClient::idle(void* user_data)  //   //  -void LLWebRTCVoiceClient::predProcessSessionStates(const LLWebRTCVoiceClient::sessionStatePtr_t& session) +void LLWebRTCVoiceClient::sessionState::processSessionStates()  { -    session->processSessionStates(); +    auto iter = mSessions.begin(); +    while (iter != mSessions.end()) +    { +        if (!iter->second->processConnectionStates()) +        { +            iter = mSessions.erase(iter); +        } +        else +        { +            iter++; +        } +    }  } -void LLWebRTCVoiceClient::sessionState::processSessionStates() +bool LLWebRTCVoiceClient::sessionState::processConnectionStates()  { -    std::map<std::string, connectionPtr_t>::iterator iter; -    for (iter = mWebRTCConnections.begin(); iter != mWebRTCConnections.end();) +    std::list<connectionPtr_t>::iterator iter = mWebRTCConnections.begin(); + +    while (iter != mWebRTCConnections.end())      { -        if (!iter->second->connectionStateMachine()) +        if (!iter->get()->connectionStateMachine())          {              iter = mWebRTCConnections.erase(iter);          } @@ -474,6 +486,7 @@ void LLWebRTCVoiceClient::sessionState::processSessionStates()              ++iter;          }      } +    return !mWebRTCConnections.empty();  }  void LLWebRTCVoiceClient::voiceConnectionCoro() @@ -488,33 +501,39 @@ void LLWebRTCVoiceClient::voiceConnectionCoro()              llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);              // add session for region or parcel voice.              LLViewerRegion *regionp = gAgent.getRegion(); -            if (!regionp) +            if (!regionp || regionp->getRegionID().isNull())              {                  continue;              } -            if (regionp->getRegionID().isNull()) -            { -                continue; -            } -            if (mVoiceEnabled && (!mAudioSession || mAudioSession->mIsSpatial)) + +            if (mVoiceEnabled && (!mAudioSession || mAudioSession->isSpatial()) && !mNextAudioSession)              {                  // check to see if parcel changed.                  std::string channelID = regionp->getRegionID().asString();                  LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();                  S32       parcel_local_id = INVALID_PARCEL_ID; -                if (parcel && parcel->getLocalID() != INVALID_PARCEL_ID && !parcel->getParcelFlagUseEstateVoiceChannel()) +                if (parcel && parcel->getLocalID() != INVALID_PARCEL_ID)                  { -                    parcel_local_id = parcel->getLocalID(); -                    channelID += "-" + std::to_string(parcel->getLocalID()); +                    if (!parcel->getParcelFlagAllowVoice()) +                    { +                        channelID.clear(); +                    } +                    else if (!parcel->getParcelFlagUseEstateVoiceChannel()) +                    { +                        parcel_local_id = parcel->getLocalID(); +                        channelID += "-" + std::to_string(parcel->getLocalID()); +                    }                  } -                if (!mAudioSession || channelID != mAudioSession->mChannelID) +                 +                if ((mNextAudioSession && channelID != mNextAudioSession->mChannelID) || +                    (!mAudioSession && !channelID.empty()) ||  +                    (mAudioSession && channelID != mAudioSession->mChannelID))                  {                      setSpatialChannel(channelID, "", parcel_local_id);                  }              } -            sessionState::for_each(boost::bind(predProcessSessionStates, _1)); -            reapEmptySessions(); +            sessionState::processSessionStates();              if (mVoiceEnabled)              {                  updatePosition(); @@ -829,7 +848,7 @@ void LLWebRTCVoiceClient::predUpdateOwnVolume(const LLWebRTCVoiceClient::session  void LLWebRTCVoiceClient::predSendData(const LLWebRTCVoiceClient::sessionStatePtr_t& session, const std::string& spatial_data, const std::string& volume_data)  { -    if (session->mIsSpatial && !spatial_data.empty()) +    if (session->isSpatial() && !spatial_data.empty())      {          session->sendData(spatial_data);      } @@ -843,7 +862,7 @@ void LLWebRTCVoiceClient::sessionState::sendData(const std::string &data)  {      for (auto& connection : mWebRTCConnections)      { -        connection.second->sendData(data); +        connection->sendData(data);      }  } @@ -852,7 +871,7 @@ void LLWebRTCVoiceClient::sessionState::setMuteMic(bool muted)      mMuted = muted;      for (auto& connection : mWebRTCConnections)      { -        connection.second->setMuteMic(muted); +        connection->setMuteMic(muted);      }  } @@ -861,7 +880,7 @@ void LLWebRTCVoiceClient::sessionState::setMicGain(F32 gain)      mMicGain = gain;      for (auto& connection : mWebRTCConnections)      { -        connection.second->setMicGain(gain); +        connection->setMicGain(gain);      }  } @@ -870,7 +889,7 @@ void LLWebRTCVoiceClient::sessionState::setSpeakerVolume(F32 volume)      mSpeakerVolume = volume;      for (auto& connection : mWebRTCConnections)      { -        connection.second->setSpeakerVolume(volume); +        connection->setSpeakerVolume(volume);      }  } @@ -878,52 +897,6 @@ void LLWebRTCVoiceClient::sendLocalAudioUpdates()  {  } - -void LLWebRTCVoiceClient::joinedAudioSession(const sessionStatePtr_t &session) -{ -	LL_DEBUGS("Voice") << "Joined Audio Session" << LL_ENDL; -	if(mAudioSession != session) -	{ -        sessionStatePtr_t oldSession = mAudioSession; - -		mAudioSession = session; -		mAudioSessionChanged = true; - -		// The old session may now need to be deleted. -		reapSession(oldSession); -	} -	 -	// This is the session we're joining. -	if(mIsJoiningSession) -	{ -        LLSD WebRTCevent(LLSDMap("channel", session->mChannelID) -                ("session", "joined")); - -        mWebRTCPump.post(WebRTCevent); -		 -		if(!session->mIsChannel) -		{ -			// this is a p2p session.  Make sure the other end is added as a participant. -            participantStatePtr_t participant(session->addParticipant(LLUUID(session->mChannelID))); -			if(participant) -			{ -				if(participant->mAvatarIDValid) -				{ -					lookupName(participant->mAvatarID); -				} -				else if(!session->mName.empty()) -				{ -					participant->mDisplayName = session->mName; -					avatarNameResolved(participant->mAvatarID, session->mName); -				} -				 -				// TODO: Question: Do we need to set up mAvatarID/mAvatarIDValid here? -				LL_INFOS("Voice") << "added caller as participant  (" << participant->mAvatarID << ")"<< LL_ENDL; -			} -		} -	} -} -  void LLWebRTCVoiceClient::reapSession(const sessionStatePtr_t &session)  {  	if(session) @@ -950,19 +923,6 @@ void LLWebRTCVoiceClient::reapSession(const sessionStatePtr_t &session)  } -void LLWebRTCVoiceClient::leftAudioSession(const sessionStatePtr_t &session) -{ -    if (mAudioSession == session) -    { -        LLSD WebRTCevent(LLSDMap("channel", session->mChannelID) -            ("session", "removed")); - -        mWebRTCPump.post(WebRTCevent); -    } -} - - -  void LLWebRTCVoiceClient::muteListChanged()  {  	// The user's mute list has been updated.  Go through the current participant list and sync it with the mute list. @@ -1215,149 +1175,47 @@ void LLWebRTCVoiceClient::removeParticipantByID(const std::string &channelID, co      }  } - -// Check for parcel boundary crossing -bool LLWebRTCVoiceClient::checkParcelChanged(bool update) -{ -	LLViewerRegion *region = gAgent.getRegion(); -	LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -	 -	if(region && parcel) -	{ -		S32 parcelLocalID = parcel->getLocalID(); -		std::string regionName = region->getName(); -		 -		//			LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL; -		 -		// The region name starts out empty and gets filled in later.   -		// Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes. -		// If either is empty, wait for the next time around. -		if(!regionName.empty()) -		{ -			if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName)) -			{ -				// We have changed parcels.  Initiate a parcel channel lookup. -				if (update) -				{ -					mCurrentParcelLocalID = parcelLocalID; -					mCurrentRegionName = regionName; -				} -				return true; -			} -		} -	} -	return false; -} - -bool LLWebRTCVoiceClient::switchChannel( -	const std::string channelID, -	bool spatial, -	bool no_reconnect, -	bool is_p2p, -	std::string hash, -    S32 parcel_local_id) +bool LLWebRTCVoiceClient::switchChannel(const std::string          channelID, +                                        sessionState::ESessionType session_type, +                                        S32                        parcel_local_id)  { -	bool needsSwitch = false; -      if (mAudioSession)      { -        if (mSessionTerminateRequested) +        // If we're already in a channel, or if we're joining one, terminate +        // so we can rejoin with the new session data. +        sessionTerminate(); +        notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); +        deleteSession(mAudioSession); +    } + +    if (channelID.empty()) +    { +        // Leave any channel we may be in +        LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL; + +        if (mNextAudioSession)          { -            // If a terminate has been requested, we need to compare against where the URI we're already headed to. -            if(mNextAudioSession) -            { -                if (mNextAudioSession->mChannelID != channelID) -                    needsSwitch = true; -            } -            else -            { -                // mNextAudioSession is null -- this probably means we're on our way back to spatial. -                if (!channelID.empty()) -                { -                    // We do want to process a switch in this case. -                    needsSwitch = true; -                } -            } +            deleteSession(mNextAudioSession);          } -        else +        // If voice was on, turn it off +        if (LLVoiceClient::getInstance()->getUserPTTState())          { -            // Otherwise, compare against the URI we're in now. -            if(mAudioSession) -            { -                if (mAudioSession->mChannelID != channelID) -                { -                    needsSwitch = true; -                } -            } -            else -            { -                if (!channelID.empty()) -                { -                    // mAudioSession is null -- it's not clear what case would cause this. -                    // For now, log it as a warning and see if it ever crops up. -                    LL_WARNS("Voice") << "No current audio session... Forcing switch" << LL_ENDL; -                    needsSwitch = true; -                } -            } +            LLVoiceClient::getInstance()->setUserPTTState(false);          } + +        notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);      }      else      { -        if (!mNextAudioSession || mNextAudioSession->mChannelID != channelID) +        if (mNextAudioSession)          { -            needsSwitch = true; +            deleteSession(mNextAudioSession);          } +        LL_DEBUGS("Voice") << "switching to channel " << channelID << LL_ENDL; +        mNextAudioSession             = addSession(channelID, parcel_local_id); +        mNextAudioSession->mSessionType = session_type;      } - -    if(needsSwitch) -	{ -        if (mAudioSession) -        { -            // If we're already in a channel, or if we're joining one, terminate -            // so we can rejoin with the new session data. -            sessionTerminate(); -            notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); -            deleteSession(mAudioSession); -        } -         -        if (channelID.empty()) -		{ -			// Leave any channel we may be in -			LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL; - -            if (mNextAudioSession) -            { -                mAudioSession->shutdownAllConnections(); -            } -            sessionStatePtr_t oldSession = mNextAudioSession; -			mNextAudioSession.reset(); - -			// The old session may now need to be deleted. -			reapSession(oldSession); - -            // If voice was on, turn it off -            if (LLVoiceClient::getInstance()->getUserPTTState()) -            { -                LLVoiceClient::getInstance()->setUserPTTState(false); -            } - -			notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); -		} -		else -		{ -            if (mNextAudioSession) -            { -                deleteSession(mNextAudioSession); -            } -            LL_DEBUGS("Voice") << "switching to channel " << channelID << LL_ENDL; -            mNextAudioSession             = addSession(channelID, parcel_local_id); -            mNextAudioSession->mIsSpatial = spatial; -            mNextAudioSession->mReconnect = !no_reconnect; -            mNextAudioSession->mIsP2P     = is_p2p; -		} -	} - -    return needsSwitch; +    return true;	  }  void LLWebRTCVoiceClient::joinSession(const sessionStatePtr_t &session) @@ -1376,7 +1234,7 @@ void LLWebRTCVoiceClient::setNonSpatialChannel(  	const std::string &uri,  	const std::string &credentials)  { -	switchChannel(uri, false, false, false, credentials); +	switchChannel(uri, sessionState::SESSION_TYPE_P2P);  }  bool LLWebRTCVoiceClient::setSpatialChannel( @@ -1386,7 +1244,7 @@ bool LLWebRTCVoiceClient::setSpatialChannel(  	LL_DEBUGS("Voice") << "got spatial channel uri: \"" << uri << "\"" << LL_ENDL; -	if((mAudioSession && !(mAudioSession->mIsSpatial)) || (mNextAudioSession && !(mNextAudioSession->mIsSpatial))) +	if((mAudioSession && !mAudioSession->isSpatial()) || (mNextAudioSession && !mNextAudioSession->isSpatial()))  	{  		// User is in a non-spatial chat or joining a non-spatial chat.  Don't switch channels.  		LL_INFOS("Voice") << "in non-spatial chat, not switching channels" << LL_ENDL; @@ -1394,13 +1252,13 @@ bool LLWebRTCVoiceClient::setSpatialChannel(  	}  	else  	{ -        return switchChannel(uri, true, false, false, "", parcel_local_id); +        return switchChannel(uri, parcel_local_id == INVALID_PARCEL_ID ? sessionState::SESSION_TYPE_ESTATE : sessionState::SESSION_TYPE_PARCEL, parcel_local_id);  	}  }  void LLWebRTCVoiceClient::callUser(const LLUUID &uuid)  {  -    switchChannel(uuid.asString(), false, true, true); +    switchChannel(uuid.asString(), sessionState::SESSION_TYPE_P2P);  }  void LLWebRTCVoiceClient::endUserIMSession(const LLUUID &uuid) @@ -1419,9 +1277,7 @@ bool LLWebRTCVoiceClient::answerInvite(std::string &channelID)      sessionStatePtr_t session(findP2PSession(LLUUID(channelID)));  	if(session)  	{ -		session->mIsSpatial = false; -		session->mReconnect = false;	 -		session->mIsP2P = true; +        session->mSessionType = sessionState::ESessionType::SESSION_TYPE_P2P;  		joinSession(session);  		return true; @@ -1604,7 +1460,7 @@ bool LLWebRTCVoiceClient::inSpatialChannel(void)  	if(mAudioSession)      { -		result = mAudioSession->mIsSpatial; +		result = mAudioSession->isSpatial();      }  	return result; @@ -2061,34 +1917,12 @@ BOOL LLWebRTCVoiceClient::getAreaVoiceDisabled()  	return mAreaVoiceDisabled;  } -void LLWebRTCVoiceClient::reapEmptySessions() -{ -    sessionState::reapEmptySessions(); - -    // mAudioSession or mNextAudioSession was reaped, -    // so reset them. -    if (mAudioSession && !sessionState::hasSession(mAudioSession->mChannelID)) -    { -        mAudioSession.reset(); -    } -    if (mNextAudioSession && !sessionState::hasSession(mNextAudioSession->mChannelID)) -    { -        mNextAudioSession.reset(); -    } -} -  //------------------------------------------------------------------------  std::map<std::string, LLWebRTCVoiceClient::sessionState::ptr_t> LLWebRTCVoiceClient::sessionState::mSessions;  LLWebRTCVoiceClient::sessionState::sessionState() :      mErrorStatusCode(0), -    mIsChannel(false), -    mIsSpatial(false), -    mIsP2P(false), -    mIncoming(false), -    mVoiceActive(false), -    mReconnect(false),      mVolumeDirty(false),      mMuteDirty(false),      mParticipantsChanged(false) @@ -2102,8 +1936,7 @@ LLWebRTCVoiceClient::sessionState::ptr_t LLWebRTCVoiceClient::sessionState::crea      sessionState::ptr_t session(new sessionState());      session->mChannelID = channelID; -    connectionPtr_t connection = connectionPtr_t(new LLVoiceWebRTCConnection(region_id, parcelLocalID, channelID)); -    session->mWebRTCConnections[channelID] = connection; +    session->mWebRTCConnections.emplace_back(new LLVoiceWebRTCConnection(region_id, parcelLocalID, channelID));      session->mPrimaryConnectionID          = channelID; @@ -2202,7 +2035,7 @@ void LLWebRTCVoiceClient::sessionState::for_eachPredicate(const std::pair<std::s  LLWebRTCVoiceClient::sessionStatePtr_t LLWebRTCVoiceClient::findP2PSession(const LLUUID &agent_id)  {      sessionStatePtr_t result = sessionState::matchSessionByChannelID(agent_id.asString()); -    if (result && result->mIsP2P) +    if (result && result->mSessionType == sessionState::SESSION_TYPE_P2P)      {          return result;      } @@ -2217,7 +2050,7 @@ void LLWebRTCVoiceClient::sessionState::shutdownAllConnections()  {       for (auto &&connection : mWebRTCConnections)      { -        connection.second->shutDown(); +        connection->shutDown();      }  } @@ -2277,14 +2110,16 @@ void LLWebRTCVoiceClient::deleteSession(const sessionStatePtr_t &session)  	verifySessionState();      session->shutdownAllConnections();  	// If this is the current audio session, clean up the pointer which will soon be dangling. -	if(mAudioSession == session) +    bool deleteAudioSession = mAudioSession == session; +    bool deleteNextAudioSession = mNextAudioSession == session; +    if (deleteAudioSession)  	{  		mAudioSession.reset();  		mAudioSessionChanged = true;  	}  	// ditto for the next audio session -	if(mNextAudioSession == session) +    if (deleteNextAudioSession)  	{  		mNextAudioSession.reset();  	} @@ -2696,73 +2531,68 @@ void LLVoiceWebRTCConnection::OnPeerShutDown()  void LLVoiceWebRTCConnection::processIceUpdates()  { -    if (LLWebRTCVoiceClient::isShuttingDown()) -    { -        return; -    } -    if (mShutDown) -    { -        return; -    } -    LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID); -    if (!regionp || !regionp->capabilitiesReceived()) +    if (mShutDown || LLWebRTCVoiceClient::isShuttingDown())      { -        LL_DEBUGS("Voice") << "no capabilities for ice gathering; waiting " << LL_ENDL;          return;      } -    std::string url = regionp->getCapability("VoiceSignalingRequest"); -    if (url.empty()) -    { -        return; -    } - -    LL_DEBUGS("Voice") << "region ready to complete voice signaling; url=" << url << LL_ENDL; - -    LLCore::HttpRequest::policy_t               httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); -    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy)); -    LLCore::HttpRequest::ptr_t                  httpRequest(new LLCore::HttpRequest); -    LLCore::HttpOptions::ptr_t                  httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); -      bool iceCompleted = false;      LLSD body;      {          if (!mTrickling)          { -            if (mIceCandidates.size()) +            if (!mIceCandidates.empty() || mIceCompleted)              { -                LLSD candidates = LLSD::emptyArray(); -                for (auto &ice_candidate : mIceCandidates) +                LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID); +                if (!regionp || !regionp->capabilitiesReceived())                  { -                LLSD body_candidate; -                body_candidate["sdpMid"]        = ice_candidate.sdp_mid; -                body_candidate["sdpMLineIndex"] = ice_candidate.mline_index; -                body_candidate["candidate"]     = ice_candidate.candidate; -                candidates.append(body_candidate); +                    LL_DEBUGS("Voice") << "no capabilities for ice gathering; waiting " << LL_ENDL; +                    return;                  } -                body["candidates"] = candidates; -                mIceCandidates.clear(); -            } -            else if (mIceCompleted) -            { -                LLSD body_candidate; -                body_candidate["completed"] = true; -                body["candidate"]           = body_candidate; -                iceCompleted                = mIceCompleted; -                mIceCompleted               = false; -            } -            else -            { -                return; + +                std::string url = regionp->getCapability("VoiceSignalingRequest"); +                if (url.empty()) +                { +                    return; +                } + +                LL_DEBUGS("Voice") << "region ready to complete voice signaling; url=" << url << LL_ENDL; +                if (!mIceCandidates.empty()) { +                    LLSD candidates = LLSD::emptyArray(); +                    for (auto &ice_candidate : mIceCandidates) +                    { +                        LLSD body_candidate; +                        body_candidate["sdpMid"]        = ice_candidate.sdp_mid; +                        body_candidate["sdpMLineIndex"] = ice_candidate.mline_index; +                        body_candidate["candidate"]     = ice_candidate.candidate; +                        candidates.append(body_candidate); +                    } +                    body["candidates"] = candidates; +                    mIceCandidates.clear(); +                } +                else if (mIceCompleted) +                { +                    LLSD body_candidate; +                    body_candidate["completed"] = true; +                    body["candidate"]           = body_candidate; +                    iceCompleted                = mIceCompleted; +                    mIceCompleted               = false; +                } + +                LLCore::HttpRequest::policy_t               httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +                LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( +                    new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy)); +                LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); +                LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); +                LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost( +                    url, +                    LLCore::HttpRequest::DEFAULT_POLICY_ID, +                    body, +                    boost::bind(&LLVoiceWebRTCConnection::onIceUpdateComplete, this, iceCompleted, _1), +                    boost::bind(&LLVoiceWebRTCConnection::onIceUpdateError, this, 3, url, body, iceCompleted, _1)); +                mOutstandingRequests++; +                mTrickling = true;              } -            LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost( -                url, -                LLCore::HttpRequest::DEFAULT_POLICY_ID, -                body, -                boost::bind(&LLVoiceWebRTCConnection::onIceUpdateComplete, this, iceCompleted, _1), -                boost::bind(&LLVoiceWebRTCConnection::onIceUpdateError, this, 3, url, body, iceCompleted, _1)); -            mOutstandingRequests++; -            mTrickling = true;          }      }  } @@ -2862,7 +2692,7 @@ void LLVoiceWebRTCConnection::OnVoiceConnectionRequestFailure(std::string url, i  }  bool LLVoiceWebRTCConnection::connectionStateMachine() -{    +{        processIceUpdates();      switch (getVoiceConnectionState()) @@ -2872,6 +2702,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()              if (mShutDown)              {                  setVoiceConnectionState(VOICE_STATE_DISCONNECT); +                break;              }              mTrickling    = false;              mIceCompleted = false; diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index f311f241dc..1e8ecdf5c2 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -330,7 +330,9 @@ public:  		bool isCallBackPossible();  		bool isTextIMPossible(); -        void processSessionStates(); +		static void processSessionStates(); + +        bool processConnectionStates();  		void OnConnectionEstablished(const std::string &channelID);          void OnConnectionFailure(const std::string &channelID); @@ -347,6 +349,15 @@ public:  		bool isEmpty() { return mWebRTCConnections.empty(); } +		bool isSpatial() { return mSessionType == SESSION_TYPE_ESTATE || mSessionType == SESSION_TYPE_PARCEL; } + +    typedef enum e_session_type +        { +            SESSION_TYPE_ESTATE                = 1, +            SESSION_TYPE_PARCEL, +            SESSION_TYPE_P2P +        } ESessionType; +  		std::string mHandle;  		std::string mGroupHandle;  		std::string mChannelID; @@ -362,9 +373,8 @@ public:  		LLUUID		mIMSessionID;  		LLUUID		mCallerID;  		int			mErrorStatusCode; -		bool		mIsChannel;	// True for both group and spatial channels (false for p2p, PSTN) -		bool		mIsSpatial;	// True for spatial channels -		bool		mIsP2P; +        ESessionType mSessionType; +  		bool		mIncoming;  		bool		mVoiceActive;  		bool		mReconnect;	// Whether we should try to reconnect to this session if it's dropped @@ -381,16 +391,17 @@ public:  		LLUUID		mVoiceFontID;          static void VerifySessions(); -        static bool hasSession(const std::string &sessionID) { return mSessions.find(sessionID) != mSessions.end(); } +        static bool hasSession(const std::string &sessionID)  +		{ return mSessions.find(sessionID) != mSessions.end(); }      private: -		std::map<std::string, connectionPtr_t> mWebRTCConnections; -        std::string   					       mPrimaryConnectionID; +		std::list<connectionPtr_t> mWebRTCConnections; +        std::string   			   mPrimaryConnectionID; +        static std::map<std::string, ptr_t> mSessions;  // canonical list of outstanding sessions.          sessionState(); -        static std::map<std::string, ptr_t> mSessions;  // canonical list of outstanding sessions.          static void for_eachPredicate(const std::pair<std::string, LLWebRTCVoiceClient::sessionState::wptr_t> &a, sessionFunc_t func); @@ -406,7 +417,6 @@ public:  	// Private Member Functions  	////////////////////////////////////////////////////// -    static void predProcessSessionStates(const LLWebRTCVoiceClient::sessionStatePtr_t &session);      static void predOnConnectionEstablished(const LLWebRTCVoiceClient::sessionStatePtr_t &session, std::string channelID);      static void predOnConnectionFailure(const LLWebRTCVoiceClient::sessionStatePtr_t &session, std::string channelID);      static void predSendData(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const std::string& spatial_data, const std::string& volume_data); @@ -415,7 +425,6 @@ public:      static void predSetMicGain(const LLWebRTCVoiceClient::sessionStatePtr_t &session, F32 volume);      static void predSetSpeakerVolume(const LLWebRTCVoiceClient::sessionStatePtr_t &session, F32 volume);      static void predShutdownSession(const LLWebRTCVoiceClient::sessionStatePtr_t &session); -    void reapEmptySessions();  	//////////////////////////////  	/// @name TVC/Server management and communication @@ -476,9 +485,6 @@ public:  	void verifySessionState(void); -    void joinedAudioSession(const sessionStatePtr_t &session); -    void leftAudioSession(const sessionStatePtr_t &session); -  	// This is called in several places where the session _may_ need to be deleted.  	// It contains logic for whether to delete the session or keep it around.      void reapSession(const sessionStatePtr_t &session);	 @@ -596,12 +602,8 @@ private:  	bool mIsInitialized;  	bool mShutdownComplete; -	bool checkParcelChanged(bool update = false);      bool switchChannel(const std::string channelID, -                       bool         spatial      = true, -                       bool         no_reconnect = false, -                       bool         is_p2p       = false, -                       std::string  hash         = "", +                       sessionState::ESessionType sessionType,  		               S32          parcel_local_id = INVALID_PARCEL_ID);      void joinSession(const sessionStatePtr_t &session); @@ -808,6 +810,10 @@ protected:      }      EVoiceConnectionState getVoiceConnectionState()      { +		if (mVoiceStateMutex.isLocked()) +		{ +            LL_WARNS("Voice") << "LOCKED." << LL_ENDL; +		}          LLMutexLock lock(&mVoiceStateMutex);          return mVoiceConnectionState;      } @@ -839,6 +845,7 @@ protected:      llwebrtc::LLWebRTCDataInterface  *mWebRTCDataInterface;  }; +#define VOICE_ELAPSED LLVoiceTimer(__FUNCTION__);  #endif //LL_WebRTC_VOICE_CLIENT_H | 
