< Summary

Class:DCL.ECSComponents.ECSAudioStreamComponentHandler
Assembly:DCL.ECSComponents.AudioStream
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/AudioStream/ECSAudioStreamComponentHandler.cs
Covered lines:41
Uncovered lines:27
Coverable lines:68
Total lines:170
Line coverage:60.2% (41 of 68)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:16
Method coverage:56.2% (9 of 16)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSAudioStreamComponentHandler()0%110100%
OnComponentCreated(...)0%330100%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%5.395075%
UpdateModel(...)0%110100%
StateHasChange(...)0%330100%
ConditionsToPlayChanged()0%42600%
CanAudioStreamBePlayed()0%220100%
OnSceneChanged(...)0%2100%
OnRendererStateChanged(...)0%2100%
OnSettingsChanged(...)0%12300%
GetCalculatedSettingsVolume(...)0%110100%
SceneSFXVolume_OnChange(...)0%2100%
StopStreaming()0%2100%
StartStreaming()0%2100%
SendUpdateAudioStreamEvent(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/AudioStream/ECSAudioStreamComponentHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECSRuntime;
 3using DCL.Helpers;
 4using DCL.Interface;
 5using DCL.Models;
 6using DCL.SettingsCommon;
 7using System;
 8using UnityEngine;
 9using AudioSettings = DCL.SettingsCommon.AudioSettings;
 10
 11namespace DCL.ECSComponents
 12{
 13    public class ECSAudioStreamComponentHandler : IECSComponentHandler<PBAudioStream>
 14    {
 15        private float settingsVolume = 0;
 16
 717        internal float currentVolume = -1;
 18        internal bool isPlaying = false;
 19        internal PBAudioStream model;
 20        internal IParcelScene scene;
 21        internal IDCLEntity entity;
 22        internal string url;
 23
 24        // Flags to check if we can activate the AudioStream
 25        internal bool isInsideScene = false;
 26        internal bool isRendererActive = false;
 27        internal bool isValidUrl = false;
 28
 29        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 30        {
 731            this.scene = scene;
 732            this.entity = entity;
 33
 734            if (!scene.isPersistent)
 735                CommonScriptableObjects.sceneNumber.OnChange += OnSceneChanged;
 36
 737            CommonScriptableObjects.rendererState.OnChange += OnRendererStateChanged;
 738            Settings.i.audioSettings.OnChanged += OnSettingsChanged;
 739            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange += SceneSFXVolume_OnChange;
 740            settingsVolume = GetCalculatedSettingsVolume(Settings.i.audioSettings.Data);
 41
 742            isRendererActive = CommonScriptableObjects.rendererState.Get();
 743            isInsideScene = scene.isPersistent || scene.sceneData.sceneNumber == CommonScriptableObjects.sceneNumber.Get
 744        }
 45
 46        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 47        {
 748            CommonScriptableObjects.sceneNumber.OnChange -= OnSceneChanged;
 749            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChanged;
 750            Settings.i.audioSettings.OnChanged -= OnSettingsChanged;
 751            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange -= SceneSFXVolume_OnChange;
 52
 753            WebInterface.KillAudioStream(scene.sceneData.sceneNumber, entity.entityId);
 754        }
 55
 56        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBAudioStream model)
 57        {
 58            // Nothing has change so we do an early return
 1059            if (!StateHasChange(model))
 060                return;
 61
 62            // We update the model and the volume
 1063            UpdateModel(model);
 64
 1065            isValidUrl = UtilsScene.TryGetMediaUrl(model.Url, scene.contentProvider,
 66                scene.sceneData.requiredPermissions, scene.sceneData.allowedMediaHostnames, out string newUrl);
 67
 1068            url = newUrl;
 69
 1070            if (!isValidUrl)
 71            {
 072                url = string.Empty;
 073                StopStreaming();
 74            }
 75
 76            // In case that the audio stream can't be played we do an early return
 1077            if (!CanAudioStreamBePlayed() || !isValidUrl)
 778                return;
 79
 80            // If everything went ok, we update the state
 381            SendUpdateAudioStreamEvent(model.Playing);
 382        }
 83
 84        private void UpdateModel(PBAudioStream model)
 85        {
 1086            this.model = model;
 1087            currentVolume = model.GetVolume() * settingsVolume;
 1088        }
 89
 90        private bool StateHasChange(PBAudioStream model)
 91        {
 92            // First time that the model come so the state has change
 1093            if (this.model == null)
 794                return true;
 95
 396            bool shouldChangeState = isPlaying && !model.Playing;
 397            bool shouldUpdateVolume = Mathf.Approximately(currentVolume, model.GetVolume());
 398            bool shouldUpdateUrl = this.model.Url == model.Url;
 99
 3100            return shouldChangeState || shouldUpdateVolume || shouldUpdateUrl;
 101        }
 102
 103        private void ConditionsToPlayChanged()
 104        {
 0105            bool canBePlayed = CanAudioStreamBePlayed();
 106
 0107            if (isPlaying && !canBePlayed)
 0108                StopStreaming();
 109
 0110            if (!isPlaying && canBePlayed && model.Playing && isValidUrl)
 0111                StartStreaming();
 0112        }
 113
 114        private bool CanAudioStreamBePlayed()
 115        {
 10116            return isInsideScene && isRendererActive;
 117        }
 118
 119        private void OnSceneChanged(int sceneNumber, int prevSceneNumber)
 120        {
 0121            isInsideScene = sceneNumber == scene.sceneData.sceneNumber;
 0122            ConditionsToPlayChanged();
 0123        }
 124
 125        private void OnRendererStateChanged(bool isEnable, bool prevState)
 126        {
 0127            isRendererActive = isEnable;
 0128            ConditionsToPlayChanged();
 0129        }
 130
 131        private void OnSettingsChanged(AudioSettings settings)
 132        {
 0133            float newSettingsVolume = GetCalculatedSettingsVolume(settings);
 134
 0135            if (Math.Abs(settingsVolume - newSettingsVolume) > Mathf.Epsilon)
 136            {
 0137                settingsVolume = newSettingsVolume;
 138
 0139                if (isValidUrl)
 0140                    SendUpdateAudioStreamEvent(isPlaying);
 141            }
 0142        }
 143
 144        private float GetCalculatedSettingsVolume(AudioSettings audioSettings)
 145        {
 7146            return Utils.ToVolumeCurve(DataStore.i.virtualAudioMixer.sceneSFXVolume.Get() * audioSettings.sceneSFXVolume
 147        }
 148
 149        private void SceneSFXVolume_OnChange(float current, float previous)
 150        {
 0151            OnSettingsChanged(Settings.i.audioSettings.Data);
 0152        }
 153
 154        private void StopStreaming()
 155        {
 0156            SendUpdateAudioStreamEvent(false);
 0157        }
 158
 159        private void StartStreaming()
 160        {
 0161            SendUpdateAudioStreamEvent(true);
 0162        }
 163
 164        private void SendUpdateAudioStreamEvent(bool play)
 165        {
 3166            isPlaying = play;
 3167            WebInterface.SendAudioStreamEventForEntity(url, isPlaying, currentVolume, scene.sceneData.sceneNumber, entit
 3168        }
 169    }
 170}