diff options
23 files changed, 169 insertions, 285 deletions
| diff --git a/autobuild.xml b/autobuild.xml index c47661df18..860f0c4caa 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -412,11 +412,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>f6835c4d7745cd1cadfbce47b40331d08affb532</string> +              <string>e03eb77224290c875ff84f75b7fe3d0e7c162c94</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/3p-dictionaries/releases/download/v1.0.1-dev2.gf887629-f887629/dictionaries-common-None.tar.zst</string> +              <string>https://github.com/secondlife/3p-dictionaries/releases/download/v1-a01bb6c/dictionaries-1.a01bb6c-common-a01bb6c.tar.zst</string>              </map>              <key>name</key>              <string>common</string> @@ -429,7 +429,7 @@          <key>copyright</key>          <string>Copyright 2014 Apache OpenOffice software</string>          <key>version</key> -        <string>None</string> +        <string>1.a01bb6c</string>          <key>name</key>          <string>dictionaries</string>          <key>description</key> @@ -720,11 +720,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>6604c1cca515d287e697997a8d5593d1cae172a9</string> +              <string>066625e7aa7f697a4b6cd461aad960c57181011f</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/3p-glh_linear/releases/download/v1.0.1-dev2.g3253ed7-3253ed7/glh_linear-common-None.tar.zst</string> +              <string>https://github.com/secondlife/3p-glh_linear/releases/download/v1.0.1-dev4-984c397/glh_linear-1.0.1-dev4-common-984c397.tar.zst</string>              </map>              <key>name</key>              <string>common</string> @@ -737,7 +737,7 @@          <key>copyright</key>          <string>Copyright (c) 2000 Cass Everitt</string>          <key>version</key> -        <string>None</string> +        <string>1.0.1-dev4</string>          <key>name</key>          <string>glh_linear</string>          <key>description</key> @@ -852,11 +852,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>a193ff65d6db48626d65d96c6124c6efca85e8ec</string> +              <string>ae2c2a215b1bc2e3f37a67e301926dc405902d1a</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/3p-havok-source/releases/assets/108912596</string> +              <string>https://api.github.com/repos/secondlife/3p-havok-source/releases/assets/136778143</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -880,11 +880,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>ebfb82b6143874e7938b9d1e8a70d0a2e28aa818</string> +              <string>0393dd75c58f7046bed47e62a8884a78cb02a5c3</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/3p-havok-source/releases/assets/108912599</string> +              <string>https://api.github.com/repos/secondlife/3p-havok-source/releases/assets/136778145</string>              </map>              <key>name</key>              <string>windows64</string> @@ -1030,11 +1030,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>bcc7e2c34896fc9cbc41828dee8a4ddf54f10453</string> +              <string>ad72fa1d103df777906f0d98f3e882b9916aeada</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/108298968</string> +              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/136774118</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1046,11 +1046,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>9de772df2ed12e9c742df6c90670c7cbbb9c93a6</string> +              <string>e46e4ac93a237b5c4a14183766f76ba5d58935a2</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/108298969</string> +              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/136774125</string>              </map>              <key>name</key>              <string>linux64</string> @@ -1062,15 +1062,31 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>92533ff0f8c1881ad85e75800f9072c413ccf7b7</string> +              <string>bb37557f78c72b26580a521f8b8dabfa1b34e6e6</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/108298970</string> +              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/136774126</string>              </map>              <key>name</key>              <string>windows64</string>            </map> +          <key>linux</key> +          <map> +            <key>archive</key> +            <map> +              <key>creds</key> +              <string>github</string> +              <key>hash</key> +              <string>711b82f9f588d3a125af7dcd8c81f93d9c343a7d</string> +              <key>hash_algorithm</key> +              <string>sha1</string> +              <key>url</key> +              <string>https://api.github.com/repos/secondlife/3p-kdu/releases/assets/136774121</string> +            </map> +            <key>name</key> +            <string>linux</string> +          </map>          </map>          <key>license</key>          <string>Kakadu</string> @@ -1079,7 +1095,7 @@          <key>copyright</key>          <string>Kakadu software</string>          <key>version</key> -        <string>7.10.4.539108</string> +        <string>7.10.4.4b9ec5f</string>          <key>name</key>          <string>kdu</string>          <key>description</key> @@ -1378,11 +1394,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>e50ea94bbaa4ff41bf53b84b7192df1a694c5337</string> +              <string>a9503e1b4e1d9790cf29d18a3d9ab39e6a515679</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/llca/releases/download/v202310121525.0-d22bd98/llca-202310121530.0-common-d22bd98.tar.zst</string> +              <string>https://github.com/secondlife/llca/releases/download/v202402012004.0-0f5d9c3/llca-202402012004.0-common-0f5d9c3.tar.zst</string>              </map>              <key>name</key>              <string>common</string> @@ -1644,6 +1660,18 @@        </map>        <key>mikktspace</key>        <map> +        <key>canonical_repo</key> +        <string>https://bitbucket.org/lindenlab/3p-mikktspace</string> +        <key>copyright</key> +        <string>Copyright (C) 2011 by Morten S. Mikkelsen, Copyright (C) 2022 Blender Authors</string> +        <key>description</key> +        <string>Mikktspace Tangent Generator</string> +        <key>license</key> +        <string>Apache 2.0</string> +        <key>license_file</key> +        <string>mikktspace.txt</string> +        <key>name</key> +        <string>mikktspace</string>          <key>platforms</key>          <map>            <key>darwin64</key> @@ -1689,20 +1717,8 @@              <string>windows64</string>            </map>          </map> -        <key>license</key> -        <string>Apache 2.0</string> -        <key>license_file</key> -        <string>mikktspace.txt</string> -        <key>copyright</key> -        <string>Copyright (C) 2011 by Morten S. Mikkelsen, Copyright (C) 2022 Blender Authors</string>          <key>version</key>          <string>1</string> -        <key>name</key> -        <string>mikktspace</string> -        <key>canonical_repo</key> -        <string>https://bitbucket.org/lindenlab/3p-mikktspace</string> -        <key>description</key> -        <string>Mikktspace Tangent Generator</string>        </map>        <key>minizip-ng</key>        <map> @@ -2351,9 +2367,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>4dad1c0948141e1667c01a3ee755e4dc</string> +              <string>2c47ae2d0c38c86b8c2db8d9317f0ab15edfc74f</string> +              <key>hash_algorithm</key> +              <string>sha1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105849/926137/tinygltf-v2.5.0-common-575729.tar.bz2</string> +              <string>https://github.com/secondlife/3p-tinygltf/releases/download/v2.5.0-1ae57fd/tinygltf-v2.5.0-common-1ae57fd.tar.zst</string>              </map>              <key>name</key>              <string>common</string> @@ -2387,9 +2405,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>9b6e1a1f4b0969d38a1ca8ee00aeb548</string> +              <string>49650353442698c3e05102676fe427d0ebe02f0b</string> +              <key>hash_algorithm</key> +              <string>sha1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110584/960613/tracy-v0.8.1.578241-darwin64-578241.tar.bz2</string> +              <string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2399,11 +2419,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>05b72ae5d733aed7d3bf142287601cc6</string> +              <string>2b80e7407e4f3e82eff3879add0e9ad63e7fcace</string>                <key>hash_algorithm</key> -              <string>md5</string> +              <string>sha1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110586/960637/tracy-v0.8.1.578241-windows64-578241.tar.bz2</string> +              <string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst</string>              </map>              <key>name</key>              <string>windows64</string> @@ -2416,7 +2436,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <key>copyright</key>          <string>Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl)</string>          <key>version</key> -        <string>v0.8.1.578241</string> +        <string>v0.8.1-eecbf72</string>          <key>name</key>          <string>tracy</string>          <key>canonical_repo</key> @@ -2615,8 +2635,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <string>LICENSE</string>          <key>copyright</key>          <string>Copyright (c) 2000-2012, Linden Research, Inc.</string> -        <key>version</key> -        <string>3.0-f14b5ec</string>          <key>name</key>          <string>viewer-manager</string>          <key>description</key> @@ -2625,6 +2643,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <string>https://bitbucket.org/lindenlab/vmp-standalone</string>          <key>source_type</key>          <string>hg</string> +        <key>version</key> +        <string>3.0-f14b5ec</string>        </map>        <key>vlc-bin</key>        <map> @@ -2734,51 +2754,29 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>        <map>          <key>platforms</key>          <map> -          <key>darwin64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>8cff2060843db3db788511ee34a8e8cc</string> -              <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2</string> -            </map> -            <key>name</key> -            <string>darwin64</string> -          </map> -          <key>windows</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>58eea384be49ba756ce9c5e66669540b</string> -              <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2</string> -            </map> -            <key>name</key> -            <string>windows</string> -          </map> -          <key>windows64</key> +          <key>common</key>            <map>              <key>archive</key>              <map>                <key>hash</key> -              <string>79b6a11622c2f83cfc2b7cd1fafb867b</string> +              <string>8e365eff8dcace48d91e2530f8b13e420849aefc</string> +              <key>hash_algorithm</key> +              <string>sha1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2</string> +              <string>https://github.com/secondlife/3p-vulkan-gltf-pbr/releases/download/v1.0.0-d7c372f/vulkan_gltf-1.0.0-common-d7c372f.tar.zst</string>              </map>              <key>name</key> -            <string>windows64</string> +            <string>common</string>            </map>          </map>          <key>license</key>          <string>Copyright (c) 2018 Sascha Willems</string>          <key>license_file</key> -        <string>LICENSES/vulkan_gltf.txt</string> +        <string>vulkan_gltf.txt</string>          <key>copyright</key>          <string>Copyright (c) 2018 Sascha Willems</string>          <key>version</key> -        <string>1</string> +        <string>1.0.0</string>          <key>name</key>          <string>vulkan_gltf</string>          <key>canonical_repo</key> @@ -2861,54 +2859,14 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>e4f77ba0a9b8ec3cc3fabc51c4da81d2</string> -              <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110070/956941/xxhash-0.8.1.578006-windows-578006.tar.bz2</string> -            </map> -            <key>name</key> -            <string>common</string> -          </map> -          <key>darwin64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>fdcc803a76a3359bb426db7dac161406676d51e7</string> -              <key>hash_algorithm</key> -              <string>sha1</string> -              <key>url</key> -              <string>https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-darwin64-7501c90.tar.zst</string> -            </map> -            <key>name</key> -            <string>darwin64</string> -          </map> -          <key>linux64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>7acb3f94a549fbb9bd7bc16604e34f33c5365a9b</string> +              <string>1a73c476b371b62066d1c3eced249660e9467e53</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-linux64-7501c90.tar.zst</string> +              <string>https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-69ff69a/xxhash-0.8.1-69ff69a-common-69ff69a.tar.zst</string>              </map>              <key>name</key> -            <string>linux64</string> -          </map> -          <key>windows64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>4522d075ea4703ef4b527c3039864ef735ea7953</string> -              <key>hash_algorithm</key> -              <string>sha1</string> -              <key>url</key> -              <string>https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-windows64-7501c90.tar.zst</string> -            </map> -            <key>name</key> -            <string>windows64</string> +            <string>common</string>            </map>          </map>          <key>license</key> @@ -2918,7 +2876,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <key>copyright</key>          <string>Copyright (c) 2012-2021 Yann Collet</string>          <key>version</key> -        <string>0.8.1.7501c90</string> +        <string>0.8.1-69ff69a</string>          <key>name</key>          <string>xxhash</string>          <key>description</key> diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 92a2827d73..d5bd913315 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -35,6 +35,7 @@  #include "api/media_stream_interface.h"  #include "api/media_stream_track.h"  #include "modules/audio_processing/audio_buffer.h" +#include "modules/audio_mixer/audio_mixer_impl.h"  namespace llwebrtc  { @@ -88,7 +89,7 @@ void LLAudioDeviceObserver::OnRenderData(const void    *audio_samples,  {  } -LLCustomProcessor::LLCustomProcessor() : mSampleRateHz(0), mNumChannels(0), mMicrophoneEnergy(0.0) +LLCustomProcessor::LLCustomProcessor() : mSampleRateHz(0), mNumChannels(0), mMicrophoneEnergy(0.0), mGain(1.0)  {      memset(mSumVector, 0, sizeof(mSumVector));  } @@ -128,9 +129,13 @@ void LLCustomProcessor::Process(webrtc::AudioBuffer *audio_in)      for (size_t index = 0; index < stream_config.num_samples(); index++)      {          float sample = frame_samples[index]; +        sample       = sample * mGain; // apply gain +        frame_samples[index] = sample; // write processed sample back to buffer.          energy += sample * sample;      } +    audio_in->CopyFrom(&frame[0], stream_config); +      // smooth it.      size_t buffer_size = sizeof(mSumVector) / sizeof(mSumVector[0]);      float  totalSum    = 0; @@ -236,9 +241,9 @@ void LLWebRTCImpl::init()      webrtc::AudioProcessing::Config apm_config;      apm_config.echo_canceller.enabled         = false;      apm_config.echo_canceller.mobile_mode     = false; -    apm_config.gain_controller1.enabled       = true; +    apm_config.gain_controller1.enabled       = false;      apm_config.gain_controller1.mode          = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog; -    apm_config.gain_controller2.enabled       = true; +    apm_config.gain_controller2.enabled       = false;      apm_config.high_pass_filter.enabled       = true;      apm_config.noise_suppression.enabled      = true;      apm_config.noise_suppression.level        = webrtc::AudioProcessing::Config::NoiseSuppression::kVeryHigh; @@ -260,6 +265,7 @@ void LLWebRTCImpl::init()      mAudioProcessingModule->ApplyConfig(apm_config);      mAudioProcessingModule->Initialize(processing_config); +      mPeerConnectionFactory = webrtc::CreatePeerConnectionFactory(mNetworkThread.get(),                                                                   mWorkerThread.get(),                                                                   mSignalingThread.get(), @@ -336,9 +342,9 @@ void LLWebRTCImpl::setAudioConfig(LLWebRTCDeviceInterface::AudioConfig config)      webrtc::AudioProcessing::Config apm_config;      apm_config.echo_canceller.enabled         = config.mEchoCancellation;      apm_config.echo_canceller.mobile_mode     = false; -    apm_config.gain_controller1.enabled       = true; +    apm_config.gain_controller1.enabled       = config.mAGC;      apm_config.gain_controller1.mode          = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog; -    apm_config.gain_controller2.enabled       = true; +    apm_config.gain_controller2.enabled       = false;      apm_config.high_pass_filter.enabled       = true;      apm_config.transient_suppression.enabled  = true;      apm_config.pipeline.multi_channel_render  = true; @@ -452,7 +458,7 @@ void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceMo      {          device_module->SetPlayoutDevice(webrtc::AudioDeviceModule::kDefaultDevice);      } -    else +    else       {          device_module->SetPlayoutDevice(device);      } @@ -612,6 +618,8 @@ float LLWebRTCImpl::getTuningAudioLevel() { return -20 * log10f(mTuningAudioDevi  float LLWebRTCImpl::getPeerConnectionAudioLevel() { return -20 * log10f(mPeerCustomProcessor->getMicrophoneEnergy()); } +void LLWebRTCImpl::setPeerConnectionGain(float gain) { mPeerCustomProcessor->setGain(gain); } +  //  // Peer Connection Helpers @@ -648,7 +656,7 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn  // Most peer connection (signaling) happens on  // the signaling thread. -LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() : +LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :       mWebRTCImpl(nullptr),      mPeerConnection(nullptr),      mMute(false), @@ -937,7 +945,7 @@ void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)              {                  for (auto &track : mLocalStream->GetAudioTracks())                  { -                    track->GetSource()->SetVolume(volume); +                    track->GetSource()->SetVolume(volume*5.0);                  }              }          }); @@ -1163,7 +1171,7 @@ void LLWebRTCPeerConnectionImpl::OnSuccess(webrtc::SessionDescriptionInterface *      {          observer->OnOfferAvailable(mangled_sdp);      } - +         mPeerConnection->SetLocalDescription(std::unique_ptr<webrtc::SessionDescriptionInterface>(                                                       webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, mangled_sdp)),                                                   rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this)); diff --git a/indra/llwebrtc/llwebrtc.h b/indra/llwebrtc/llwebrtc.h index b0b47bacc1..f447ea990a 100644 --- a/indra/llwebrtc/llwebrtc.h +++ b/indra/llwebrtc/llwebrtc.h @@ -129,7 +129,7 @@ class LLWebRTCDeviceInterface      };      virtual void setAudioConfig(AudioConfig config) = 0; - +          // instructs webrtc to refresh the device list.      virtual void refreshDevices() = 0; @@ -145,6 +145,7 @@ class LLWebRTCDeviceInterface      virtual void setTuningMode(bool enable) = 0;      virtual float getTuningAudioLevel() = 0; // for use during tuning      virtual float getPeerConnectionAudioLevel() = 0; // for use when not tuning +    virtual void setPeerConnectionGain(float gain) = 0;  };  // LLWebRTCAudioInterface provides the viewer with a way @@ -230,7 +231,7 @@ class LLWebRTCSignalingObserver  class LLWebRTCPeerConnectionInterface  {    public: - +          struct InitOptions      {          // equivalent of PeerConnectionInterface::IceServer diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h index cb54e83a63..6672f8ce90 100644 --- a/indra/llwebrtc/llwebrtc_impl.h +++ b/indra/llwebrtc/llwebrtc_impl.h @@ -121,6 +121,8 @@ class LLCustomProcessor : public webrtc::CustomProcessing      float getMicrophoneEnergy() { return mMicrophoneEnergy; } +    void setGain(float gain) { mGain = gain; } +    protected:      static const int NUM_PACKETS_TO_FILTER = 30;  // 300 ms of smoothing      int              mSampleRateHz; @@ -128,6 +130,7 @@ class LLCustomProcessor : public webrtc::CustomProcessing      float mSumVector[NUM_PACKETS_TO_FILTER];      float mMicrophoneEnergy; +    float mGain;  }; @@ -160,6 +163,8 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS      float getTuningAudioLevel() override;      float getPeerConnectionAudioLevel() override; +    void setPeerConnectionGain(float gain) override; +      //      // AudioDeviceSink      // @@ -230,7 +235,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS      // The factory that allows creation of native webrtc PeerConnections.      rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory; - +          rtc::scoped_refptr<webrtc::AudioProcessing>                mAudioProcessingModule;      // more native webrtc stuff diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 72edbaebe1..05b1fec8e5 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3412,11 +3412,11 @@ LLUUID LLIMMgr::addSession(          ((IM_NOTHING_SPECIAL == dialog) || (IM_SESSION_P2P_INVITE == dialog) || (IM_SESSION_CONFERENCE_START == dialog)) &&          ids.size())      { -        LLIMModel::LLIMSession* ad_hoc_found = LLIMModel::getInstance()->findAdHocIMSession(ids); -        if (ad_hoc_found) +        session = LLIMModel::getInstance()->findAdHocIMSession(ids); +        if (session)          {              new_session = false; -            session_id = ad_hoc_found->mSessionID; +            session_id = session->mSessionID;          }      } @@ -3852,7 +3852,7 @@ bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection dir  {      LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);      if (!voice_channel) return false; -    if (!voice_channel_info.isUndefined()) +    if (voice_channel_info.isDefined() && voice_channel_info.isMap() && voice_channel_info.size() > 0)      {          voice_channel->setChannelInfo(voice_channel_info);      } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 7e58a604f6..9a9a316adf 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -9481,15 +9481,6 @@ class LLUpdateMembershipLabel : public view_listener_t      }  }; -void handle_voice_morphing_subscribe() -{ -    LLWeb::loadURL(LLTrans::getString("voice_morphing_url")); -} - -void handle_premium_voice_morphing_subscribe() -{ -    LLWeb::loadURL(LLTrans::getString("premium_voice_morphing_url")); -}  class LLToggleUIHints : public view_listener_t  { @@ -9690,16 +9681,6 @@ void initialize_menus()      //Communicate Nearby chat      view_listener_t::addMenu(new LLCommunicateNearbyChat(), "Communicate.NearbyChat"); -    // Communicate > Voice morphing > Subscribe... -    commit.add("Communicate.VoiceMorphing.Subscribe", boost::bind(&handle_voice_morphing_subscribe)); -    // Communicate > Voice morphing > Premium perk... -    commit.add("Communicate.VoiceMorphing.PremiumPerk", boost::bind(&handle_premium_voice_morphing_subscribe)); -    LLVivoxVoiceClient * voice_clientp = LLVivoxVoiceClient::getInstance(); -    enable.add("Communicate.VoiceMorphing.NoVoiceMorphing.Check" -        , boost::bind(&LLVivoxVoiceClient::onCheckVoiceEffect, voice_clientp, "NoVoiceMorphing")); -    commit.add("Communicate.VoiceMorphing.NoVoiceMorphing.Click" -        , boost::bind(&LLVivoxVoiceClient::onClickVoiceEffect, voice_clientp, "NoVoiceMorphing")); -      // World menu      view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");      view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark"); diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index b665eb69a2..b95e43da8d 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -96,7 +96,7 @@ void LLVoiceChannel::setChannelInfo(const LLSD &channelInfo)      if (mState == STATE_NO_CHANNEL_INFO)      { -        if (mChannelInfo.isUndefined()) +        if (mChannelInfo.isUndefined() || !mChannelInfo.isMap() || mChannelInfo.size() == 0)          {              LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);              LL_WARNS("Voice") << "Received empty channel info for channel " << mSessionName << LL_ENDL; @@ -122,7 +122,7 @@ void LLVoiceChannel::onChange(EStatusType type, const LLSD& channelInfo, bool pr  {      LL_DEBUGS("Voice") << "Incoming channel info: " << channelInfo << LL_ENDL;      LL_DEBUGS("Voice") << "Current channel info: " << mChannelInfo << LL_ENDL; -    if (mChannelInfo.isUndefined()) +    if (mChannelInfo.isUndefined() || (mChannelInfo.isMap() && mChannelInfo.size() == 0))      {          mChannelInfo = channelInfo;      } @@ -477,7 +477,7 @@ void LLVoiceChannelGroup::setChannelInfo(const LLSD& channelInfo)      if (mState == STATE_NO_CHANNEL_INFO)      { -        if(!mChannelInfo.isUndefined()) +        if(mChannelInfo.isDefined() && mChannelInfo.isMap())          {              setState(STATE_READY); @@ -676,9 +676,9 @@ void LLVoiceChannelProximal::activate()          // we're connected to a non-spatial channel, so disconnect.          LLVoiceClient::getInstance()->leaveNonSpatialChannel();      } +      LLVoiceClient::getInstance()->activateSpatialChannel(true);      LLVoiceChannel::activate(); -  }  void LLVoiceChannelProximal::onChange(EStatusType type, const LLSD& channelInfo, bool proximal) @@ -751,7 +751,7 @@ void LLVoiceChannelProximal::deactivate()      {          setState(STATE_HUNG_UP);      } - +    LLVoiceClient::getInstance()->removeObserver(this);      LLVoiceClient::getInstance()->activateSpatialChannel(false);  } @@ -907,7 +907,7 @@ void LLVoiceChannelP2P::setChannelInfo(const LLSD& channel_info)      }      mReceivedCall = true; -    if (!channel_info.isUndefined()) +    if (channel_info.isDefined() && channel_info.isMap())      {          mIncomingCallInterface = LLVoiceClient::getInstance()->getIncomingCallInterface(channel_info);      } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 74c6d611a8..891c9383bf 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -139,6 +139,7 @@ LLVoiceClient::LLVoiceClient(LLPumpIO *pump)      m_servicePump(NULL),      mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled", true)),      mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault", "00000000-0000-0000-0000-000000000000")), +    mVoiceEffectSupportNotified(false),      mPTTDirty(true),      mPTT(true),      mUsePTT(true), @@ -569,11 +570,37 @@ void LLVoiceClient::setMicGain(F32 gain)  //------------------------------------------  // enable/disable voice features +// static +bool LLVoiceClient::onVoiceEffectsNotSupported(const LLSD ¬ification, const LLSD &response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    switch (option) +    { +        case 0:  // "Okay" +            gSavedPerAccountSettings.setString("VoiceEffectDefault", LLUUID::null.asString()); +            break; + +        case 1:  // "Cancel" +            break; + +        default: +            llassert(0); +            break; +    } +    return false; +} +  bool LLVoiceClient::voiceEnabled()  {      static LLCachedControl<bool> enable_voice_chat(gSavedSettings, "EnableVoiceChat");      static LLCachedControl<bool> cmd_line_disable_voice(gSavedSettings, "CmdLineDisableVoice"); -    return enable_voice_chat && !cmd_line_disable_voice && !gNonInteractive; +    bool enabled = enable_voice_chat && !cmd_line_disable_voice && !gNonInteractive; +    if (enabled && !mVoiceEffectSupportNotified && getVoiceEffectEnabled() && !getVoiceEffectDefault().isNull()) +    { +        LLNotificationsUtil::add("VoiceEffectsNotSupported", LLSD(), LLSD(), &LLVoiceClient::onVoiceEffectsNotSupported); +        mVoiceEffectSupportNotified = true; +    } +    return enabled;  }  void LLVoiceClient::setVoiceEnabled(bool enabled) @@ -812,7 +839,7 @@ std::string LLVoiceClient::sipURIFromID(const LLUUID &id)  LLVoiceEffectInterface* LLVoiceClient::getVoiceEffectInterface() const  { -    return getVoiceEffectEnabled() ? dynamic_cast<LLVoiceEffectInterface*>(mSpatialVoiceModule) : NULL; +    return NULL;  }  /////////////////// diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 7411df1693..9ae18b315c 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -508,6 +508,8 @@ public:  protected: +    static bool onVoiceEffectsNotSupported(const LLSD ¬ification, const LLSD &response); +      LLVoiceModuleInterface* mSpatialVoiceModule;      LLVoiceModuleInterface* mNonSpatialVoiceModule;      LLSD                    mSpatialCredentials;  // used to store spatial credentials for vivox @@ -519,6 +521,7 @@ protected:      LLCachedControl<bool> mVoiceEffectEnabled;      LLCachedControl<std::string> mVoiceEffectDefault; +    bool        mVoiceEffectSupportNotified;      bool        mPTTDirty;      bool        mPTT; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 17fd85f280..81325b5648 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -2540,7 +2540,6 @@ void LLVivoxVoiceClient::sessionCreateSendMessage(const sessionStatePtr_t &sessi      stream          << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"          << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" -        << "<VoiceFontID>" << font_index << "</VoiceFontID>"          << "<Name>" << mChannelName << "</Name>"      << "</Request>\n\n\n";      LL_WARNS("Voice") << "Session.Create: " << stream.str() << LL_ENDL; @@ -2579,7 +2578,6 @@ void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(const sessionStatePtr          << "<Name>" << mChannelName << "</Name>"          << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"          << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" -        << "<VoiceFontID>" << font_index << "</VoiceFontID>"          << "<Password>" << password << "</Password>"          << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"      << "</Request>\n\n\n" @@ -2603,7 +2601,6 @@ void LLVivoxVoiceClient::sessionMediaConnectSendMessage(const sessionStatePtr_t      << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">"          << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"          << "<SessionHandle>" << session->mHandle << "</SessionHandle>" -        << "<VoiceFontID>" << font_index << "</VoiceFontID>"          << "<Media>Audio</Media>"      << "</Request>\n\n\n"; @@ -5107,25 +5104,31 @@ void LLVivoxVoiceClient::processChannels(bool process)  bool LLVivoxVoiceClient::isCurrentChannel(const LLSD &channelInfo)  { -    if (!mProcessChannels || (channelInfo["voice_server_type"].asString() != VIVOX_VOICE_SERVER_TYPE)) +    if (!mProcessChannels || (channelInfo.has("voice_server_type") && channelInfo["voice_server_type"].asString() != VIVOX_VOICE_SERVER_TYPE))      {          return false;      } -    if (mAudioSession) +    // favor the next audio session, as that's the one we're bringing up. +    sessionStatePtr_t session = mNextAudioSession; +    if (!session) +    { +        session = mAudioSession; +    } +    if (session)      {          if (!channelInfo["session_handle"].asString().empty())          { -            return mAudioSession->mHandle == channelInfo["session_handle"].asString(); +            return session->mHandle == channelInfo["session_handle"].asString();          } -        return channelInfo["channel_uri"].asString() == mAudioSession->mSIPURI; +        return channelInfo["channel_uri"].asString() == session->mSIPURI;      }      return false;  }  bool LLVivoxVoiceClient::compareChannels(const LLSD& channelInfo1, const LLSD& channelInfo2)  { -    return (channelInfo1["voice_server_type"] == VIVOX_VOICE_SERVER_TYPE) && -           (channelInfo1["voice_server_type"] == channelInfo2["voice_server_type"]) && +    return (!channelInfo1.has("voice_server_type") || (channelInfo1["voice_server_type"] == VIVOX_VOICE_SERVER_TYPE)) && +           (!channelInfo2.has("voice_server_type") || (channelInfo2["voice_server_type"] == VIVOX_VOICE_SERVER_TYPE)) &&             (channelInfo1["channel_uri"] == channelInfo2["channel_uri"]);  } diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 661b4f7ef1..ede1542bd1 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -86,7 +86,7 @@ namespace {      const F32 VOLUME_SCALE_WEBRTC = 0.01f;      const F32 LEVEL_SCALE_WEBRTC  = 0.008f; -    const F32 SPEAKING_AUDIO_LEVEL = 0.35; +    const F32 SPEAKING_AUDIO_LEVEL = 0.30;      static const std::string REPORTED_VOICE_SERVER_TYPE = "Secondlife WebRTC Gateway"; @@ -1486,14 +1486,10 @@ void LLWebRTCVoiceClient::setMicGain(F32 gain)      if (gain != mMicGain)      {          mMicGain = gain; -        sessionState::for_each(boost::bind(predSetMicGain, _1, gain)); +        mWebRTCDeviceInterface->setPeerConnectionGain(gain);      }  } -void LLWebRTCVoiceClient::predSetMicGain(const LLWebRTCVoiceClient::sessionStatePtr_t &session, F32 gain) -{ -    session->setMicGain(gain); -}  void LLWebRTCVoiceClient::setVoiceEnabled(bool enabled)  { @@ -1692,7 +1688,6 @@ std::map<std::string, LLWebRTCVoiceClient::sessionState::ptr_t> LLWebRTCVoiceCli  LLWebRTCVoiceClient::sessionState::sessionState() :      mHangupOnLastLeave(false),      mNotifyOnFirstJoin(false), -    mMicGain(1.0),      mMuted(false),      mSpeakerVolume(1.0),      mShuttingDown(false) @@ -1737,15 +1732,6 @@ void LLWebRTCVoiceClient::sessionState::setMuteMic(bool muted)      }  } -void LLWebRTCVoiceClient::sessionState::setMicGain(F32 gain) -{ -    mMicGain = gain; -    for (auto &connection : mWebRTCConnections) -    { -        connection->setMicGain(gain); -    } -} -  void LLWebRTCVoiceClient::sessionState::setSpeakerVolume(F32 volume)  {      mSpeakerVolume = volume; @@ -1850,7 +1836,6 @@ LLWebRTCVoiceClient::sessionStatePtr_t LLWebRTCVoiceClient::addSession(const std          LL_DEBUGS("Voice") << "adding new session with channel: " << channel_id << LL_ENDL;          session->setMuteMic(mMuteMic); -        session->setMicGain(mMicGain);          session->setSpeakerVolume(mSpeakerVolume);          sessionState::addSession(channel_id, session); @@ -1976,7 +1961,6 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates()              connectionPtr_t connection(new LLVoiceWebRTCSpatialConnection(neighbor, INVALID_PARCEL_ID, mChannelID));              mWebRTCConnections.push_back(connection); -            connection->setMicGain(mMicGain);              connection->setMuteMic(mMuted);              connection->setSpeakerVolume(mSpeakerVolume);          } @@ -2106,7 +2090,6 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s      mShutDown(false),      mIceCompleted(false),      mSpeakerVolume(0.0), -    mMicGain(0.0),      mOutstandingRequests(0),      mChannelID(channelID),      mRegionID(regionID), @@ -2369,15 +2352,6 @@ void LLVoiceWebRTCConnection::setMuteMic(bool muted)      }  } -void LLVoiceWebRTCConnection::setMicGain(F32 gain) -{ -    mMicGain = gain; -    if (mWebRTCAudioInterface) -    { -        mWebRTCAudioInterface->setSendVolume(gain); -    } -} -  void LLVoiceWebRTCConnection::setSpeakerVolume(F32 volume)  {      mSpeakerVolume = volume; @@ -2677,7 +2651,6 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()              // this connection.              mWebRTCAudioInterface->setMute(mMuted);              mWebRTCAudioInterface->setReceiveVolume(mSpeakerVolume); -            mWebRTCAudioInterface->setSendVolume(mMicGain);              LLWebRTCVoiceClient::getInstance()->OnConnectionEstablished(mChannelID, mRegionID);              setVoiceConnectionState(VOICE_STATE_WAIT_FOR_DATA_CHANNEL);              break; diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index c341ea6c94..480a7897cd 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -282,7 +282,6 @@ public:          virtual void sendData(const std::string &data);          void setMuteMic(bool muted); -        void setMicGain(F32 volume);          void setSpeakerVolume(F32 volume);          void setUserVolume(const LLUUID& id, F32 volume); @@ -303,7 +302,6 @@ public:          std::string mName;          bool    mMuted;          // this session is muted. -        F32     mMicGain;        // gain for this session.          F32     mSpeakerVolume;  // volume for this session.          bool        mShuttingDown; @@ -382,7 +380,6 @@ public:      static void predSendData(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const std::string& spatial_data);      static void predUpdateOwnVolume(const LLWebRTCVoiceClient::sessionStatePtr_t &session, F32 audio_level);      static void predSetMuteMic(const LLWebRTCVoiceClient::sessionStatePtr_t &session, bool mute); -    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);      static void predSetUserMute(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const LLUUID& id, bool mute); @@ -607,7 +604,6 @@ class LLVoiceWebRTCConnection :      void processIceUpdatesCoro();      virtual void setMuteMic(bool muted); -    virtual void setMicGain(F32 volume);      virtual void setSpeakerVolume(F32 volume);      void setUserVolume(const LLUUID& id, F32 volume); @@ -686,7 +682,6 @@ class LLVoiceWebRTCConnection :      std::string mRemoteChannelSDP;      bool mMuted; -    F32  mMicGain;      F32  mSpeakerVolume;      bool mShutDown; diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index f6724d4993..8c446c1975 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -42,12 +42,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Voice-Morphing" name="VoiceMorphing"> -			<menu_item_check label="Kein Voice-Morphing" name="NoVoiceMorphing"/> -			<menu_item_check label="Vorschau..." name="Preview"/> -			<menu_item_call label="Abonnieren..." name="Subscribe"/> -			<menu_item_call label="Premium-Vorteil..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Gesten..." name="Gestures"/>  		<menu_item_check label="Freunde" name="My Friends"/>  		<menu_item_check label="Gruppen" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 4a043bbbc9..d5d2d00630 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -561,42 +561,6 @@               parameter="conversation" />          </menu_item_check>          <menu_item_separator/> -        <menu -         label="Voice morphing" -         name="VoiceMorphing" -         visibility_control="VoiceMorphingEnabled"> -            <menu_item_check -             label="No voice morphing" -             name="NoVoiceMorphing"> -                <menu_item_check.on_check -                 function="Communicate.VoiceMorphing.NoVoiceMorphing.Check" /> -                <menu_item_check.on_click -                 function="Communicate.VoiceMorphing.NoVoiceMorphing.Click" /> -            </menu_item_check> -            <menu_item_separator/> -            <menu_item_check -             label="Preview..." -             name="Preview"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="voice_effect" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="voice_effect" /> -            </menu_item_check> -            <menu_item_call -             label="Subscribe..." -             name="Subscribe"> -                <menu_item_call.on_click -                 function="Communicate.VoiceMorphing.Subscribe" /> -            </menu_item_call> -            <menu_item_call -             label="Premium perk..." -             name="PremiumPerk"> -                <menu_item_call.on_click -                 function="Communicate.VoiceMorphing.PremiumPerk" /> -            </menu_item_call> -        </menu>          <menu_item_check           label="Gestures..."           name="Gestures" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1584de6880..f86b297395 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -8842,6 +8842,20 @@ New Voice Morphs are available!    </notification>    <notification +    icon="alertmodal.tga" +    name="VoiceEffectsNotSupported" +    sound="UISndAlert" +    persist="true" +    type="alertmodal"> +Voice Morphs are not supported by this viewer. +    <usetemplate +        notext="Cancel" +        name="okcancelbuttons" +        yestext="Disable Voice Morphing"/> +    <tag>voice</tag> +  </notification> + +  <notification     icon="notifytip.tga"     name="Cannot enter parcel: not a group member"     type="notifytip"> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index c22311f882..04e43f01da 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -42,12 +42,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Transformación de voz" name="VoiceMorphing"> -			<menu_item_check label="Sin transformación de voz" name="NoVoiceMorphing"/> -			<menu_item_check label="Probar..." name="Preview"/> -			<menu_item_call label="Suscribir..." name="Subscribe"/> -			<menu_item_call label="Ventaja Premium..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Gestos..." name="Gestures"/>  		<menu_item_check label="Amigos" name="My Friends"/>  		<menu_item_check label="Grupos" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 043fd28ddb..85999ccbe0 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -42,12 +42,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Manipolazione voce" name="VoiceMorphing"> -			<menu_item_check label="Nessuna manipolazione voce" name="NoVoiceMorphing"/> -			<menu_item_check label="Anteprima..." name="Preview"/> -			<menu_item_call label="Abbonati..." name="Subscribe"/> -			<menu_item_call label="Vantaggio Premium..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Gesture..." name="Gestures"/>  		<menu_item_check label="Amici" name="My Friends"/>  		<menu_item_check label="Gruppi" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index a1f3980df4..f6b10bb121 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -74,7 +74,6 @@  		<menu_item_check label="ボイスチャット" name="Speak"/>  		<menu_item_check name="Conversation Log..." label="会話ログ…"/>  		<menu_item_separator/> -		<menu label="ボイスモーフィング" name="VoiceMorphing"/>  		<menu_item_check label="ジェスチャー…" name="Gestures"/>  		<menu_item_separator/>  		<menu_item_check label="フレンド" name="My Friends"/> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 4d03e7c780..ee162addd2 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -35,11 +35,6 @@  		<menu_item_check label="Czat lokalny..." name="Nearby Chat" />  		<menu_item_check label="Mowa" name="Speak" />  		<menu_item_check name="Conversation Log..." label="Dziennik rozmów..." /> -		<menu label="Przekształcanie głosu" name="VoiceMorphing"> -			<menu_item_check label="Bez przekształcania" name="NoVoiceMorphing" /> -			<menu_item_check label="Podgląd..." name="Preview" /> -			<menu_item_call label="Subskrybuj..." name="Subscribe" /> -		</menu>  		<menu_item_check label="Gesty..." name="Gestures" />  		<menu_item_check label="Znajomi" name="My Friends" />  		<menu_item_check label="Grupy" name="My Groups" /> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index b70adc3ad2..0f4873d11c 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -42,12 +42,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Distorção de voz" name="VoiceMorphing"> -			<menu_item_check label="Não distorcer voz" name="NoVoiceMorphing"/> -			<menu_item_check label="Visualizar..." name="Preview"/> -			<menu_item_call label="Assinar..." name="Subscribe"/> -			<menu_item_call label="Benefício Premium..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Gestos..." name="Gestures"/>  		<menu_item_check label="Amigos" name="My Friends"/>  		<menu_item_check label="Grupos" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 8361464f4c..4a6390329d 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -40,12 +40,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Изменение голоса" name="VoiceMorphing"> -			<menu_item_check label="Без изменения голоса" name="NoVoiceMorphing"/> -			<menu_item_check label="Просмотр..." name="Preview"/> -			<menu_item_call label="Подписаться..." name="Subscribe"/> -			<menu_item_call label="Премиум-бонус..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Жесты..." name="Gestures"/>  		<menu_item_check label="Друзья" name="My Friends"/>  		<menu_item_check label="Группы" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 1c977ba5ce..fb6111248c 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -40,12 +40,6 @@  		<menu_item_call label="Facebook..." name="Facebook"/>  		<menu_item_call label="Twitter..." name="Twitter"/>  		<menu_item_call label="Flickr..." name="Flickr"/> -		<menu label="Ses şekillendirme" name="VoiceMorphing"> -			<menu_item_check label="Ses şekillendirme yok" name="NoVoiceMorphing"/> -			<menu_item_check label="Önizleme..." name="Preview"/> -			<menu_item_call label="Abone ol..." name="Subscribe"/> -			<menu_item_call label="Özel üye avantajı..." name="PremiumPerk"/> -		</menu>  		<menu_item_check label="Mimikler..." name="Gestures"/>  		<menu_item_check label="Arkadaşlar" name="My Friends"/>  		<menu_item_check label="Gruplar" name="My Groups"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 972434dfc5..a048af7b68 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -40,12 +40,6 @@  		<menu_item_call label="臉書…" name="Facebook"/>  		<menu_item_call label="推特…" name="Twitter"/>  		<menu_item_call label="Flickr…" name="Flickr"/> -		<menu label="語音變聲" name="VoiceMorphing"> -			<menu_item_check label="沒有變聲效果" name="NoVoiceMorphing"/> -			<menu_item_check label="預覽……" name="Preview"/> -			<menu_item_call label="訂閱……" name="Subscribe"/> -			<menu_item_call label="付費會員獨享…" name="PremiumPerk"/> -		</menu>  		<menu_item_check label="姿勢…" name="Gestures"/>  		<menu_item_check label="朋友" name="My Friends"/>  		<menu_item_check label="群組" name="My Groups"/> | 
