< Summary

Class:DCL.SettingsData.AudioSettings
Assembly:Settings
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/Settings.cs
Covered lines:0
Uncovered lines:1
Coverable lines:1
Total lines:314
Line coverage:0% (0 of 1)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Equals(...)0%56700%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/Settings.cs

#LineLine coverage
 1using UnityEngine;
 2using System;
 3using DCL.Helpers;
 4using DCL.Interface;
 5using UnityEngine.Audio;
 6
 7namespace DCL
 8{
 9    public class Settings : DCL.Singleton<Settings>
 10    {
 11        const string QUALITY_SETTINGS_KEY = "Settings.Quality";
 12        const string GENERAL_SETTINGS_KEY = "Settings.General";
 13        const string AUDIO_SETTINGS_KEY = "Settings.Audio";
 14
 15        public event Action<SettingsData.QualitySettings> OnQualitySettingsChanged;
 16        public event Action<SettingsData.GeneralSettings> OnGeneralSettingsChanged;
 17        public event Action<SettingsData.AudioSettings> OnAudioSettingsChanged;
 18        public event Action OnResetAllSettings;
 19
 20        public SettingsData.QualitySettings qualitySettings { get { return currentQualitySettings; } }
 21        public SettingsData.QualitySettingsData qualitySettingsPresets { get { return qualitySettingsPreset; } }
 22        public SettingsData.GeneralSettings generalSettings { get { return currentGeneralSettings; } }
 23        public SettingsData.AudioSettings audioSettings { get { return currentAudioSettings; } }
 24
 25        private static SettingsData.QualitySettingsData qualitySettingsPreset = null;
 26
 27        public SettingsData.QualitySettingsData autoqualitySettings = null;
 28        public SettingsData.QualitySettings lastValidAutoqualitySet;
 29
 30        private readonly BooleanVariable autosettingsEnabled = null;
 31
 32        public SettingsData.QualitySettings currentQualitySettings { private set; get; }
 33        private SettingsData.GeneralSettings currentGeneralSettings;
 34        public SettingsData.AudioSettings currentAudioSettings { private set; get; }
 35
 36        AudioMixer audioMixer;
 37
 38        public Settings()
 39        {
 40            if (qualitySettingsPreset == null)
 41            {
 42                qualitySettingsPreset = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/QualitySetti
 43            }
 44
 45            if (autoqualitySettings == null)
 46            {
 47                autoqualitySettings = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/AutoQualitySet
 48                lastValidAutoqualitySet = autoqualitySettings[autoqualitySettings.Length / 2];
 49            }
 50
 51            if (autosettingsEnabled == null)
 52                autosettingsEnabled = Resources.Load<BooleanVariable>("ScriptableObjects/AutoQualityEnabled");
 53
 54            LoadQualitySettings();
 55            LoadGeneralSettings();
 56            LoadAudioSettings();
 57
 58            SubscribeToVirtualAudioMixerEvents();
 59            audioMixer = Resources.Load<AudioMixer>("AudioMixer");
 60        }
 61
 62        public void Dispose() { UnsubscribeFromVirtualAudioMixerEvents(); }
 63
 64        private void LoadQualitySettings()
 65        {
 66            bool isQualitySettingsSet = false;
 67            if (PlayerPrefsUtils.HasKey(QUALITY_SETTINGS_KEY))
 68            {
 69                try
 70                {
 71                    currentQualitySettings = JsonUtility.FromJson<SettingsData.QualitySettings>(PlayerPrefsUtils.GetStri
 72                    isQualitySettingsSet = true;
 73                }
 74                catch (Exception e)
 75                {
 76                    Debug.LogError(e.Message);
 77                }
 78            }
 79
 80            if (!isQualitySettingsSet)
 81            {
 82                currentQualitySettings = qualitySettingsPreset.defaultPreset;
 83            }
 84        }
 85
 86        private void LoadGeneralSettings()
 87        {
 88            currentGeneralSettings = GetDefaultGeneralSettings();
 89
 90            if (PlayerPrefsUtils.HasKey(GENERAL_SETTINGS_KEY))
 91            {
 92                try
 93                {
 94                    object currentSetting = currentGeneralSettings;
 95                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(GENERAL_SETTINGS_KEY), currentSetting);
 96                    currentGeneralSettings = (SettingsData.GeneralSettings)currentSetting;
 97                }
 98                catch (Exception e)
 99                {
 100                    Debug.LogError(e.Message);
 101                }
 102            }
 103        }
 104
 105        private void LoadAudioSettings()
 106        {
 107            currentAudioSettings = GetDefaultAudioSettings();
 108
 109            if (PlayerPrefsUtils.HasKey(AUDIO_SETTINGS_KEY))
 110            {
 111                try
 112                {
 113                    object currentSetting = currentAudioSettings;
 114                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(AUDIO_SETTINGS_KEY), currentSetting);
 115                    currentAudioSettings = (SettingsData.AudioSettings)currentSetting;
 116                }
 117                catch (Exception e)
 118                {
 119                    Debug.LogError(e.Message);
 120                }
 121            }
 122        }
 123
 124        public void LoadDefaultSettings()
 125        {
 126            autosettingsEnabled.Set(false);
 127            currentQualitySettings = qualitySettingsPreset.defaultPreset;
 128            currentGeneralSettings = GetDefaultGeneralSettings();
 129            currentAudioSettings = GetDefaultAudioSettings();
 130
 131            ApplyQualitySettings(currentQualitySettings);
 132            ApplyGeneralSettings(currentGeneralSettings);
 133            ApplyAudioSettings(currentAudioSettings);
 134        }
 135
 136        public void ResetAllSettings()
 137        {
 138            LoadDefaultSettings();
 139            SaveSettings();
 140            OnResetAllSettings?.Invoke();
 141        }
 142
 143        private SettingsData.GeneralSettings GetDefaultGeneralSettings()
 144        {
 145            return new SettingsData.GeneralSettings()
 146            {
 147                mouseSensitivity = 0.6f,
 148                scenesLoadRadius = 4,
 149                avatarsLODDistance = 16,
 150                maxNonLODAvatars = DataStore.DataStore_AvatarsLOD.DEFAULT_MAX_AVATAR,
 151                voiceChatVolume = 1,
 152                voiceChatAllow = SettingsData.GeneralSettings.VoiceChatAllow.ALL_USERS,
 153                autoqualityOn = false
 154            };
 155        }
 156
 157        private SettingsData.AudioSettings GetDefaultAudioSettings()
 158        {
 159            return new SettingsData.AudioSettings()
 160            {
 161                masterVolume = 1f,
 162                voiceChatVolume = 1f,
 163                avatarSFXVolume = 1f,
 164                uiSFXVolume = 1f,
 165                sceneSFXVolume = 1f,
 166                musicVolume = 1f,
 167                chatSFXEnabled = true
 168            };
 169        }
 170
 171        /// <summary>
 172        /// Apply the auto quality setting by its index on the array
 173        /// </summary>
 174        /// <param name="index">Index within the autoQualitySettings array</param>
 175        public void ApplyAutoQualitySettings(int index)
 176        {
 177            if (index < 0 || index >= autoqualitySettings.Length)
 178                return;
 179
 180            lastValidAutoqualitySet = autoqualitySettings[index];
 181            lastValidAutoqualitySet.baseResolution = currentQualitySettings.baseResolution;
 182            lastValidAutoqualitySet.fpsCap = currentQualitySettings.fpsCap;
 183
 184            if (currentQualitySettings.Equals(lastValidAutoqualitySet))
 185                return;
 186
 187            ApplyQualitySettings(lastValidAutoqualitySet);
 188        }
 189
 190        public void ApplyQualitySettings(SettingsData.QualitySettings settings)
 191        {
 192            if (settings.Equals(currentQualitySettings))
 193                return;
 194
 195            currentQualitySettings = settings;
 196            OnQualitySettingsChanged?.Invoke(settings);
 197        }
 198
 199        public void ApplyGeneralSettings(SettingsData.GeneralSettings settings)
 200        {
 201            if (settings.Equals(currentGeneralSettings))
 202                return;
 203
 204            currentGeneralSettings = settings;
 205            OnGeneralSettingsChanged?.Invoke(settings);
 206            autosettingsEnabled.Set(settings.autoqualityOn);
 207        }
 208
 209        public void ApplyAudioSettings(SettingsData.AudioSettings settings)
 210        {
 211            if (settings.Equals(currentAudioSettings))
 212                return;
 213
 214            currentAudioSettings = settings;
 215            OnAudioSettingsChanged?.Invoke(settings);
 216        }
 217
 218        private void SubscribeToVirtualAudioMixerEvents()
 219        {
 220            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange += ApplyVoiceChatSettings;
 221            DataStore.i.virtualAudioMixer.musicVolume.OnChange += ApplyMusicVolume;
 222            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange += ApplyAvatarSFXVolume;
 223            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange += ApplyUISFXVolume;
 224        }
 225
 226        private void UnsubscribeFromVirtualAudioMixerEvents()
 227        {
 228            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange -= ApplyVoiceChatSettings;
 229            DataStore.i.virtualAudioMixer.musicVolume.OnChange -= ApplyMusicVolume;
 230            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange -= ApplyAvatarSFXVolume;
 231            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange -= ApplyUISFXVolume;
 232        }
 233
 234        public void ApplyMasterVolume()
 235        {
 236            // Update the "All" mixer group
 237            audioMixer.SetFloat("AllBusVolume", Utils.ToAudioMixerGroupVolume(currentAudioSettings.masterVolume));
 238
 239            // Update voice chat volume, as it does not pass through the AudioMixer
 240            ApplyVoiceChatSettings();
 241        }
 242
 243        public void ApplyVoiceChatSettings(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f)
 244        {
 245            float calculatedVolume = Utils.ToVolumeCurve(DataStore.i.virtualAudioMixer.voiceChatVolume.Get() * currentAu
 246            WebInterface.ApplySettings(calculatedVolume, (int)currentGeneralSettings.voiceChatAllow);
 247        }
 248
 249        public void ApplyAvatarSFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioM
 250
 251        public void ApplyUISFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioMixer
 252
 253        public void ApplyMusicVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioMixer
 254
 255        public void SaveSettings()
 256        {
 257            PlayerPrefsUtils.SetString(GENERAL_SETTINGS_KEY, JsonUtility.ToJson(currentGeneralSettings));
 258            PlayerPrefsUtils.SetString(QUALITY_SETTINGS_KEY, JsonUtility.ToJson(currentQualitySettings));
 259            PlayerPrefsUtils.SetString(AUDIO_SETTINGS_KEY, JsonUtility.ToJson(currentAudioSettings));
 260            PlayerPrefsUtils.Save();
 261        }
 262    }
 263}
 264
 265namespace DCL.SettingsData
 266{
 267    [Serializable]
 268    public struct GeneralSettings
 269    {
 270        public enum VoiceChatAllow { ALL_USERS, VERIFIED_ONLY, FRIENDS_ONLY }
 271
 272        public float mouseSensitivity;
 273        public float voiceChatVolume;
 274        public VoiceChatAllow voiceChatAllow;
 275        public bool autoqualityOn;
 276        public float scenesLoadRadius;
 277        public float avatarsLODDistance;
 278        public float maxNonLODAvatars;
 279
 280        public bool Equals(GeneralSettings settings)
 281        {
 282            return mouseSensitivity == settings.mouseSensitivity
 283                   && scenesLoadRadius == settings.scenesLoadRadius
 284                   && avatarsLODDistance == settings.avatarsLODDistance
 285                   && maxNonLODAvatars == settings.maxNonLODAvatars
 286                   && voiceChatVolume == settings.voiceChatVolume
 287                   && voiceChatAllow == settings.voiceChatAllow
 288                   && autoqualityOn == settings.autoqualityOn;
 289        }
 290    }
 291
 292    [Serializable]
 293    public struct AudioSettings
 294    {
 295        public float masterVolume;
 296        public float voiceChatVolume;
 297        public float avatarSFXVolume;
 298        public float uiSFXVolume;
 299        public float sceneSFXVolume; // Note(Mordi): Also known as "World SFX"
 300        public float musicVolume;
 301        public bool chatSFXEnabled;
 302
 303        public bool Equals(AudioSettings settings)
 304        {
 0305            return masterVolume == settings.masterVolume
 306                   && voiceChatVolume == settings.voiceChatVolume
 307                   && avatarSFXVolume == settings.avatarSFXVolume
 308                   && uiSFXVolume == settings.uiSFXVolume
 309                   && sceneSFXVolume == settings.sceneSFXVolume
 310                   && musicVolume == settings.musicVolume
 311                   && chatSFXEnabled == settings.chatSFXEnabled;
 312        }
 313    }
 314}