< Summary

Class:DCL.ECSComponents.ECSAudioStreamComponentHandler
Assembly:DCL.ECSComponents.AudioStream
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/AudioStream/Handler/ECSAudioStreamComponentHandler.cs
Covered lines:44
Uncovered lines:23
Coverable lines:67
Total lines:160
Line coverage:65.6% (44 of 67)
Covered branches:0
Total branches:0

Metrics

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

File(s)

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

#LineLine coverage
 1using System;
 2using DCL.Controllers;
 3using DCL.ECSRuntime;
 4using DCL.Helpers;
 5using DCL.Interface;
 6using DCL.Models;
 7using DCL.SettingsCommon;
 8using UnityEngine;
 9using UnityEngine.Video;
 10using AudioSettings = DCL.SettingsCommon.AudioSettings;
 11
 12namespace DCL.ECSComponents
 13{
 14    public class ECSAudioStreamComponentHandler : IECSComponentHandler<PBAudioStream>
 15    {
 16        private float settingsVolume = 0;
 17
 018        internal float currentVolume = -1;
 19        internal bool isPlaying = false;
 20        internal AudioSource audioSource;
 21        internal PBAudioStream model;
 22        internal IParcelScene scene;
 23
 24        // Flags to check if we can activate the AudioStream
 25        internal bool isInsideScene = false;
 26        internal bool isRendererActive = false;
 27
 28        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 29        {
 730            this.scene = scene;
 731            audioSource = entity.gameObject.AddComponent<AudioSource>();
 32
 33            // If it is a smart wearable, we don't look up to see if the scene has change since the scene is global
 734            if(!scene.isPersistent)
 735                CommonScriptableObjects.sceneID.OnChange += OnSceneChanged;
 736            CommonScriptableObjects.rendererState.OnChange += OnRendererStateChanged;
 737            Settings.i.audioSettings.OnChanged += OnSettingsChanged;
 738            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange += SceneSFXVolume_OnChange;
 739            settingsVolume = GetCalculatedSettingsVolume(Settings.i.audioSettings.Data);
 40
 741            isRendererActive = CommonScriptableObjects.rendererState.Get();
 742            isInsideScene = scene.isPersistent || scene.sceneData.id == CommonScriptableObjects.sceneID.Get();
 743        }
 44
 45        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 46        {
 847            Dispose();
 848        }
 49
 50        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBAudioStream model)
 51        {
 52            // Nothing has change so we do an early return
 1053            if(!StateHasChange(model))
 054                return;
 55
 56            // We update the model and the volume
 1057            UpdateModel(model);
 58
 59            // In case that the audio stream can't be played we do an early return
 1060            if (!CanAudioStreamBePlayed())
 261                return;
 62
 63            // If everything went ok, we update the state
 864            SendUpdateAudioStreamEvent(model.Playing);
 865        }
 66
 67        private void Dispose()
 68        {
 869            if(!scene.isPersistent)
 870                CommonScriptableObjects.sceneID.OnChange -= OnSceneChanged;
 871            CommonScriptableObjects.rendererState.OnChange -= OnRendererStateChanged;
 872            Settings.i.audioSettings.OnChanged -= OnSettingsChanged;
 873            DataStore.i.virtualAudioMixer.sceneSFXVolume.OnChange -= SceneSFXVolume_OnChange;
 74
 875            StopStreaming();
 76
 877            if (audioSource != null)
 78            {
 779                GameObject.Destroy(audioSource);
 780                audioSource = null;
 81            }
 882        }
 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();
 0109            if(!isPlaying && canBePlayed && model.Playing)
 0110                StartStreaming();
 0111        }
 112
 113        private bool CanAudioStreamBePlayed()
 114        {
 0115            return isInsideScene && isRendererActive;
 116        }
 117
 118        private void OnSceneChanged(string sceneId, string prevSceneId)
 119        {
 0120            isInsideScene = sceneId == scene.sceneData.id;
 0121            ConditionsToPlayChanged();
 0122        }
 123
 124        private void OnRendererStateChanged(bool isEnable, bool prevState)
 125        {
 0126            isRendererActive = isEnable;
 0127            ConditionsToPlayChanged();
 0128        }
 129
 130        private void OnSettingsChanged(AudioSettings settings)
 131        {
 0132            float newSettingsVolume = GetCalculatedSettingsVolume(settings);
 0133            if (Math.Abs(settingsVolume - newSettingsVolume) > Mathf.Epsilon)
 134            {
 0135                settingsVolume = newSettingsVolume;
 0136                SendUpdateAudioStreamEvent(isPlaying);
 137            }
 0138        }
 139
 7140        private float GetCalculatedSettingsVolume(AudioSettings audioSettings) { return Utils.ToVolumeCurve(DataStore.i.
 141
 0142        private void SceneSFXVolume_OnChange(float current, float previous) { OnSettingsChanged(Settings.i.audioSettings
 143
 144        private void StopStreaming()
 145        {
 8146            SendUpdateAudioStreamEvent(false);
 8147        }
 148
 149        private void StartStreaming()
 150        {
 0151            SendUpdateAudioStreamEvent(true);
 0152        }
 153
 154        private void SendUpdateAudioStreamEvent(bool play)
 155        {
 16156            isPlaying = play;
 16157            WebInterface.SendAudioStreamEvent(model.Url, isPlaying, currentVolume);
 16158        }
 159    }
 160}