< Summary

Class:DCL.Components.DCLAudioClip
Assembly:MainScripts
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioClip.cs
Covered lines:35
Uncovered lines:17
Coverable lines:52
Total lines:139
Line coverage:67.3% (35 of 52)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
DCLAudioClip()0%110100%
GetClassId()0%2100%
OnComplete(...)0%3.143075%
OnFail(...)0%6200%
TryToLoad()0%550100%
Unload()0%2100%
ApplyChanges()0%14.2512075%
Dispose()0%110100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Helpers;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL.Components
 8{
 9    public class DCLAudioClip : BaseDisposable
 10    {
 11        [Serializable]
 12        public class Model : BaseModel
 13        {
 14            public string url;
 15            public bool loop = false;
 5316            public bool shouldTryToLoad = true;
 17
 18            [Range(0f, 1f)]
 5319            public double volume = 1f;
 20
 1821            public override BaseModel GetDataFromJSON(string json) { return Utils.SafeFromJson<Model>(json); }
 22        }
 23
 24        public AudioClip audioClip;
 25        private bool isDisposed = false;
 26        private AssetPromise_AudioClip audioClipPromise = null;
 27
 28        public enum LoadState
 29        {
 30            IDLE,
 31            LOADING_IN_PROGRESS,
 32            LOADING_FAILED,
 33            LOADING_COMPLETED,
 34        }
 35
 036        public LoadState loadingState { get; private set; }
 37        public event Action<DCLAudioClip> OnLoadingFinished;
 38
 1739        public DCLAudioClip()
 40        {
 1741            model = new Model();
 42
 1743            loadingState = LoadState.IDLE;
 1744        }
 45
 046        public double volume => ((Model) model).volume;
 47
 048        public bool isLoop => ((Model) model).loop;
 49
 050        public bool shouldTryLoad => ((Model) model).shouldTryToLoad;
 51
 052        public override int GetClassId() { return (int) CLASS_ID.AUDIO_CLIP; }
 53
 54        void OnComplete(Asset_AudioClip assetAudioClip)
 55        {
 1356            if (assetAudioClip.audioClip != null)
 57            {
 1358                this.audioClip = assetAudioClip.audioClip;
 1359                loadingState = LoadState.LOADING_COMPLETED;
 1360            }
 61            else
 62            {
 063                loadingState = LoadState.LOADING_FAILED;
 64            }
 65
 1366            if (OnLoadingFinished != null)
 67            {
 068                OnLoadingFinished.Invoke(this);
 69            }
 1370        }
 71
 72        void OnFail(Asset_AudioClip assetAudioClip)
 73        {
 074            loadingState = LoadState.LOADING_FAILED;
 75
 076            if (OnLoadingFinished != null)
 77            {
 078                OnLoadingFinished.Invoke(this);
 79            }
 080        }
 81
 82        IEnumerator TryToLoad()
 83        {
 1484            if (loadingState != LoadState.LOADING_IN_PROGRESS
 85                && loadingState != LoadState.LOADING_COMPLETED)
 86            {
 1487                loadingState = LoadState.LOADING_IN_PROGRESS;
 1488                Model model = (Model) this.model;
 89
 1490                audioClipPromise = new AssetPromise_AudioClip(model.url, scene.contentProvider);
 1491                audioClipPromise.OnSuccessEvent += OnComplete;
 1492                audioClipPromise.OnFailEvent += OnFail;
 93
 1494                AssetPromiseKeeper_AudioClip.i.Keep(audioClipPromise);
 95
 1496                yield return audioClipPromise;
 97            }
 1498        }
 99
 100        void Unload()
 101        {
 0102            loadingState = LoadState.IDLE;
 0103            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 0104        }
 105
 106        public override IEnumerator ApplyChanges(BaseModel newModel)
 107        {
 36108            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 109
 110            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 111            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 18112            if (isDisposed)
 0113                yield break;
 114
 18115            Model model = (Model) newModel;
 116
 18117            if (!string.IsNullOrEmpty(model.url))
 118            {
 14119                if (model.shouldTryToLoad && audioClip == null)
 120                {
 14121                    yield return TryToLoad();
 14122                }
 0123                else if (!model.shouldTryToLoad && audioClip != null)
 124                {
 0125                    Unload();
 126                }
 127            }
 128
 18129            yield return null;
 18130        }
 131
 132        public override void Dispose()
 133        {
 17134            isDisposed = true;
 17135            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 17136            base.Dispose();
 17137        }
 138    }
 139}