< 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:47
Uncovered lines:25
Coverable lines:72
Total lines:160
Line coverage:65.2% (47 of 72)
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%
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 = Settings.i.generalSettings.sfxVolume;
 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.OnGeneralSettingsChanged += OnSettingsChanged;
 154        }
 55
 56        private void OnDestroy()
 57        {
 158            isDestroyed = true;
 159            CommonScriptableObjects.sceneID.OnChange -= OnSceneChanged;
 160            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChanged;
 161            Settings.i.OnGeneralSettingsChanged -= OnSettingsChanged;
 162            StopStreaming();
 163        }
 64
 65        private bool IsPlayerInSameSceneAsComponent(string currentSceneId)
 66        {
 367            if (scene == null)
 068                return false;
 369            if (string.IsNullOrEmpty(currentSceneId))
 070                return false;
 371            return (scene.sceneData.id == currentSceneId) || (scene is GlobalScene globalScene && globalScene.isPortable
 72        }
 73
 74        private void UpdatePlayingState(bool forceStateUpdate)
 75        {
 376            if (!gameObject.activeInHierarchy)
 77            {
 078                return;
 79            }
 80
 381            bool canPlayStream = IsPlayerInSameSceneAsComponent(CommonScriptableObjects.sceneID) && CommonScriptableObje
 82
 383            Model model = (Model) this.model;
 384            bool shouldStopStream = (isPlaying && !model.playing) || (isPlaying && !canPlayStream);
 385            bool shouldStartStream = !isPlaying && canPlayStream && model.playing;
 86
 387            if (shouldStopStream)
 88            {
 189                StopStreaming();
 190                return;
 91            }
 92
 293            if (shouldStartStream)
 94            {
 195                StartStreaming();
 196                return;
 97            }
 98
 199            if (forceStateUpdate)
 100            {
 0101                if (isPlaying)
 0102                    StartStreaming();
 103                else
 0104                    StopStreaming();
 105            }
 1106        }
 107
 0108        private void OnSceneChanged(string sceneId, string prevSceneId) { UpdatePlayingState(false); }
 109
 110        private void OnRendererStateChanged(bool isEnable, bool prevState)
 111        {
 0112            if (isEnable)
 113            {
 0114                UpdatePlayingState(false);
 115            }
 0116        }
 117
 118        private void OnSettingsChanged(SettingsData.GeneralSettings settings)
 119        {
 0120            if (settingsVolume != settings.sfxVolume)
 121            {
 0122                settingsVolume = settings.sfxVolume;
 0123                UpdatePlayingState(true);
 124            }
 0125        }
 126
 127        private void StopStreaming()
 128        {
 2129            Model model = (Model) this.model;
 2130            isPlaying = false;
 2131            Interface.WebInterface.SendAudioStreamEvent(model.url, false, model.volume * settingsVolume);
 2132        }
 133
 134        private void StartStreaming()
 135        {
 1136            Model model = (Model) this.model;
 1137            isPlaying = true;
 1138            Interface.WebInterface.SendAudioStreamEvent(model.url, true, model.volume * settingsVolume);
 1139        }
 140
 141        public void UpdateOutOfBoundariesState(bool enable)
 142        {
 0143            if (!isPlaying)
 0144                return;
 145
 0146            if (enable)
 147            {
 0148                StartStreaming();
 0149            }
 150            else
 151            {
 0152                Model model = (Model) this.model;
 153                //Set volume to 0 (temporary solution until the refactor in #1421)
 0154                Interface.WebInterface.SendAudioStreamEvent(model.url, true, 0);
 155            }
 0156        }
 157
 0158        public override int GetClassId() { return (int) CLASS_ID_COMPONENT.AUDIO_STREAM; }
 159    }
 160}