1
0
Fork 0

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:
ivan tkachenko 2025-08-14 04:37:50 +03:00
parent fc3a62e511
commit 47f984cd28
1 changed files with 51 additions and 19 deletions

View File

@ -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",