diff --git a/MuzikaGromche/Plugin.cs b/MuzikaGromche/Plugin.cs index 379afae..72db9f8 100644 --- a/MuzikaGromche/Plugin.cs +++ b/MuzikaGromche/Plugin.cs @@ -559,29 +559,49 @@ namespace MuzikaGromche Array.Sort(Tracks.Select(track => track.Name).ToArray(), Tracks); string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - UnityWebRequest[] requests = new UnityWebRequest[Tracks.Length * 2]; - for (int i = 0; i < Tracks.Length; i++) + Dictionary> Setters)> requests = []; + requests.EnsureCapacity(Tracks.Length * 2); + + foreach (var track in Tracks) { - Track track = Tracks[i]; - requests[i * 2] = UnityWebRequestMultimedia.GetAudioClip($"file://{dir}/{track.FileNameIntro}", track.AudioType); - requests[i * 2 + 1] = UnityWebRequestMultimedia.GetAudioClip($"file://{dir}/{track.FileNameLoop}", track.AudioType); - requests[i * 2].SendWebRequest(); - requests[i * 2 + 1].SendWebRequest(); + foreach (var (fileName, setter) in new (string, Action)[] + { + (track.FileNameIntro, clip => track.LoadedIntro = clip), + (track.FileNameLoop, clip => track.LoadedLoop = clip), + }) + { + if (requests.TryGetValue(fileName, out var tuple)) + { + tuple.Setters.Add(setter); + } + else + { + var request = UnityWebRequestMultimedia.GetAudioClip($"file://{dir}/{fileName}", track.AudioType); + request.SendWebRequest(); + requests[fileName] = (request, [setter]); + } + } } - while (!requests.All(request => request.isDone)) { } + while (!requests.Values.All(tuple => tuple.Request.isDone)) { } - if (requests.All(request => request.result == UnityWebRequest.Result.Success)) + if (requests.Values.All(tuple => tuple.Request.result == UnityWebRequest.Result.Success)) { - for (int i = 0; i < Tracks.Length; i++) + + foreach (var (fileName, tuple) in requests) { - Track track = Tracks[i]; - track.LoadedIntro = DownloadHandlerAudioClip.GetContent(requests[i * 2]); - track.LoadedLoop = DownloadHandlerAudioClip.GetContent(requests[i * 2 + 1]); -#if DEBUG - Debug.Log($"{nameof(MuzikaGromche)} Track {track.Name} {track.LoadedIntro.length:N4} {track.LoadedLoop.length:N4}"); -#endif + var clip = DownloadHandlerAudioClip.GetContent(tuple.Request); + foreach (var setter in tuple.Setters) + { + setter(clip); + } } +#if DEBUG + foreach (var track in Tracks) + { + Debug.Log($"{nameof(MuzikaGromche)} Track {track.Name} {track.LoadedIntro.length:N4} {track.LoadedLoop.length:N4}"); + } +#endif Config = new Config(base.Config); DiscoBallManager.Load(); PoweredLightsAnimators.Load(); @@ -598,7 +618,7 @@ namespace MuzikaGromche } else { - var failed = requests.Where(request => request.result != UnityWebRequest.Result.Success).Select(request => request.GetUrl()); + var failed = requests.Values.Where(tuple => tuple.Request.result != UnityWebRequest.Result.Success).Select(tuple => tuple.Request.GetUrl()); Logger.LogError("Could not load audio file " + string.Join(", ", failed)); } } @@ -740,8 +760,20 @@ namespace MuzikaGromche // How often this track should be chosen, relative to the sum of weights of all tracks. public ConfigEntry Weight = null!; - public string FileNameIntro => $"{Name}Intro.{Ext}"; - public string FileNameLoop => $"{Name}Loop.{Ext}"; + private string? FileNameIntroOverride = null; + public string FileNameIntro + { + get => FileNameIntroOverride ?? $"{Name}Intro.{Ext}"; + set => FileNameIntroOverride = value; + } + + private string? FileNameLoopOverride = null; + public string FileNameLoop + { + get => FileNameLoopOverride ?? $"{Name}Loop.{Ext}"; + set => FileNameLoopOverride = value; + } + private string Ext => AudioType switch { AudioType.MPEG => "mp3",