< 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:22
Coverable lines:63
Total lines:161
Line coverage:65% (41 of 63)
Covered branches:0
Total branches:0
Covered methods:12
Total methods:16
Method coverage:75% (12 of 16)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
GetDataFromPb(...)0%30500%
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;
 6using Decentraland.Sdk.Ecs6;
 7
 8namespace DCL.Components
 9{
 10    public class DCLAudioClip : BaseDisposable
 11    {
 12        [Serializable]
 13        public class Model : BaseModel
 14        {
 15            public string url;
 16            public bool loop;
 5917            public bool shouldTryToLoad = true;
 18
 19            [Range(0f, 1f)]
 5920            public double volume = 1f;
 21
 22            public override BaseModel GetDataFromJSON(string json) =>
 2023                Utils.SafeFromJson<Model>(json);
 24
 25            public override BaseModel GetDataFromPb(ComponentBodyPayload pbModel)
 26            {
 027                if (pbModel.PayloadCase != ComponentBodyPayload.PayloadOneofCase.AudioClip)
 028                    return Utils.SafeUnimplemented<DCLAudioClip, Model>(expected: ComponentBodyPayload.PayloadOneofCase.
 29
 030                var pb = new Model();
 031                if (pbModel.AudioClip.HasLoop) pb.loop = pbModel.AudioClip.Loop;
 032                if (pbModel.AudioClip.HasVolume) pb.volume = pbModel.AudioClip.Volume;
 033                if (pbModel.AudioClip.HasUrl) pb.url = pbModel.AudioClip.Url;
 34
 035                return pb;
 36            }
 37        }
 38
 39        public AudioClip audioClip;
 40        private bool isDisposed = false;
 41        private AssetPromise_AudioClip audioClipPromise = null;
 42
 43        public enum LoadState
 44        {
 45            IDLE,
 46            LOADING_IN_PROGRESS,
 47            LOADING_FAILED,
 48            LOADING_COMPLETED,
 49        }
 50
 12851        public LoadState loadingState { get; private set; }
 52        public event Action<DCLAudioClip> OnLoadingFinished;
 53
 1954        public DCLAudioClip()
 55        {
 1956            model = new Model();
 57
 1958            loadingState = LoadState.IDLE;
 1959        }
 60
 261        public double volume => ((Model) model).volume;
 62
 263        public bool isLoop => ((Model) model).loop;
 64
 265        public bool shouldTryLoad => ((Model) model).shouldTryToLoad;
 66
 067        public override int GetClassId() { return (int) CLASS_ID.AUDIO_CLIP; }
 68
 69        void OnComplete(Asset_AudioClip assetAudioClip)
 70        {
 1671            if (assetAudioClip.audioClip != null)
 72            {
 1673                if (this.audioClip != null)
 074                    DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 75
 1676                this.audioClip = assetAudioClip.audioClip;
 1677                loadingState = LoadState.LOADING_COMPLETED;
 78
 1679                DataStore.i.sceneWorldObjects.AddAudioClip(scene.sceneData.sceneNumber, audioClip);
 80            }
 81            else
 82            {
 083                loadingState = LoadState.LOADING_FAILED;
 84            }
 85
 1686            if (OnLoadingFinished != null)
 87            {
 088                OnLoadingFinished.Invoke(this);
 89            }
 1690        }
 91
 92        void OnFail(Asset_AudioClip assetAudioClip, Exception exception)
 93        {
 094            loadingState = LoadState.LOADING_FAILED;
 095            OnLoadingFinished?.Invoke(this);
 096        }
 97
 98        IEnumerator TryToLoad()
 99        {
 16100            if (loadingState != LoadState.LOADING_IN_PROGRESS
 101                && loadingState != LoadState.LOADING_COMPLETED)
 102            {
 16103                loadingState = LoadState.LOADING_IN_PROGRESS;
 16104                Model model = (Model) this.model;
 105
 16106                audioClipPromise = new AssetPromise_AudioClip(model.url, scene.contentProvider);
 16107                audioClipPromise.OnSuccessEvent += OnComplete;
 16108                audioClipPromise.OnFailEvent += OnFail;
 109
 16110                AssetPromiseKeeper_AudioClip.i.Keep(audioClipPromise);
 111
 16112                yield return audioClipPromise;
 113            }
 16114        }
 115
 116        void Unload()
 117        {
 0118            loadingState = LoadState.IDLE;
 0119            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 120
 0121            if (this.audioClip != null)
 0122                DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 0123        }
 124
 125        public override IEnumerator ApplyChanges(BaseModel newModel)
 126        {
 40127            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 128
 129            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 130            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 20131            if (isDisposed)
 0132                yield break;
 133
 20134            Model model = (Model) newModel;
 135
 20136            if (!string.IsNullOrEmpty(model.url))
 137            {
 16138                if (model.shouldTryToLoad && audioClip == null)
 139                {
 16140                    yield return TryToLoad();
 141                }
 0142                else if (!model.shouldTryToLoad && audioClip != null)
 143                {
 0144                    Unload();
 145                }
 146            }
 147
 20148            yield return null;
 20149        }
 150
 151        public override void Dispose()
 152        {
 2153            if (this.audioClip != null)
 1154                DataStore.i.sceneWorldObjects.RemoveAudioClip(scene.sceneData.sceneNumber, audioClip);
 155
 2156            isDisposed = true;
 2157            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 2158            base.Dispose();
 2159        }
 160    }
 161}