Allow tracks to share common audio clip files
Send one request per file name. File names can be explicitly overridden.
This commit is contained in:
		
							parent
							
								
									fc3a62e511
								
							
						
					
					
						commit
						47f984cd28
					
				|  | @ -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<string, (UnityWebRequest Request, List<Action<AudioClip>> 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<AudioClip>)[] | ||||
|                 { | ||||
|                     (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<int> 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", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue