< Summary

Class:DCL.Components.DCLAudioClip
Assembly:DCL.Components.Audio
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioClip.cs
Covered lines:41
Uncovered lines:15
Coverable lines:56
Total lines:146
Line coverage:73.2% (41 of 56)
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%4.434070%
OnFail(...)0%6200%
TryToLoad()0%550100%
Unload()0%6200%
ApplyChanges()0%14.9212072.73%
Dispose()0%220100%

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;
 5916            public bool shouldTryToLoad = true;
 17
 18            [Range(0f, 1f)]
 5919            public double volume = 1f;
 20
 2021            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
 12236        public LoadState loadingState { get; private set; }
 37        public event Action<DCLAudioClip> OnLoadingFinished;
 38
 1939        public DCLAudioClip()
 40        {
 1941            model = new Model();
 42
 1943            loadingState = LoadState.IDLE;
 1944        }
 45
 246        public double volume => ((Model) model).volume;
 47
 248        public bool isLoop => ((Model) model).loop;
 49
 250        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        {
 1656            if (assetAudioClip.audioClip != null)
 57            {
 1658                if (this.audioClip != null)
 059                    DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 60
 1661                this.audioClip = assetAudioClip.audioClip;
 1662                loadingState = LoadState.LOADING_COMPLETED;
 63
 1664                DataStore.i.sceneWorldObjects.AddAudioClip(scene.sceneData.sceneNumber, audioClip);
 65            }
 66            else
 67            {
 068                loadingState = LoadState.LOADING_FAILED;
 69            }
 70
 1671            if (OnLoadingFinished != null)
 72            {
 073                OnLoadingFinished.Invoke(this);
 74            }
 1675        }
 76
 77        void OnFail(Asset_AudioClip assetAudioClip, Exception exception)
 78        {
 079            loadingState = LoadState.LOADING_FAILED;
 080            OnLoadingFinished?.Invoke(this);
 081        }
 82
 83        IEnumerator TryToLoad()
 84        {
 1685            if (loadingState != LoadState.LOADING_IN_PROGRESS
 86                && loadingState != LoadState.LOADING_COMPLETED)
 87            {
 1688                loadingState = LoadState.LOADING_IN_PROGRESS;
 1689                Model model = (Model) this.model;
 90
 1691                audioClipPromise = new AssetPromise_AudioClip(model.url, scene.contentProvider);
 1692                audioClipPromise.OnSuccessEvent += OnComplete;
 1693                audioClipPromise.OnFailEvent += OnFail;
 94
 1695                AssetPromiseKeeper_AudioClip.i.Keep(audioClipPromise);
 96
 1697                yield return audioClipPromise;
 98            }
 1699        }
 100
 101        void Unload()
 102        {
 0103            loadingState = LoadState.IDLE;
 0104            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 105
 0106            if (this.audioClip != null)
 0107                DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 0108        }
 109
 110        public override IEnumerator ApplyChanges(BaseModel newModel)
 111        {
 40112            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 113
 114            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 115            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 20116            if (isDisposed)
 0117                yield break;
 118
 20119            Model model = (Model) newModel;
 120
 20121            if (!string.IsNullOrEmpty(model.url))
 122            {
 16123                if (model.shouldTryToLoad && audioClip == null)
 124                {
 16125                    yield return TryToLoad();
 126                }
 0127                else if (!model.shouldTryToLoad && audioClip != null)
 128                {
 0129                    Unload();
 130                }
 131            }
 132
 20133            yield return null;
 20134        }
 135
 136        public override void Dispose()
 137        {
 2138            if (this.audioClip != null)
 1139                DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 140
 2141            isDisposed = true;
 2142            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 2143            base.Dispose();
 2144        }
 145    }
 146}