< Summary

Class:DCL.Components.DCLAudioStream
Assembly:DCL.Components.Audio
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioStream.cs
Covered lines:58
Uncovered lines:20
Coverable lines:78
Total lines:170
Line coverage:74.3% (58 of 78)
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%
Initialize(...)0%110100%
DCLAudioStream()0%110100%
GetModel()0%2100%
ApplyChanges()0%6.046090%
Start()0%110100%
OnDestroy()0%110100%
UpdatePlayingState(...)0%14.8513077.78%
OnSceneChanged(...)0%110100%
OnRendererStateChanged(...)0%2.152066.67%
OnSettingsChanged(...)0%6200%
GetCalculatedSettingsVolume(...)0%110100%
SceneSFXVolume_OnChange(...)0%2100%
StopStreaming()0%110100%
StartStreaming()0%110100%
UpdateOutOfBoundariesState(...)0%12300%
GetClassId()0%110100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Controllers;
 4using DCL.Helpers;
 5using DCL.Models;
 6using DCL.SettingsCommon;
 7using UnityEngine;
 8using AudioSettings = DCL.SettingsCommon.AudioSettings;
 9
 10namespace DCL.Components
 11{
 12    public class DCLAudioStream : BaseComponent, IOutOfSceneBoundariesHandler
 13    {
 14        [System.Serializable]
 15        public class Model : BaseModel
 16        {
 17            public string url;
 18            public bool playing = false;
 1819            public float volume = 1;
 20
 421            public override BaseModel GetDataFromJSON(string json) { return Utils.SafeFromJson<Model>(json); }
 22        }
 23
 824        private void Awake() { model = new Model(); }
 25
 26        public override void Initialize(IParcelScene scene, IDCLEntity entity)
 27        {
 428            base.Initialize(scene, entity);
 429            DataStore.i.sceneBoundariesChecker.Add(entity,this);
 430        }
 31
 4732        public bool isPlaying { get; private set; } = false;
 33        private float settingsVolume = 0;
 34        private bool isDestroyed = false;
 735        private Model prevModel = new Model();
 36
 537        public override string componentName => "AudioStream";
 38
 039        new public Model GetModel() { return (Model) model; }
 40
 41        public override IEnumerator ApplyChanges(BaseModel newModel)
 42        {
 1243            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 44
 45            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 46            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 647            if (isDestroyed)
 048                yield break;
 49
 650            Model model = (Model)newModel;
 651            bool forceUpdate = prevModel.volume != model.volume;
 652            settingsVolume = GetCalculatedSettingsVolume(Settings.i.audioSettings.Data);
 53
 654            UpdatePlayingState(forceUpdate);
 655            prevModel = model;
 656            yield return null;
 557        }
 58
 59        private void Start()
 60        {
 461            CommonScriptableObjects.sceneNumber.OnChange += OnSceneChanged;
 462            CommonScriptableObjects.rendererState.OnChange += OnRendererStateChanged;
 463            Settings.i.audioSettings.OnChanged += OnSettingsChanged;
 464            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange += SceneSFXVolume_OnChange;
 465        }
 66
 67        private void OnDestroy()
 68        {
 469            isDestroyed = true;
 470            CommonScriptableObjects.sceneNumber.OnChange -= OnSceneChanged;
 471            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChanged;
 472            Settings.i.audioSettings.OnChanged -= OnSettingsChanged;
 473            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange -= SceneSFXVolume_OnChange;
 474            StopStreaming();
 475            DataStore.i.sceneBoundariesChecker.Remove(entity,this);
 476        }
 77
 78        private void UpdatePlayingState(bool forceStateUpdate)
 79        {
 1080            if (!gameObject.activeInHierarchy)
 81            {
 082                return;
 83            }
 84
 1085            bool canPlayStream = scene.isPersistent || scene.sceneData.sceneNumber == CommonScriptableObjects.sceneNumbe
 1086            canPlayStream &= CommonScriptableObjects.rendererState;
 87
 1088            Model model = (Model) this.model;
 1089            bool shouldStopStream = (isPlaying && !model.playing) || (isPlaying && !canPlayStream);
 1090            bool shouldStartStream = !isPlaying && canPlayStream && model.playing;
 91
 1092            if (shouldStopStream)
 93            {
 394                StopStreaming();
 395                return;
 96            }
 97
 798            if (shouldStartStream)
 99            {
 4100                StartStreaming();
 4101                return;
 102            }
 103
 3104            if (forceStateUpdate)
 105            {
 0106                if (isPlaying)
 0107                    StartStreaming();
 108                else
 0109                    StopStreaming();
 110            }
 3111        }
 112
 8113        private void OnSceneChanged(int currentSceneNumber, int previousSceneNumber) { UpdatePlayingState(false); }
 114
 115        private void OnRendererStateChanged(bool isEnable, bool prevState)
 116        {
 3117            if (isEnable)
 118            {
 0119                UpdatePlayingState(false);
 120            }
 3121        }
 122
 123        private void OnSettingsChanged(AudioSettings settings)
 124        {
 0125            float newSettingsVolume = GetCalculatedSettingsVolume(settings);
 0126            if (Math.Abs(settingsVolume - newSettingsVolume) > Mathf.Epsilon)
 127            {
 0128                settingsVolume = newSettingsVolume;
 0129                UpdatePlayingState(true);
 130            }
 0131        }
 132
 6133        private float GetCalculatedSettingsVolume(AudioSettings audioSettings) { return Utils.ToVolumeCurve(DataStore.i.
 134
 0135        private void SceneSFXVolume_OnChange(float current, float previous) { OnSettingsChanged(Settings.i.audioSettings
 136
 137        private void StopStreaming()
 138        {
 7139            Model model = (Model) this.model;
 7140            isPlaying = false;
 7141            Interface.WebInterface.SendAudioStreamEvent(model.url, false, model.volume * settingsVolume);
 7142        }
 143
 144        private void StartStreaming()
 145        {
 4146            Model model = (Model) this.model;
 4147            isPlaying = true;
 4148            Interface.WebInterface.SendAudioStreamEvent(model.url, true, model.volume * settingsVolume);
 4149        }
 150
 151        public void UpdateOutOfBoundariesState(bool isInsideBoundaries)
 152        {
 0153            if (!isPlaying)
 0154                return;
 155
 0156            if (isInsideBoundaries)
 157            {
 0158                StartStreaming();
 159            }
 160            else
 161            {
 0162                Model model = (Model) this.model;
 163                //Set volume to 0 (temporary solution until the refactor in #1421)
 0164                Interface.WebInterface.SendAudioStreamEvent(model.url, true, 0);
 165            }
 0166        }
 167
 1168        public override int GetClassId() { return (int) CLASS_ID_COMPONENT.AUDIO_STREAM; }
 169    }
 170}