From 8897ebeb6a0f1d96c7150385a01cb03cd0c43f50 Mon Sep 17 00:00:00 2001
From: Roxie Linden <roxie@lindenlab.com>
Date: Wed, 14 Aug 2024 14:38:37 -0700
Subject: [PATCH] Voice dot not always visible after crossing region
 boundaries.

For issue #2064
The connection to the voice server was not upgraded/downgraded to primary/secondary when crossing
region boundaries, so the server sent the wrong value and the viewer chose not to display a voice dot.
---
 indra/newview/llvoicewebrtc.cpp | 26 +++++++++++++++++++++++++-
 indra/newview/llvoicewebrtc.h   |  3 ++-
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index 06baea4ba23..84d1e767f84 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -2150,8 +2150,21 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID &regionID, const s
     mOutstandingRequests(0),
     mChannelID(channelID),
     mRegionID(regionID),
+    mPrimary(false),
     mRetryWaitPeriod(0)
 {
+    if (isSpatial())
+    {
+        if (gAgent.getRegion())
+        {
+            mPrimary = (regionID == gAgent.getRegion()->getRegionID());
+        }
+    }
+    else
+    {
+        mPrimary = true;
+    }
+
     // retries wait a short period...randomize it so
     // all clients don't try to reconnect at once.
     mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5;
@@ -2755,6 +2768,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)
@@ -3023,7 +3047,7 @@ void LLVoiceWebRTCConnection::sendJoin()
     Json::Value      root     = Json::objectValue;
     Json::Value      join_obj = Json::objectValue;
     LLUUID           regionID = gAgent.getRegion()->getRegionID();
-    if ((regionID == mRegionID) || !isSpatial())
+    if (mPrimary)
     {
         join_obj["p"] = true;
     }
diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h
index 48c50a1ea3b..324b4c5b9c9 100644
--- a/indra/newview/llvoicewebrtc.h
+++ b/indra/newview/llvoicewebrtc.h
@@ -622,7 +622,7 @@ class LLVoiceWebRTCConnection :
 
     bool connectionStateMachine();
 
-    virtual bool isSpatial() = 0;
+    virtual bool isSpatial() { return false; }
 
     LLUUID getRegionID() { return mRegionID; }
 
@@ -686,6 +686,7 @@ class LLVoiceWebRTCConnection :
     LLVoiceClientStatusObserver::EStatusType mCurrentStatus;
 
     LLUUID mRegionID;
+    bool   mPrimary;
     LLUUID mViewerSession;
     std::string mChannelID;
 
-- 
GitLab