forked from nikita/muzika-gromche
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]);
|
||||
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
|
||||
}
|
||||
#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