< Summary

Class:DCL.AssetPromise_AudioClip
Assembly:AssetPromiseKeeper
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/AudioClip/AssetPromise_AudioClip.cs
Covered lines:41
Uncovered lines:14
Coverable lines:55
Total lines:148
Line coverage:74.5% (41 of 55)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AssetPromise_AudioClip()0%110100%
AssetPromise_AudioClip(...)0%110100%
AssetPromise_AudioClip(...)0%220100%
OnLoad(...)0%3.333066.67%
CoroutineQueueLoader()0%20400%
GetAudioClipFromRequest(...)0%440100%
OnCancelLoading()0%220100%
AddToLibrary()0%2.062075%
OnBeforeLoadOrReuse()0%110100%
OnAfterLoadOrReuse()0%110100%
GetId()0%110100%
GetAudioTypeFromUrlName(...)0%6.325062.5%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/AudioClip/AssetPromise_AudioClip.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using System.Linq;
 5using UnityEngine;
 6using UnityEngine.Networking;
 7using Debug = UnityEngine.Debug;
 8
 9namespace DCL
 10{
 11    public class AssetPromise_AudioClip : AssetPromise<Asset_AudioClip>
 12    {
 13
 14        struct QueueItem
 15        {
 16            public AssetPromise_AudioClip promise;
 17            public UnityWebRequest request;
 18        }
 19
 20        private readonly string url;
 21        private readonly string id;
 22        private readonly AudioType audioType;
 23        private readonly IWebRequestController webRequestController;
 24        private IWebRequestAsyncOperation webRequestAsyncOperation;
 25        private Action OnSuccess;
 26        private Coroutine coroutineQueueLoader;
 127        private static Queue<QueueItem> requestQueue = new Queue<QueueItem>();
 128        private static readonly RendererState renderState = CommonScriptableObjects.rendererState;
 29        private QueueItem queueItem;
 7830        public AssetPromise_AudioClip(string clipPath, ContentProvider provider) : this(clipPath, provider, Environment.
 31
 3932        public AssetPromise_AudioClip(string clipPath, ContentProvider provider, IWebRequestController webRequestControl
 33        {
 3934            this.url = provider.GetContentsUrl(clipPath);
 3935            this.id = this.url != null ? this.url.Substring(this.url.LastIndexOf('/') + 1) : $"{GetHashCode()}";
 3936            this.audioType = GetAudioTypeFromUrlName(clipPath);
 3937            this.webRequestController = webRequestController;
 3938        }
 39
 40        protected override void OnLoad(Action OnSuccess, Action<Exception> OnFail)
 41        {
 3842            this.OnSuccess = OnSuccess;
 43
 3844            if (string.IsNullOrEmpty(url))
 45            {
 046                OnFail?.Invoke(new Exception("Audio clip url is null or empty"));
 047                return;
 48            }
 3849            webRequestAsyncOperation = webRequestController.GetAudioClip(url, audioType,
 50                request =>
 51                {
 2352                    if (renderState.Get())
 53                    {
 054                        queueItem = new QueueItem { promise = this, request = request.webRequest};
 055                        requestQueue.Enqueue(queueItem);
 056                        coroutineQueueLoader = CoroutineStarter.Start(CoroutineQueueLoader());
 57                    }
 58                    else
 59                    {
 2360                        GetAudioClipFromRequest(this, request.webRequest);
 61                    }
 2362                },
 63                request =>
 64                {
 365                    OnFail?.Invoke(new Exception($"Audio clip failed to fetch: {request?.webRequest?.error}"));
 366                }, disposeOnCompleted: false);
 3867        }
 68
 69        /// <summary>
 70        /// This coroutine prevents multiple audio clips being loaded at the same time, reducing hiccups in the process
 71        /// </summary>
 72        private IEnumerator CoroutineQueueLoader()
 73        {
 074            while (!requestQueue.Peek().Equals(queueItem))
 75            {
 076                yield return new WaitForEndOfFrame();
 77            }
 78
 079            var request = requestQueue.Dequeue();
 080            GetAudioClipFromRequest(request.promise, request.request);
 081        }
 82
 83        static void GetAudioClipFromRequest(AssetPromise_AudioClip promise, UnityWebRequest www)
 84        {
 2385            ulong wwwDownloadedBytes = www.downloadedBytes;
 86
 87            // files bigger than 1MB will be treated as streaming
 2388            if (wwwDownloadedBytes > 1000000)
 89            {
 1190                ((DownloadHandlerAudioClip)www.downloadHandler).streamAudio = true;
 91            }
 92
 2393            promise.asset.audioClip = DownloadHandlerAudioClip.GetContent(www);
 2394            promise.OnSuccess?.Invoke();
 2395            promise.webRequestAsyncOperation?.Dispose();
 2396        }
 97
 98        protected override void OnCancelLoading()
 99        {
 15100            requestQueue = new Queue<QueueItem>(requestQueue.Where(i => i.promise != this));
 15101            CoroutineStarter.Stop(coroutineQueueLoader);
 15102            webRequestAsyncOperation?.Dispose();
 15103            webRequestAsyncOperation = null;
 15104        }
 105
 106        protected override bool AddToLibrary()
 107        {
 23108            if (!library.Add(asset))
 109            {
 0110                return false;
 111            }
 23112            asset = library.Get(asset.id);
 23113            return true;
 114        }
 115
 41116        protected override void OnBeforeLoadOrReuse() { }
 117
 26118        protected override void OnAfterLoadOrReuse() { }
 119
 120        public override object GetId()
 121        {
 199122            return id;
 123        }
 124
 125        private static AudioType GetAudioTypeFromUrlName(string url)
 126        {
 39127            if (string.IsNullOrEmpty(url))
 128            {
 0129                Debug.LogError("GetAudioTypeFromUrlName >>> Null url!");
 0130                return AudioType.UNKNOWN;
 131            }
 132
 39133            string ext = url.Substring(url.Length - 3).ToLower();
 134
 135            switch (ext)
 136            {
 137                case "mp3":
 0138                    return AudioType.MPEG;
 139                case "wav":
 11140                    return AudioType.WAV;
 141                case "ogg":
 25142                    return AudioType.OGGVORBIS;
 143                default:
 3144                    return AudioType.UNKNOWN;
 145            }
 146        }
 147    }
 148}