< Summary

Class:DCL.Components.DCLAudioStream
Assembly:MainScripts
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioStream.cs
Covered lines:50
Uncovered lines:27
Coverable lines:77
Total lines:167
Line coverage:64.9% (50 of 77)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
Awake()0%110100%
DCLAudioStream()0%110100%
GetModel()0%2100%
ApplyChanges()0%6.046090%
Start()0%110100%
OnDestroy()0%110100%
IsPlayerInSameSceneAsComponent(...)0%6.65060%
UpdatePlayingState(...)0%15.213076.47%
OnSceneChanged(...)0%2100%
OnRendererStateChanged(...)0%6200%
OnSettingsChanged(...)0%6200%
GetCalculatedSettingsVolume(...)0%110100%
SceneSFXVolume_OnChange(...)0%2100%
StopStreaming()0%110100%
StartStreaming()0%110100%
UpdateOutOfBoundariesState(...)0%12300%
GetClassId()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioStream.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using DCL.Controllers;
 5using DCL.Helpers;
 6using DCL.Models;
 7
 8namespace DCL.Components
 9{
 10    public class DCLAudioStream : BaseComponent, IOutOfSceneBoundariesHandler
 11    {
 12        [System.Serializable]
 13        public class Model : BaseModel
 14        {
 15            public string url;
 16            public bool playing = false;
 117            public float volume = 1;
 18
 119            public override BaseModel GetDataFromJSON(string json) { return Utils.SafeFromJson<Model>(json); }
 20        }
 21
 222        private void Awake() { model = new Model(); }
 23
 24        private bool isPlaying = false;
 25        private float settingsVolume = 0;
 26        private bool isDestroyed = false;
 227        private Model prevModel = new Model();
 28
 029        new public Model GetModel() { return (Model) model; }
 30
 31        public override IEnumerator ApplyChanges(BaseModel newModel)
 32        {
 633            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 34
 35            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 36            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 337            if (isDestroyed)
 038                yield break;
 39
 340            Model model = (Model)newModel;
 341            bool forceUpdate = prevModel.volume != model.volume;
 342            settingsVolume = GetCalculatedSettingsVolume(Settings.i.currentAudioSettings);
 43
 344            UpdatePlayingState(forceUpdate);
 345            prevModel = model;
 346            yield return null;
 347        }
 48
 49        private void Start()
 50        {
 151            CommonScriptableObjects.sceneID.OnChange += OnSceneChanged;
 152            CommonScriptableObjects.rendererState.OnChange += OnRendererStateChanged;
 153            Settings.i.OnAudioSettingsChanged += OnSettingsChanged;
 154            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange += SceneSFXVolume_OnChange;
 155        }
 56
 57        private void OnDestroy()
 58        {
 159            isDestroyed = true;
 160            CommonScriptableObjects.sceneID.OnChange -= OnSceneChanged;
 161            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChanged;
 162            Settings.i.OnAudioSettingsChanged -= OnSettingsChanged;
 163            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange -= SceneSFXVolume_OnChange;
 164            StopStreaming();
 165        }
 66
 67        private bool IsPlayerInSameSceneAsComponent(string currentSceneId)
 68        {
 369            if (scene == null)
 070                return false;
 371            if (string.IsNullOrEmpty(currentSceneId))
 072                return false;
 373            return (scene.sceneData.id == currentSceneId) || (scene is GlobalScene globalScene && globalScene.isPortable
 74        }
 75
 76        private void UpdatePlayingState(bool forceStateUpdate)
 77        {
 378            if (!gameObject.activeInHierarchy)
 79            {
 080                return;
 81            }
 82
 383            bool canPlayStream = IsPlayerInSameSceneAsComponent(CommonScriptableObjects.sceneID) && CommonScriptableObje
 84
 385            Model model = (Model) this.model;
 386            bool shouldStopStream = (isPlaying && !model.playing) || (isPlaying && !canPlayStream);
 387            bool shouldStartStream = !isPlaying && canPlayStream && model.playing;
 88
 389            if (shouldStopStream)
 90            {
 191                StopStreaming();
 192                return;
 93            }
 94
 295            if (shouldStartStream)
 96            {
 197                StartStreaming();
 198                return;
 99            }
 100
 1101            if (forceStateUpdate)
 102            {
 0103                if (isPlaying)
 0104                    StartStreaming();
 105                else
 0106                    StopStreaming();
 107            }
 1108        }
 109
 0110        private void OnSceneChanged(string sceneId, string prevSceneId) { UpdatePlayingState(false); }
 111
 112        private void OnRendererStateChanged(bool isEnable, bool prevState)
 113        {
 0114            if (isEnable)
 115            {
 0116                UpdatePlayingState(false);
 117            }
 0118        }
 119
 120        private void OnSettingsChanged(SettingsData.AudioSettings settings)
 121        {
 0122            float newSettingsVolume = GetCalculatedSettingsVolume(settings);
 0123            if (settingsVolume != newSettingsVolume)
 124            {
 0125                settingsVolume = newSettingsVolume;
 0126                UpdatePlayingState(true);
 127            }
 0128        }
 129
 3130        private float GetCalculatedSettingsVolume(SettingsData.AudioSettings audioSettings) { return Utils.ToVolumeCurve
 131
 0132        private void SceneSFXVolume_OnChange(float current, float previous) { OnSettingsChanged(Settings.i.currentAudioS
 133
 134        private void StopStreaming()
 135        {
 2136            Model model = (Model) this.model;
 2137            isPlaying = false;
 2138            Interface.WebInterface.SendAudioStreamEvent(model.url, false, model.volume * settingsVolume);
 2139        }
 140
 141        private void StartStreaming()
 142        {
 1143            Model model = (Model) this.model;
 1144            isPlaying = true;
 1145            Interface.WebInterface.SendAudioStreamEvent(model.url, true, model.volume * settingsVolume);
 1146        }
 147
 148        public void UpdateOutOfBoundariesState(bool enable)
 149        {
 0150            if (!isPlaying)
 0151                return;
 152
 0153            if (enable)
 154            {
 0155                StartStreaming();
 0156            }
 157            else
 158            {
 0159                Model model = (Model) this.model;
 160                //Set volume to 0 (temporary solution until the refactor in #1421)
 0161                Interface.WebInterface.SendAudioStreamEvent(model.url, true, 0);
 162            }
 0163        }
 164
 0165        public override int GetClassId() { return (int) CLASS_ID_COMPONENT.AUDIO_STREAM; }
 166    }
 167}