diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-05-13 00:51:28 +0300 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-05-13 00:51:28 +0300 | 
| commit | 9626649f902cd9d5d7cbf1e8fbbd81a2952706c8 (patch) | |
| tree | 867b1a66e2d41398b206cb59225615c3d1e0db2b | |
| parent | 07456abe92ab24f373b238f6bd64087c078b7fc3 (diff) | |
| parent | 0dd53d7b5b934ee4fdc312f26ec58530f5b45091 (diff) | |
Merge branch 'DRTVWR-533' into DRTVWR-516-maint
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 48 | ||||
| -rw-r--r-- | indra/newview/llvoicevivox.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/llvoicevivox.h | 7 | 
3 files changed, 148 insertions, 5 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 87bf9e5083..a3f54def1c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -14412,7 +14412,53 @@        <key>Value</key>        <integer>44125</integer>      </map> -    <key>VoiceCallsFriendsOnly</key> + +  <key>VivoxVadAuto</key> +  <map> +    <key>Comment</key> +    <string>A flag indicating if the automatic VAD is enabled (1) or disabled (0). The individual settings are ignored if the auto-mode is enabled</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>VivoxVadHangover</key> +  <map> +    <key>Comment</key> +    <string>The time (in milliseconds) that it takes or the VAD to switch back to silence from speech mode after the last speech frame has been detected</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>2000</integer> +  </map> +  <key>VivoxVadNoiseFloor</key> +  <map> +    <key>Comment</key> +    <string>A dimensionless value between 0 and 20000 (default 576) that controls the maximum level at which the noise floor may be set at by the VAD's noise tracking</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>576</integer> +  </map> +  <key>VivoxVadSensitivity</key> +  <map> +    <key>Comment</key> +    <string> +      A dimensionless value between 0 and 100, indicating the 'sensitivity of the VAD'. Increasing this value corresponds to decreasing the sensitivity of the VAD and 0 is turned off altogether</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>VoiceCallsFriendsOnly</key>      <map>        <key>Comment</key>        <string>(Deprecated) Only accept voice calls from residents on your friends list</string> diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index f9ffefd4a2..0503ba3f94 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -652,7 +652,6 @@ void LLVivoxVoiceClient::idle(void* user_data)  {  } -  //=========================================================================  // the following are methods to support the coroutine implementation of the   // voice connection and processing.  They should only be called in the context  @@ -684,7 +683,22 @@ void LLVivoxVoiceClient::voiceControlCoro()          bool success = startAndConnectSession();          if (success)          { -            if (mTuningMode) +			// enable/disable the automatic VAD and explicitly set the initial values of  +			// the VAD variables ourselves when it is off - see SL-15072 for more details +			// note: we set the other parameters too even if the auto VAD is on which is ok +			unsigned int vad_auto = gSavedSettings.getU32("VivoxVadAuto"); +			unsigned int vad_hangover = gSavedSettings.getU32("VivoxVadHangover"); +			unsigned int vad_noise_floor = gSavedSettings.getU32("VivoxVadNoiseFloor"); +			unsigned int vad_sensitivity = gSavedSettings.getU32("VivoxVadSensitivity"); +			setupVADParams(vad_auto, vad_hangover, vad_noise_floor, vad_sensitivity); +			 +			// watch for changes to the VAD settings via Debug Settings UI and act on them accordingly +			gSavedSettings.getControl("VivoxVadAuto")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this)); +			gSavedSettings.getControl("VivoxVadHangover")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this)); +			gSavedSettings.getControl("VivoxVadNoiseFloor")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this)); +			gSavedSettings.getControl("VivoxVadSensitivity")->getSignal()->connect(boost::bind(&LLVivoxVoiceClient::onVADSettingsChange, this)); + +			if (mTuningMode)              {                  performMicTuning();              } @@ -731,7 +745,6 @@ void LLVivoxVoiceClient::voiceControlCoro()      LL_INFOS("Voice") << "exiting" << LL_ENDL;  } -  bool LLVivoxVoiceClient::startAndConnectSession()  {      bool ok = false; @@ -3230,6 +3243,73 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()  	}  } +/** + * Because of the recurring voice cutout issues (SL-15072) we are going to try + * to disable the automatic VAD (Voice Activity Detection) and set the associated + * parameters directly. We will expose them via Debug Settings and that should + * let us iterate on a collection of values that work for us. Hopefully!  + * + * From the VIVOX Docs: + * + * VadAuto: A flag indicating if the automatic VAD is enabled (1) or disabled (0) + * + * VadHangover: The time (in milliseconds) that it takes + * for the VAD to switch back to silence from speech mode after the last speech + * frame has been detected. + * + * VadNoiseFloor: A dimensionless value between 0 and  + * 20000 (default 576) that controls the maximum level at which the noise floor + * may be set at by the VAD's noise tracking. Too low of a value will make noise + * tracking ineffective (A value of 0 disables noise tracking and the VAD then  + * relies purely on the sensitivity property). Too high of a value will make  + * long speech classifiable as noise. + * + * VadSensitivity: A dimensionless value between 0 and  + * 100, indicating the 'sensitivity of the VAD'. Increasing this value corresponds + * to decreasing the sensitivity of the VAD (i.e. '0' is most sensitive,  + * while 100 is 'least sensitive') + */ +void LLVivoxVoiceClient::setupVADParams(unsigned int vad_auto, +                                        unsigned int vad_hangover, +                                        unsigned int vad_noise_floor, +                                        unsigned int vad_sensitivity) +{ +    std::ostringstream stream; + +    LL_INFOS("Voice") << "Setting the automatic VAD to " +        << (vad_auto ? "True" : "False") +		<< " and discrete values to" +		<< " VadHangover = " << vad_hangover +		<< ", VadSensitivity = " << vad_sensitivity +		<< ", VadNoiseFloor = " << vad_noise_floor +        << LL_ENDL; + +	// Create a request to set the VAD parameters: +	stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetVadProperties.1\">" +               << "<VadAuto>" << vad_auto << "</VadAuto>" +               << "<VadHangover>" << vad_hangover << "</VadHangover>" +               << "<VadSensitivity>" << vad_sensitivity << "</VadSensitivity>" +               << "<VadNoiseFloor>" << vad_noise_floor << "</VadNoiseFloor>" +           << "</Request>\n\n\n"; + +    if (!stream.str().empty()) +    { +        writeString(stream.str()); +    } +} + +void LLVivoxVoiceClient::onVADSettingsChange() +{ +	// pick up the VAD variables (one of which was changed) +	unsigned int vad_auto = gSavedSettings.getU32("VivoxVadAuto"); +	unsigned int vad_hangover = gSavedSettings.getU32("VivoxVadHangover"); +	unsigned int vad_noise_floor = gSavedSettings.getU32("VivoxVadNoiseFloor"); +	unsigned int vad_sensitivity = gSavedSettings.getU32("VivoxVadSensitivity"); + +	// build a VAD params change request and send it to SLVoice +	setupVADParams(vad_auto, vad_hangover, vad_noise_floor, vad_sensitivity); +} +  /////////////////////////////  // Response/Event handlers @@ -7582,6 +7662,18 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		{  			LLVivoxVoiceClient::getInstance()->accountGetTemplateFontsResponse(statusCode, statusString);  		} +		else if (!stricmp(actionCstr, "Aux.SetVadProperties.1")) +		{ +			// both values of statusCode (old and more recent) indicate valid requests +			if (statusCode != 0 && statusCode != 200) +			{ +				LL_WARNS("Voice") << "Aux.SetVadProperties.1 request failed: " +					<< "statusCode: " << statusCode +					<< " and " +					<< "statusString: " << statusString +					<< LL_ENDL; +			} +		}  		/*  		 else if (!stricmp(actionCstr, "Account.ChannelGetList.1"))  		 { diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 699c85066b..75ff5429f3 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -446,7 +446,6 @@ protected:  	// local audio updates, mic mute, speaker mute, mic volume and speaker volumes  	void sendLocalAudioUpdates(); -  	/////////////////////////////  	// Response/Event handlers  	void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID); @@ -473,6 +472,12 @@ protected:  	void muteListChanged();  	///////////////////////////// +	// VAD changes +	// disable auto-VAD and configure VAD parameters explicitly +	void setupVADParams(unsigned int vad_auto, unsigned int vad_hangover, unsigned int vad_noise_floor, unsigned int vad_sensitivity); +	void onVADSettingsChange(); + +	/////////////////////////////  	// Sending updates of current state  	void updatePosition(void);  	void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); | 
