diff options
| author | Roxie Linden <roxie@lindenlab.com> | 2023-10-19 14:50:12 -0700 | 
|---|---|---|
| committer | Roxie Linden <roxie@lindenlab.com> | 2024-02-08 18:34:01 -0800 | 
| commit | a7b70788a8f7c3cf607242851e6f65aaf446515b (patch) | |
| tree | 2bc912614b86007752c2239f5be9b19f16118056 | |
| parent | 5c574d44c5770353c5063209668b10a5fbdd5e05 (diff) | |
quicker turnaround on re-establishing voice when server goes down.
| -rw-r--r-- | indra/llwebrtc/llwebrtc.cpp | 25 | ||||
| -rw-r--r-- | indra/newview/llvoicewebrtc.cpp | 108 | ||||
| -rw-r--r-- | indra/newview/llvoicewebrtc.h | 5 | 
3 files changed, 80 insertions, 58 deletions
| diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 78968fc89b..194c7cd5d4 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -497,7 +497,7 @@ bool LLWebRTCImpl::initializeConnection()  void LLWebRTCImpl::shutdownConnection()  { -    mSignalingThread->PostTask( +    mSignalingThread->BlockingCall(          [this]()          {              if (mPeerConnection) @@ -507,24 +507,21 @@ void LLWebRTCImpl::shutdownConnection()              }              mPeerConnectionFactory = nullptr;          }); -    mWorkerThread->PostTask( +    mWorkerThread->BlockingCall(          [this]()          { -            if (mTuningDeviceModule) -            { -                mTuningDeviceModule->StopRecording(); -                mTuningDeviceModule->Terminate(); -            }              if (mPeerDeviceModule)              {                  mPeerDeviceModule->StopRecording();                  mPeerDeviceModule->Terminate();              } -            mTuningDeviceModule = nullptr;              mPeerDeviceModule   = nullptr; -            mTaskQueueFactory   = nullptr; +            if (mPeerAudioDeviceObserver) +            { +                mPeerAudioDeviceObserver = nullptr; +            }          }); -    mNetworkThread->PostTask( +    mNetworkThread->BlockingCall(          [this]()          {              if (mDataChannel) @@ -694,6 +691,7 @@ static std::string iceCandidateToTrickleString(const webrtc::IceCandidateInterfa          std::to_string(candidate->candidate().priority()) << " " <<          candidate->candidate().address().ipaddr().ToString() << " " <<          candidate->candidate().address().PortAsString() << " typ "; +      if (candidate->candidate().type() == cricket::LOCAL_PORT_TYPE)      {          candidate_stream << "host"; @@ -716,6 +714,9 @@ static std::string iceCandidateToTrickleString(const webrtc::IceCandidateInterfa              "raddr " << candidate->candidate().related_address().ipaddr().ToString() << " " <<              "rport " << candidate->candidate().related_address().PortAsString();      } +    else { +        RTC_LOG(LS_ERROR) << __FUNCTION__ << " Unknown candidate type " << candidate->candidate().type(); +    }      if (candidate->candidate().protocol() == "tcp")       {          candidate_stream << " tcptype " << candidate->candidate().tcptype(); @@ -827,8 +828,10 @@ void LLWebRTCImpl::OnSetRemoteDescriptionComplete(webrtc::RTCError error)              ice_candidate.sdp_mid     = candidate->sdp_mid();              observer->OnIceCandidate(ice_candidate);          } -        mCachedIceCandidates.clear();      } +    mCachedIceCandidates.clear(); +    OnIceGatheringChange(mPeerConnection->ice_gathering_state()); +  }  // diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 657f587370..0aa69dc7e8 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -616,6 +616,10 @@ void LLWebRTCVoiceClient::voiceControlStateMachine()                  }                  else                  { +                    LLMutexLock lock(&mVoiceStateMutex); + +                    mTrickling = false; +                    mIceCompleted = false;                      setVoiceControlStateUnless(VOICE_STATE_START_SESSION, VOICE_STATE_SESSION_RETRY);                  }                  break; @@ -673,7 +677,7 @@ void LLWebRTCVoiceClient::voiceControlStateMachine()                  {                      // We failed to connect, give it a bit time before retrying.                      retry++; -                    F32 full_delay    = llmin(5.f * (F32) retry, 60.f); +                    F32 full_delay    = llmin(2.f * (F32) retry, 10.f);                      F32 current_delay = 0.f;                      LL_INFOS("Voice") << "Voice failed to establish session after " << retry << " tries. Will attempt to reconnect in "                                        << full_delay << " seconds" << LL_ENDL; @@ -686,11 +690,12 @@ void LLWebRTCVoiceClient::voiceControlStateMachine()                          llcoro::suspendUntilTimeout(1.f);                      }                  } -                setVoiceControlStateUnless(VOICE_STATE_WAIT_FOR_EXIT); +                setVoiceControlStateUnless(VOICE_STATE_DISCONNECT);                  break;              case VOICE_STATE_SESSION_ESTABLISHED:              { +                retry = 0;                  if (mTuningMode)                  {                      performMicTuning(); @@ -2388,11 +2393,20 @@ void LLWebRTCVoiceClient::OnIceGatheringState(llwebrtc::LLWebRTCSignalingObserve  {      LL_INFOS("Voice") << "Ice Gathering voice account. " << state << LL_ENDL; -	if (state == llwebrtc::LLWebRTCSignalingObserver::IceGatheringState::ICE_GATHERING_COMPLETE)  -	{ -        LLMutexLock lock(&mVoiceStateMutex); -        mIceCompleted = true; -	} +	switch (state) +    { +        case llwebrtc::LLWebRTCSignalingObserver::IceGatheringState::ICE_GATHERING_COMPLETE: +        { +            LLMutexLock lock(&mVoiceStateMutex); +            mIceCompleted = true; +            break; +        } +        case llwebrtc::LLWebRTCSignalingObserver::IceGatheringState::ICE_GATHERING_NEW: +        { +            LLMutexLock lock(&mVoiceStateMutex); +            mIceCompleted = false; +        } +    }  }  void LLWebRTCVoiceClient::OnIceCandidate(const llwebrtc::LLWebRTCIceCandidate &candidate) @@ -2425,53 +2439,55 @@ void LLWebRTCVoiceClient::processIceUpdates()      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;      {          LLMutexLock lock(&mVoiceStateMutex); -        if (mIceCandidates.size()) +		if (!mTrickling)          { -            LLSD candidates    = LLSD::emptyArray(); -            body["candidates"] = LLSD::emptyArray(); -            for (auto &ice_candidate : mIceCandidates) +            if (mIceCandidates.size()) +            { +                LLSD candidates    = LLSD::emptyArray(); +                body["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["sdpMid"]        = ice_candidate.sdp_mid; -                body_candidate["sdpMLineIndex"] = ice_candidate.mline_index; -                body_candidate["candidate"]     = ice_candidate.candidate; -                candidates.append(body_candidate); +                body_candidate["completed"] = true; +                body["candidate"]           = body_candidate; +                iceCompleted                = mIceCompleted; +                mIceCompleted               = false;              } -            body["candidates"] = candidates; -            mIceCandidates.clear(); -        } -        else if (mIceCompleted) -        { -            LLSD body_candidate; -            body_candidate["completed"] = true; -            body["candidate"]           = body_candidate; -            mIceCompleted               = false; -        } -        else -        { -            return; +            else +            { +                return; +            } +            LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost( +                url, +                LLCore::HttpRequest::DEFAULT_POLICY_ID, +                body, +                boost::bind(&LLWebRTCVoiceClient::onIceUpdateComplete, this, iceCompleted, _1), +                boost::bind(&LLWebRTCVoiceClient::onIceUpdateError, this, 3, url, body, iceCompleted, _1)); +            mTrickling = true;          }      } -    LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, -                                  LLCore::HttpRequest::DEFAULT_POLICY_ID, -                                  body, -                                  boost::bind(&LLWebRTCVoiceClient::onIceUpdateComplete, this, _1), -                                  boost::bind(&LLWebRTCVoiceClient::onIceUpdateError, this, 3, url, body, _1));  } -void LLWebRTCVoiceClient::onIceUpdateComplete(const LLSD& result) -{ -    if (sShuttingDown) -    { -        return; -    } -} +void LLWebRTCVoiceClient::onIceUpdateComplete(bool ice_completed, const LLSD& result) +{ mTrickling = false; } -void LLWebRTCVoiceClient::onIceUpdateError(int retries, std::string url, LLSD body, const LLSD& result) +void LLWebRTCVoiceClient::onIceUpdateError(int retries, std::string url, LLSD body, bool ice_completed, const LLSD& result)  {      if (sShuttingDown)      { @@ -2482,16 +2498,18 @@ void LLWebRTCVoiceClient::onIceUpdateError(int retries, std::string url, LLSD bo  	if (retries >= 0)      { -        LL_WARNS("Voice") << "Unable to complete ice trickling voice account, retrying." << LL_ENDL; +        LL_WARNS("Voice") << "Unable to complete ice trickling voice account, retrying.  " << result << LL_ENDL;          LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url,                                        LLCore::HttpRequest::DEFAULT_POLICY_ID,                                        body, -                                      boost::bind(&LLWebRTCVoiceClient::onIceUpdateComplete, this, _1), -									  boost::bind(&LLWebRTCVoiceClient::onIceUpdateError, this, retries - 1, url, body, _1)); +                                      boost::bind(&LLWebRTCVoiceClient::onIceUpdateComplete, this, ice_completed, _1), +									  boost::bind(&LLWebRTCVoiceClient::onIceUpdateError, this, retries - 1, url, body, ice_completed, _1));      }      else   	{ -        LL_WARNS("Voice") << "Unable to complete ice trickling voice account, retrying." << LL_ENDL; +        LL_WARNS("Voice") << "Unable to complete ice trickling voice account, restarting connection.  " << result << LL_ENDL; +        setVoiceControlStateUnless(VOICE_STATE_SESSION_RETRY); +        mTrickling = false;   	}  } diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index bd4346022f..fd7094cb46 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -275,8 +275,8 @@ public:      //@}  	void processIceUpdates(); -    void onIceUpdateComplete(const LLSD& result); -    void onIceUpdateError(int retries, std::string url, LLSD body, const LLSD& result); +    void onIceUpdateComplete(bool ice_completed, const LLSD& result); +    void onIceUpdateError(int retries, std::string url, LLSD body, bool ice_completed, const LLSD& result);  	////////////////////////////// @@ -786,6 +786,7 @@ private:  	LLVoiceDeviceList mRenderDevices;      std::vector<llwebrtc::LLWebRTCIceCandidate> mIceCandidates;      bool                                        mIceCompleted; +    bool                                        mTrickling;  	uint32_t mAudioLevel; | 
