diff options
Diffstat (limited to 'indra/newview/llvoicevivox.cpp')
-rw-r--r-- | indra/newview/llvoicevivox.cpp | 616 |
1 files changed, 398 insertions, 218 deletions
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 25df528d89..627b83818f 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -88,22 +88,27 @@ namespace { static const std::string VOICE_SERVER_TYPE = "Vivox"; // Don't retry connecting to the daemon more frequently than this: - const F32 CONNECT_THROTTLE_SECONDS = 1.0f; + const F32 DAEMON_CONNECT_THROTTLE_SECONDS = 1.0f; // Don't send positional updates more frequently than this: const F32 UPDATE_THROTTLE_SECONDS = 0.5f; - const F32 LOGIN_ATTEMPT_TIMEOUT = 5.0f; - const int LOGIN_RETRY_MAX = 5; - const F32 LOGIN_RETRY_TIMEOUT = 4.0f; + // Timeout for connection to Vivox + const F32 CONNECT_ATTEMPT_TIMEOUT = 300.0f; + const F32 CONNECT_DNS_TIMEOUT = 5.0f; + const int CONNECT_RETRY_MAX = 3; + + const F32 LOGIN_ATTEMPT_TIMEOUT = 30.0f; + const int LOGIN_RETRY_MAX = 3; - const int PROVISION_RETRY_MAX = 5; const F32 PROVISION_RETRY_TIMEOUT = 2.0; + const int PROVISION_RETRY_MAX = 5; // Cosine of a "trivially" small angle - const F32 MINUSCULE_ANGLE_COS = 0.999f; + const F32 FOUR_DEGREES = 4.0f * (F_PI / 180.0f); + const F32 MINUSCULE_ANGLE_COS = (F32) cos(0.5f * FOUR_DEGREES); - const F32 SESSION_JOIN_TIMEOUT = 10.0f; + const F32 SESSION_JOIN_TIMEOUT = 30.0f; // Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine() // which is treated as normal. The is the number of frames to wait for a channel join before giving up. This was changed @@ -148,6 +153,96 @@ class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver }; +void LLVoiceVivoxStats::reset() +{ + mStartTime = -1.0f; + mConnectCycles = 0; + mConnectTime = -1.0f; + mConnectAttempts = 0; + mProvisionTime = -1.0f; + mProvisionAttempts = 0; + mEstablishTime = -1.0f; + mEstablishAttempts = 0; +} + +LLVoiceVivoxStats::LLVoiceVivoxStats() +{ + reset(); +} + +LLVoiceVivoxStats::~LLVoiceVivoxStats() +{ +} + +void LLVoiceVivoxStats::connectionAttemptStart() +{ + if (!mConnectAttempts) + { + mStartTime = LLTimer::getTotalTime(); + mConnectCycles++; + } + mConnectAttempts++; +} + +void LLVoiceVivoxStats::connectionAttemptEnd(bool success) +{ + if ( success ) + { + mConnectTime = (LLTimer::getTotalTime() - mStartTime) / USEC_PER_SEC; + } +} + +void LLVoiceVivoxStats::provisionAttemptStart() +{ + if (!mProvisionAttempts) + { + mStartTime = LLTimer::getTotalTime(); + } + mProvisionAttempts++; +} + +void LLVoiceVivoxStats::provisionAttemptEnd(bool success) +{ + if ( success ) + { + mProvisionTime = (LLTimer::getTotalTime() - mStartTime) / USEC_PER_SEC; + } +} + +void LLVoiceVivoxStats::establishAttemptStart() +{ + if (!mEstablishAttempts) + { + mStartTime = LLTimer::getTotalTime(); + } + mEstablishAttempts++; +} + +void LLVoiceVivoxStats::establishAttemptEnd(bool success) +{ + if ( success ) + { + mEstablishTime = (LLTimer::getTotalTime() - mStartTime) / USEC_PER_SEC; + } +} + +LLSD LLVoiceVivoxStats::read() +{ + LLSD stats(LLSD::emptyMap()); + + stats["connect_cycles"] = LLSD::Integer(mConnectCycles); + stats["connect_attempts"] = LLSD::Integer(mConnectAttempts); + stats["connect_time"] = LLSD::Real(mConnectTime); + + stats["provision_attempts"] = LLSD::Integer(mProvisionAttempts); + stats["provision_time"] = LLSD::Real(mProvisionTime); + + stats["establish_attempts"] = LLSD::Integer(mEstablishAttempts); + stats["establish_time"] = LLSD::Real(mEstablishTime); + + return stats; +} + static LLVivoxVoiceClientMuteListObserver mutelist_listener; static bool sMuteListListener_listening = false; @@ -297,7 +392,10 @@ void LLVivoxVoiceClient::terminate() // needs to be done manually here since we will not get another pass in // coroutines... that mechanism is long since gone. if (mIsLoggedIn) + { logoutOfVivox(false); + } + if(mConnected) { breakVoiceConnection(false); @@ -313,6 +411,8 @@ void LLVivoxVoiceClient::terminate() void LLVivoxVoiceClient::cleanUp() { + LL_DEBUGS("Voice") << LL_ENDL; + deleteAllSessions(); deleteAllVoiceFonts(); deleteVoiceFontTemplates(); @@ -329,7 +429,7 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() void LLVivoxVoiceClient::updateSettings() { - setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); + setVoiceEnabled(voiceEnabled()); setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); @@ -347,7 +447,7 @@ void LLVivoxVoiceClient::updateSettings() bool LLVivoxVoiceClient::writeString(const std::string &str) { bool result = false; -// LL_WARNS("LOW Voice") << "sending:\n" << str << LL_ENDL; + LL_DEBUGS("LOW Voice") << "sending:\n" << str << LL_ENDL; if(mConnected) { @@ -356,7 +456,7 @@ bool LLVivoxVoiceClient::writeString(const std::string &str) apr_size_t written = size; //MARK: Turn this on to log outgoing XML -// LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL; + // LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL; // check return code - sockets will fail (broken, etc.) err = apr_socket_send( @@ -396,16 +496,15 @@ bool LLVivoxVoiceClient::writeString(const std::string &str) void LLVivoxVoiceClient::connectorCreate() { std::ostringstream stream; - std::string logpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); - std::string loglevel = "0"; + std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); // Transition to stateConnectorStarted when the connector handle comes back. - std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel"); - - if(savedLogLevel != "0") - { - LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL; - } + std::string vivoxLogLevel = gSavedSettings.getString("VivoxDebugLevel"); + if ( vivoxLogLevel.empty() ) + { + vivoxLogLevel = "0"; + } + LL_DEBUGS("Voice") << "creating connector with log level " << vivoxLogLevel << LL_ENDL; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.Create.1\">" @@ -414,10 +513,10 @@ void LLVivoxVoiceClient::connectorCreate() << "<Mode>Normal</Mode>" << "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>" << "<Logging>" - << "<Folder>" << logpath << "</Folder>" + << "<Folder>" << logdir << "</Folder>" << "<FileNamePrefix>Connector</FileNamePrefix>" << "<FileNameSuffix>.log</FileNameSuffix>" - << "<LogLevel>" << loglevel << "</LogLevel>" + << "<LogLevel>" << vivoxLogLevel << "</LogLevel>" << "</Logging>" << "<Application>" << LLVersionInfo::getChannel().c_str() << " " << LLVersionInfo::getVersion().c_str() << "</Application>" //<< "<Application></Application>" //Name can cause problems per vivox. @@ -474,9 +573,8 @@ void LLVivoxVoiceClient::setLoginInfo( } else if ( account_name != mAccountName ) { - //TODO: error? - LL_WARNS("Voice") << "Wrong account name! " << account_name - << " instead of " << mAccountName << LL_ENDL; + LL_WARNS("Voice") << "Mismatched account name! " << account_name + << " instead of " << mAccountName << LL_ENDL; } else { @@ -487,6 +585,8 @@ void LLVivoxVoiceClient::setLoginInfo( if( !debugSIPURIHostName.empty() ) { + LL_INFOS("Voice") << "Overriding account server based on VivoxDebugSIPURIHostName: " + << debugSIPURIHostName << LL_ENDL; mVoiceSIPURIHostName = debugSIPURIHostName; } @@ -505,12 +605,17 @@ void LLVivoxVoiceClient::setLoginInfo( // Use the development account server mVoiceSIPURIHostName = "bhd.vivox.com"; } + LL_INFOS("Voice") << "Defaulting SIP URI host: " + << mVoiceSIPURIHostName << LL_ENDL; + } std::string debugAccountServerURI = gSavedSettings.getString("VivoxDebugVoiceAccountServerURI"); if( !debugAccountServerURI.empty() ) { + LL_INFOS("Voice") << "Overriding account server based on VivoxDebugVoiceAccountServerURI: " + << debugAccountServerURI << LL_ENDL; mVoiceAccountServerURI = debugAccountServerURI; } @@ -518,6 +623,8 @@ void LLVivoxVoiceClient::setLoginInfo( { // If the account server URI isn't specified, construct it from the SIP URI hostname mVoiceAccountServerURI = "https://www." + mVoiceSIPURIHostName + "/api2/"; + LL_INFOS("Voice") << "Inferring account server based on SIP URI Host name: " + << mVoiceAccountServerURI << LL_ENDL; } } @@ -540,18 +647,17 @@ void LLVivoxVoiceClient::voiceControlCoro() do { - startAndConnectSession(); - - if (mTuningMode) - { - performMicTuning(); - } - else if (mVoiceEnabled) + if (startAndConnectSession()) { - waitForChannel(); - } + if (mTuningMode) + { + performMicTuning(); + } + + waitForChannel(); // this doesn't normally return unless relog is needed or shutting down - endAndDisconnectSession(); + endAndDisconnectSession(); + } // if we hit this and mRelogRequested is true, that indicates // that we attempted to relog into Vivox and were rejected. @@ -572,24 +678,28 @@ void LLVivoxVoiceClient::voiceControlCoro() bool LLVivoxVoiceClient::startAndConnectSession() { - if (!startAndLaunchDaemon()) - { - return false; - } + bool ok = false; + LL_DEBUGS("Voice") << LL_ENDL; + + LLVoiceVivoxStats::getInstance()->reset(); - if (!provisionVoiceAccount()) + if (startAndLaunchDaemon()) { - giveUp(); - return false; + if (provisionVoiceAccount()) + { + if (establishVoiceConnection()) + { + ok = true; + } + } } - if (!establishVoiceConnection()) + if (!ok) { giveUp(); - return false; } - return true; + return ok; } bool LLVivoxVoiceClient::endAndDisconnectSession() @@ -618,13 +728,13 @@ bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data) bool LLVivoxVoiceClient::startAndLaunchDaemon() { //--------------------------------------------------------------------- - if (gSavedSettings.getBOOL("CmdLineDisableVoice")) + if (!voiceEnabled()) { // Voice is locked out, we must not launch the vivox daemon. return false; } - if (!isGatewayRunning() && gSavedSettings.getBOOL("EnableVoiceChat")) + if (!isGatewayRunning()) { #ifndef VIVOXDAEMON_REMOTEHOST // Launch the voice daemon @@ -651,12 +761,10 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() params.executable = exe_path; std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); - std::string shutdown_timeout = gSavedSettings.getString("VivoxShutdownTimeout"); if (loglevel.empty()) { - loglevel = "-1"; // turn logging off completely, was 0 for error level logging. + loglevel = "0"; } - params.args.add("-ll"); params.args.add(loglevel); @@ -670,6 +778,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() params.args.add("-lf"); params.args.add(log_folder); + std::string shutdown_timeout = gSavedSettings.getString("VivoxShutdownTimeout"); if (!shutdown_timeout.empty()) { params.args.add("-st"); @@ -723,12 +832,11 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL; - int connectAttempt = 0; - + LLVoiceVivoxStats::getInstance()->reset(); while (!mConnected) { - ++connectAttempt; - LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << " (#" << connectAttempt << ")" << LL_ENDL; + LLVoiceVivoxStats::getInstance()->connectionAttemptStart(); + LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL; closeSocket(); if (!mSocket) { @@ -736,10 +844,13 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() } mConnected = mSocket->blockingConnect(mDaemonHost); + LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(mConnected); if (!mConnected) - llcoro::suspendUntilTimeout(CONNECT_THROTTLE_SECONDS); + { + llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS); + } } - + //--------------------------------------------------------------------- llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS); @@ -798,9 +909,10 @@ bool LLVivoxVoiceClient::provisionVoiceAccount() int retryCount(0); LLSD result; - + bool provisioned = false; do { + LLVoiceVivoxStats::getInstance()->provisionAttemptStart(); result = httpAdapter->postAndSuspend(httpRequest, url, LLSD(), httpOpts); LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; @@ -808,25 +920,28 @@ bool LLVivoxVoiceClient::provisionVoiceAccount() if (status == LLCore::HttpStatus(404)) { - if (++retryCount > PROVISION_RETRY_MAX) - { - LL_WARNS("Voice") << "Could not access voice provision cap after " << PROVISION_RETRY_MAX << " attempts." << LL_ENDL; - return false; - } - F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast<float>(retryCount)); LL_WARNS("Voice") << "Provision CAP 404. Retrying in " << timeout << " seconds." << LL_ENDL; llcoro::suspendUntilTimeout(timeout); - - continue; } else if (!status) { LL_WARNS("Voice") << "Unable to provision voice account." << LL_ENDL; + LLVoiceVivoxStats::getInstance()->provisionAttemptEnd(false); return false; } - break; - } while (true); + else + { + provisioned = true; + } + } while (!provisioned && retryCount <= PROVISION_RETRY_MAX); + + LLVoiceVivoxStats::getInstance()->provisionAttemptEnd(provisioned); + if (! provisioned ) + { + LL_WARNS("Voice") << "Could not access voice provision cap after " << retryCount << " attempts." << LL_ENDL; + return false; + } std::string voiceSipUriHostname; std::string voiceAccountServerUri; @@ -854,29 +969,68 @@ bool LLVivoxVoiceClient::establishVoiceConnection() if (!mVoiceEnabled && mIsInitialized) return false; - connectorCreate(); - LLSD result; + bool connected(false); + bool giving_up(false); + int retries = 0; + LL_INFOS("Voice") << "Requesting connection to voice service" << LL_ENDL; + + LLVoiceVivoxStats::getInstance()->establishAttemptStart(); + connectorCreate(); do { result = llcoro::suspendUntilEventOn(voiceConnectPump); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; - } - while (!result.has("connector")); + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; + + if (result.has("connector")) + { + LLVoiceVivoxStats::getInstance()->establishAttemptEnd(connected); + connected = LLSD::Boolean(result["connector"]); + if (!connected) + { + if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX) + { + F32 timeout = LLSD::Real(result["retry"]); + timeout *= retries; + LL_INFOS("Voice") << "Retry connection to voice service in " << timeout << " seconds" << LL_ENDL; + llcoro::suspendUntilTimeout(timeout); + + if (mVoiceEnabled) // user may have switched it off + { + // try again + LLVoiceVivoxStats::getInstance()->establishAttemptStart(); + connectorCreate(); + } + else + { + // stop if they've turned off voice + giving_up = true; + } + } + else + { + giving_up=true; + } + } + } + LL_DEBUGS("Voice") << (connected ? "" : "not ") << "connected, " + << (giving_up ? "" : "not ") << "giving up" + << LL_ENDL; + } while (!connected && !giving_up); - if (!result["connector"]) + if (giving_up) { - return false; + LLSD args; + args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority(); + LLNotificationsUtil::add("NoVoiceConnect", args); } - if (!mVoiceEnabled && mIsInitialized) - return false; - - return true; + return connected; } bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait) { + LL_DEBUGS("Voice") << LL_ENDL; LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump"); bool retval(true); @@ -886,7 +1040,7 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait) if (corowait) { LLSD result = llcoro::suspendUntilEventOn(voicePump); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; retval = result.has("connector"); } @@ -926,15 +1080,15 @@ bool LLVivoxVoiceClient::loginToVivox() do { - mIsLoggingIn = true; if (send_login) + { loginSendMessage(); - - send_login = false; - + send_login = false; + } + LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("login")) { @@ -942,39 +1096,31 @@ bool LLVivoxVoiceClient::loginToVivox() if ((loginresp == "retry") || (loginresp == "timeout")) { - if ((!loginRetryCount) && (loginresp != "timeout")) - { // on first retry notify user - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY); - } - - if ((++loginRetryCount > LOGIN_RETRY_MAX) || (loginresp == "timeout")) + LL_WARNS("Voice") << "login failed with status '" << loginresp << "' " + << " count " << loginRetryCount << "/" << LOGIN_RETRY_MAX + << LL_ENDL; + if (++loginRetryCount > LOGIN_RETRY_MAX) { - LL_WARNS("Voice") << "too many login retries or timeout connecting, giving up." << LL_ENDL; + // We've run out of retries - tell the user + LL_WARNS("Voice") << "too many login retries (" << loginRetryCount << "); giving up." << LL_ENDL; LLSD args; - std::stringstream errs; - errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; - args["HOSTID"] = errs.str(); + args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority(); mTerminateDaemon = true; - if (LLGridManager::getInstance()->isSystemGrid()) - { - LLNotificationsUtil::add("NoVoiceConnect", args); - } - else - { - LLNotificationsUtil::add("NoVoiceConnect-GIAB", args); - } + LLNotificationsUtil::add("NoVoiceConnect", args); mIsLoggingIn = false; return false; } - response_ok = false; account_login = false; send_login = true; - F32 timeout = pow(LOGIN_RETRY_TIMEOUT, static_cast<float>(loginRetryCount)) - 1.0f; + // an exponential backoff gets too long too quickly; stretch it out, but not too much + F32 timeout = loginRetryCount * LOGIN_ATTEMPT_TIMEOUT; - LL_INFOS("Voice") << "will retry login in " << timeout << " seconds." << LL_ENDL; + // tell the user there is a problem + LL_WARNS("Voice") << "login " << loginresp << " will retry login in " << timeout << " seconds." << LL_ENDL; + llcoro::suspendUntilTimeout(timeout); } else if (loginresp == "failed") @@ -1031,7 +1177,7 @@ void LLVivoxVoiceClient::logoutOfVivox(bool wait) LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("logout")) { @@ -1055,7 +1201,7 @@ bool LLVivoxVoiceClient::retrieveVoiceFonts() { result = llcoro::suspendUntilEventOn(voicePump); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("voice_fonts")) break; } while (true); @@ -1240,24 +1386,25 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession) { result = llcoro::suspendUntilEventOnWithTimeout(voicePump, SESSION_JOIN_TIMEOUT, timeoutResult); - LL_INFOS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_INFOS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("session")) { - if (result.has("handle")) + if (result.has("handle") && result["handle"] != mAudioSession->mHandle) { - if (result["handle"] != mAudioSession->mHandle) - { - LL_WARNS("Voice") << "Message for session handle \"" << result["handle"] << "\" while waiting for \"" << mAudioSession->mHandle << "\"." << LL_ENDL; - continue; - } + LL_WARNS("Voice") << "Message for session handle \"" << result["handle"] << "\" while waiting for \"" << mAudioSession->mHandle << "\"." << LL_ENDL; + continue; } std::string message = result["session"].asString(); if ((message == "added") || (message == "created")) + { added = true; + } else if (message == "joined") + { joined = true; + } else if ((message == "failed") || (message == "removed") || (message == "timeout")) { // we will get a removed message if a voice call is declined. @@ -1266,15 +1413,19 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession) int reason = result["reason"].asInteger(); LL_WARNS("Voice") << "Add and join failed for reason " << reason << LL_ENDL; - if ((reason == ERROR_VIVOX_NOT_LOGGED_IN) || - (reason == ERROR_VIVOX_OBJECT_NOT_FOUND)) + if ( (reason == ERROR_VIVOX_NOT_LOGGED_IN) + || (reason == ERROR_VIVOX_OBJECT_NOT_FOUND)) { LL_DEBUGS("Voice") << "Requesting reprovision and login." << LL_ENDL; requestRelog(); - } - + } } - + else + { + LL_WARNS("Voice") << "session '" << message << "' " + << LL_ENDL; + } + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); mIsJoiningSession = false; return false; @@ -1348,7 +1499,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait) { result = llcoro::suspendUntilEventOn(voicePump); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("session")) { if (result.has("handle")) @@ -1458,6 +1609,7 @@ bool LLVivoxVoiceClient::waitForChannel() } else if (sessionNeedsRelog(mNextAudioSession)) { + LL_INFOS("Voice") << "Session requesting reprovision and login." << LL_ENDL; requestRelog(); break; } @@ -1470,7 +1622,9 @@ bool LLVivoxVoiceClient::waitForChannel() } if (!mNextAudioSession) + { llcoro::suspendUntilTimeout(1.0); + } } while (mVoiceEnabled && !mRelogRequested); mIsProcessingChannels = false; @@ -1499,8 +1653,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session) notifyStatusObservers(LLVoiceClientStatusObserver::ERROR_UNKNOWN); if (mSessionTerminateRequested) + { terminateAudioSession(true); - + } // if a relog has been requested then addAndJoineSession // failed in a spectacular way and we need to back out. // If this is not the case then we were simply trying to @@ -1567,7 +1722,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session) mIsInitialized = true; LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent); if (!result.has("timeout")) // logging the timeout event spams the log - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; if (result.has("session")) { if (result.has("handle")) @@ -1635,7 +1790,7 @@ void LLVivoxVoiceClient::recordingAndPlaybackMode() do { command = llcoro::suspendUntilEventOn(voicePump); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(command) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(command) << LL_ENDL; } while (!command.has("recplay")); if (command["recplay"].asString() == "quit") @@ -1676,7 +1831,7 @@ int LLVivoxVoiceClient::voiceRecordBuffer() do { result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; } while (!result.has("recplay")); mCaptureBufferRecorded = true; @@ -1713,7 +1868,7 @@ int LLVivoxVoiceClient::voicePlaybackBuffer() notifyVoiceFontObservers(); result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult); - LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL; + LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL; } while (!result.has("recplay")); if (result["recplay"] == "playback") @@ -1858,7 +2013,8 @@ void LLVivoxVoiceClient::loginSendMessage() << "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>" << (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"") << "</Request>\n\n\n"; - + + LL_INFOS("Voice") << "Attempting voice login" << LL_ENDL; writeString(stream.str()); } @@ -1875,6 +2031,7 @@ void LLVivoxVoiceClient::logoutSendMessage() { if(mAccountLoggedIn) { + LL_INFOS("Voice") << "Attempting voice logout" << LL_ENDL; std::ostringstream stream; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">" @@ -1909,10 +2066,10 @@ void LLVivoxVoiceClient::sessionGroupCreateSendMessage() void LLVivoxVoiceClient::sessionCreateSendMessage(const sessionStatePtr_t &session, bool startAudio, bool startText) { - LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL; - S32 font_index = getVoiceFontIndex(session->mVoiceFontID); - LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; + LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI + << " with voice font: " << session->mVoiceFontID << " (" << font_index << ")" + << LL_ENDL; session->mCreateInProgress = true; if(startAudio) @@ -1990,10 +2147,10 @@ void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(const sessionStatePtr void LLVivoxVoiceClient::sessionMediaConnectSendMessage(const sessionStatePtr_t &session) { - LL_DEBUGS("Voice") << "Connecting audio to session handle: " << session->mHandle << LL_ENDL; - S32 font_index = getVoiceFontIndex(session->mVoiceFontID); - LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; + LL_DEBUGS("Voice") << "Connecting audio to session handle: " << session->mHandle + << " with voice font: " << session->mVoiceFontID << " (" << font_index << ")" + << LL_ENDL; session->mMediaConnectInProgress = true; @@ -2376,6 +2533,7 @@ void LLVivoxVoiceClient::daemonDied() void LLVivoxVoiceClient::giveUp() { // All has failed. Clean up and stop trying. + LL_WARNS("Voice") << "Terminating Voice Service" << LL_ENDL; closeSocket(); cleanUp(); } @@ -2504,9 +2662,16 @@ static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVe void LLVivoxVoiceClient::setHidden(bool hidden) { mHidden = hidden; - - sendPositionAndVolumeUpdate(); - return; + + if (mHidden && inSpatialChannel()) + { + // get out of the channel entirely + leaveAudioSession(); + } + else + { + sendPositionAndVolumeUpdate(); + } } void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void) @@ -2569,12 +2734,13 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void) << "<Y>" << u.mV[VY] << "</Y>" << "<Z>" << u.mV[VZ] << "</Z>" << "</UpOrientation>" - << "<LeftOrientation>" - << "<X>" << l.mV [VX] << "</X>" - << "<Y>" << l.mV [VY] << "</Y>" - << "<Z>" << l.mV [VZ] << "</Z>" - << "</LeftOrientation>"; - + << "<LeftOrientation>" + << "<X>" << l.mV [VX] << "</X>" + << "<Y>" << l.mV [VY] << "</Y>" + << "<Z>" << l.mV [VZ] << "</Z>" + << "</LeftOrientation>" + ; + stream << "</SpeakerPosition>"; stream << "<ListenerPosition>"; @@ -2612,7 +2778,6 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void) pos = earPosition; vel = earVelocity; -// LL_DEBUGS("Voice") << "Sending listener position " << earPosition << LL_ENDL; oldSDKTransform(l, u, a, pos, vel); @@ -2645,12 +2810,12 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void) << "<Y>" << u.mV[VY] << "</Y>" << "<Z>" << u.mV[VZ] << "</Z>" << "</UpOrientation>" - << "<LeftOrientation>" - << "<X>" << l.mV [VX] << "</X>" - << "<Y>" << l.mV [VY] << "</Y>" - << "<Z>" << l.mV [VZ] << "</Z>" - << "</LeftOrientation>"; - + << "<LeftOrientation>" + << "<X>" << l.mV [VX] << "</X>" + << "<Y>" << l.mV [VY] << "</Y>" + << "<Z>" << l.mV [VZ] << "</Z>" + << "</LeftOrientation>" + ; stream << "</ListenerPosition>"; @@ -2722,12 +2887,13 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void) } } } - + //sendLocalAudioUpdates(); obsolete, used to send volume setting on position updates - - if(!stream.str().empty()) + std::string update(stream.str()); + if(!update.empty()) { - writeString(stream.str()); + LL_DEBUGS("VoiceUpdate") << "sending update " << update << LL_ENDL; + writeString(update); } } @@ -2839,31 +3005,12 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st { LLSD result = LLSD::emptyMap(); - if(statusCode != 0) - { - LL_WARNS("Voice") << "Connector.Create response failure: " << statusString << LL_ENDL; - LLSD args; - std::stringstream errs; - errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; - args["HOSTID"] = errs.str(); - mTerminateDaemon = true; - if (LLGridManager::getInstance()->isSystemGrid()) - { - LLNotificationsUtil::add("NoVoiceConnect", args); - } - else - { - LLNotificationsUtil::add("NoVoiceConnect-GIAB", args); - } - - result["connector"] = LLSD::Boolean(false); - } - else + if(statusCode == 0) { // Connector created, move forward. if (connectorHandle == LLVivoxSecurity::getInstance()->connectorHandle()) { - LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << " connector handle " << connectorHandle << LL_ENDL; + LL_INFOS("Voice") << "Voice connector succeeded, Vivox SDK version is " << versionID << " connector handle " << connectorHandle << LL_ENDL; mVoiceVersion.serverVersion = versionID; mConnectorEstablished = true; mTerminateDaemon = false; @@ -2872,13 +3019,40 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st } else { - LL_WARNS("Voice") << "Connector.Create returned wrong handle " + // This shouldn't happen - we are somehow out of sync with SLVoice + // or possibly there are two things trying to run SLVoice at once + // or someone is trying to hack into it. + LL_WARNS("Voice") << "Connector returned wrong handle " << "(" << connectorHandle << ")" << " expected (" << LLVivoxSecurity::getInstance()->connectorHandle() << ")" << LL_ENDL; result["connector"] = LLSD::Boolean(false); + // Give up. + mTerminateDaemon = true; } } + else if (statusCode == 10028) // web request timeout prior to login + { + // this is usually fatal, but a long timeout might work + result["connector"] = LLSD::Boolean(false); + result["retry"] = LLSD::Real(CONNECT_ATTEMPT_TIMEOUT); + + LL_WARNS("Voice") << "Voice connection failed" << LL_ENDL; + } + else if (statusCode == 10006) // name resolution failure - a shorter retry may work + { + // some networks have slower DNS, but a short timeout might let it catch up + result["connector"] = LLSD::Boolean(false); + result["retry"] = LLSD::Real(CONNECT_DNS_TIMEOUT); + + LL_WARNS("Voice") << "Voice connection DNS lookup failed" << LL_ENDL; + } + else // unknown failure - give up + { + LL_WARNS("Voice") << "Voice connection failure ("<< statusCode << "): " << statusString << LL_ENDL; + mTerminateDaemon = true; + result["connector"] = LLSD::Boolean(false); + } LLEventPumps::instance().post("vivoxClientPump", result); } @@ -3010,7 +3184,7 @@ void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int stat // set the session info to reflect that the user is already connected. if (statusCode == 1026) { - session->mVoiceEnabled = true; + session->mVoiceActive = true; session->mMediaConnectInProgress = false; session->mMediaStreamState = streamStateConnected; //session->mTextStreamState = streamStateConnected; @@ -3341,21 +3515,31 @@ void LLVivoxVoiceClient::accountLoginStateChangeEvent( LLEventPumps::instance().post("vivoxClientPump", levent); break; - case 3: + case 2: + break; + + case 3: levent["login"] = LLSD::String("account_loggingOut"); LLEventPumps::instance().post("vivoxClientPump", levent); - break; + break; - case 0: + case 4: + break; + + case 100: + LL_WARNS("Voice") << "account state event error" << LL_ENDL; + break; + + case 0: levent["login"] = LLSD::String("account_logout"); LLEventPumps::instance().post("vivoxClientPump", levent); - break; - - default: + break; + + default: //Used to be a commented out warning - LL_DEBUGS("Voice") << "unknown state: " << state << LL_ENDL; + LL_WARNS("Voice") << "unknown account state event: " << state << LL_ENDL; break; } } @@ -3381,7 +3565,7 @@ void LLVivoxVoiceClient::mediaCompletionEvent(std::string &sessionGroupHandle, s } else { - LL_DEBUGS("Voice") << "Unknown MediaCompletionType: " << mediaCompletionType << LL_ENDL; + LL_WARNS("Voice") << "Unknown MediaCompletionType: " << mediaCompletionType << LL_ENDL; } if (!result.isUndefined()) @@ -3425,13 +3609,13 @@ void LLVivoxVoiceClient::mediaStreamUpdatedEvent( case streamStateDisconnecting: case streamStateIdle: // Standard "left audio session", Vivox state 'disconnected' - session->mVoiceEnabled = false; + session->mVoiceActive = false; session->mMediaConnectInProgress = false; leftAudioSession(session); break; case streamStateConnected: - session->mVoiceEnabled = true; + session->mVoiceActive = true; session->mMediaConnectInProgress = false; joinedAudioSession(session); case streamStateConnecting: // do nothing, but prevents a warning getting into the logs. @@ -4608,8 +4792,10 @@ bool LLVivoxVoiceClient::inSpatialChannel(void) bool result = false; if(mAudioSession) + { result = mAudioSession->mIsSpatial; - + } + return result; } @@ -4728,9 +4914,12 @@ void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLV mSpatialCoordsDirty = true; } - if ((mAvatarRot != rot) && (llabs(dot(mAvatarRot, rot)) > MINUSCULE_ANGLE_COS)) - { // if the two rotations are not exactly equal test their dot product - // to get the cos of the angle between them. If it is minuscule don't update. + // If the two rotations are not exactly equal test their dot product + // to get the cos of the angle between them. + // If it is too small, don't update. + F32 rot_cos_diff = llabs(dot(mAvatarRot, rot)); + if ((mAvatarRot != rot) && (rot_cos_diff < MINUSCULE_ANGLE_COS)) + { mAvatarRot = rot; mSpatialCoordsDirty = true; } @@ -4779,7 +4968,6 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled) mVoiceEnabled = enabled; LLVoiceClientStatusObserver::EStatusType status; - if (enabled) { LLVoiceChannel::getCurrentVoiceChannel()->activate(); @@ -5146,7 +5334,7 @@ LLVivoxVoiceClient::sessionState::sessionState() : mIsSpatial(false), mIsP2P(false), mIncoming(false), - mVoiceEnabled(false), + mVoiceActive(false), mReconnect(false), mVolumeDirty(false), mMuteDirty(false), @@ -5506,7 +5694,8 @@ void LLVivoxVoiceClient::deleteAllSessions() while (!mSessionsByHandle.empty()) { - deleteSession(mSessionsByHandle.begin()->second); + const sessionStatePtr_t session = mSessionsByHandle.begin()->second; + deleteSession(session); } } @@ -5855,7 +6044,7 @@ void LLVivoxVoiceClient::addVoiceFont(const S32 font_index, if (has_expired) { - LL_DEBUGS("Voice") << "Expired " << (template_font ? "Template " : "") + LL_DEBUGS("VoiceFont") << "Expired " << (template_font ? "Template " : "") << expiration_date.asString() << " " << font_id << " (" << font_index << ") " << name << LL_ENDL; @@ -5918,7 +6107,7 @@ void LLVivoxVoiceClient::addVoiceFont(const S32 font_index, } } - LL_DEBUGS("Voice") << (template_font ? "Template " : "") + LL_DEBUGS("VoiceFont") << (template_font ? "Template " : "") << font->mExpirationDate.asString() << " " << font->mID << " (" << font->mFontIndex << ") " << name << LL_ENDL; @@ -5934,11 +6123,11 @@ void LLVivoxVoiceClient::addVoiceFont(const S32 font_index, if (font_type < VOICE_FONT_TYPE_NONE || font_type >= VOICE_FONT_TYPE_UNKNOWN) { - LL_DEBUGS("Voice") << "Unknown voice font type: " << font_type << LL_ENDL; + LL_WARNS("VoiceFont") << "Unknown voice font type: " << font_type << LL_ENDL; } if (font_status < VOICE_FONT_STATUS_NONE || font_status >= VOICE_FONT_STATUS_UNKNOWN) { - LL_DEBUGS("Voice") << "Unknown voice font status: " << font_status << LL_ENDL; + LL_WARNS("VoiceFont") << "Unknown voice font status: " << font_status << LL_ENDL; } } } @@ -5982,7 +6171,7 @@ void LLVivoxVoiceClient::expireVoiceFonts() // Check for voice fonts that will expire in less that the warning time if (warning_timer.getStarted() && warning_timer.hasExpired()) { - LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL; will_expire = true; warning_timer.stop(); } @@ -6025,7 +6214,7 @@ void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id) { if (list_iter->second == id) { - LL_DEBUGS("Voice") << "Removing " << id << " from the voice font list." << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Removing " << id << " from the voice font list." << LL_ENDL; mVoiceFontList.erase(list_iter++); mVoiceFontListDirty = true; } @@ -6082,7 +6271,7 @@ S32 LLVivoxVoiceClient::getVoiceFontIndex(const LLUUID& id) const } else { - LL_DEBUGS("Voice") << "Selected voice font " << id << " is not available." << LL_ENDL; + LL_WARNS("VoiceFont") << "Selected voice font " << id << " is not available." << LL_ENDL; } } return result; @@ -6100,7 +6289,7 @@ S32 LLVivoxVoiceClient::getVoiceFontTemplateIndex(const LLUUID& id) const } else { - LL_DEBUGS("Voice") << "Selected voice font template " << id << " is not available." << LL_ENDL; + LL_WARNS("VoiceFont") << "Selected voice font template " << id << " is not available." << LL_ENDL; } } return result; @@ -6112,7 +6301,7 @@ void LLVivoxVoiceClient::accountGetSessionFontsSendMessage() { std::ostringstream stream; - LL_DEBUGS("Voice") << "Requesting voice font list." << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Requesting voice font list." << LL_ENDL; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetSessionFonts.1\">" @@ -6130,7 +6319,7 @@ void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage() { std::ostringstream stream; - LL_DEBUGS("Voice") << "Requesting voice font template list." << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Requesting voice font template list." << LL_ENDL; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetTemplateFonts.1\">" @@ -6145,7 +6334,7 @@ void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage() void LLVivoxVoiceClient::sessionSetVoiceFontSendMessage(const sessionStatePtr_t &session) { S32 font_index = getVoiceFontIndex(session->mVoiceFontID); - LL_DEBUGS("Voice") << "Requesting voice font: " << session->mVoiceFontID << " (" << font_index << "), session handle: " << session->mHandle << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Requesting voice font: " << session->mVoiceFontID << " (" << font_index << "), session handle: " << session->mHandle << LL_ENDL; std::ostringstream stream; @@ -6282,7 +6471,7 @@ void LLVivoxVoiceClient::updateVoiceMorphingMenu() } void LLVivoxVoiceClient::notifyVoiceFontObservers() { - LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL; + LL_DEBUGS("VoiceFont") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL; updateVoiceMorphingMenu(); @@ -6505,7 +6694,6 @@ void LLVivoxProtocolParser::reset() isModeratorMuted = false; isSpeaking = false; participantType = 0; - squelchDebugOutput = false; returnCode = -1; state = 0; statusCode = 0; @@ -6558,12 +6746,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl( XML_SetUserData(parser, this); XML_Parse(parser, mInput.data() + start, delim - start, false); - // If this message isn't set to be squelched, output the raw XML received. - if(!squelchDebugOutput) - { - LL_DEBUGS("Voice") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL; - } - + LL_DEBUGS("VivoxProtocolParser") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL; start = delim + 3; } @@ -6941,13 +7124,12 @@ void LLVivoxProtocolParser::processResponse(std::string tag) if (isEvent) { const char *eventTypeCstr = eventTypeString.c_str(); -// LL_WARNS("LOW Voice") << eventTypeCstr << LL_ENDL; + LL_DEBUGS("LOW Voice") << eventTypeCstr << LL_ENDL; if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) { // These happen so often that logging them is pretty useless. - squelchDebugOutput = true; -// LL_WARNS("LOW Voice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL; + LL_DEBUGS("LOW Voice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); } else if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent")) @@ -7016,7 +7198,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag) <ParticipantType>0</ParticipantType> </Event> */ -// LL_WARNS("LOW Voice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL; + LL_DEBUGS("LOW Voice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType); } else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent")) @@ -7029,14 +7211,13 @@ void LLVivoxProtocolParser::processResponse(std::string tag) <AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName> </Event> */ -// LL_WARNS("LOW Voice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL; + LL_DEBUGS("LOW Voice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString); } else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent")) { // These are really spammy in tuning mode - squelchDebugOutput = true; LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy); } else if (!stricmp(eventTypeCstr, "MessageEvent")) @@ -7097,12 +7278,11 @@ void LLVivoxProtocolParser::processResponse(std::string tag) else { const char *actionCstr = actionString.c_str(); -// LL_WARNS("LOW Voice") << actionCstr << LL_ENDL; + LL_DEBUGS("LOW Voice") << actionCstr << LL_ENDL; if (!stricmp(actionCstr, "Session.Set3DPosition.1")) { - // We don't need to process these, but they're so spammy we don't want to log them. - squelchDebugOutput = true; + // We don't need to process these } else if (!stricmp(actionCstr, "Connector.Create.1")) { |