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);
|
Array.Sort(Tracks.Select(track => track.Name).ToArray(), Tracks);
|
||||||
|
|
||||||
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||||
UnityWebRequest[] requests = new UnityWebRequest[Tracks.Length * 2];
|
Dictionary<string, (UnityWebRequest Request, List<Action<AudioClip>> Setters)> requests = [];
|
||||||
for (int i = 0; i < Tracks.Length; i++)
|
requests.EnsureCapacity(Tracks.Length * 2);
|
||||||
|
|
||||||
|
foreach (var track in Tracks)
|
||||||
{
|
{
|
||||||
Track track = Tracks[i];
|
foreach (var (fileName, setter) in new (string, Action<AudioClip>)[]
|
||||||
requests[i * 2] = UnityWebRequestMultimedia.GetAudioClip($"file://{dir}/{track.FileNameIntro}", track.AudioType);
|
{
|
||||||
requests[i * 2 + 1] = UnityWebRequestMultimedia.GetAudioClip($"file://{dir}/{track.FileNameLoop}", track.AudioType);
|
(track.FileNameIntro, clip => track.LoadedIntro = clip),
|
||||||
requests[i * 2].SendWebRequest();
|
(track.FileNameLoop, clip => track.LoadedLoop = clip),
|
||||||
requests[i * 2 + 1].SendWebRequest();
|
})
|
||||||
|
{
|
||||||
|
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];
|
var clip = DownloadHandlerAudioClip.GetContent(tuple.Request);
|
||||||
track.LoadedIntro = DownloadHandlerAudioClip.GetContent(requests[i * 2]);
|
foreach (var setter in tuple.Setters)
|
||||||
track.LoadedLoop = DownloadHandlerAudioClip.GetContent(requests[i * 2 + 1]);
|
{
|
||||||
#if DEBUG
|
setter(clip);
|
||||||
Debug.Log($"{nameof(MuzikaGromche)} Track {track.Name} {track.LoadedIntro.length:N4} {track.LoadedLoop.length:N4}");
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#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);
|
Config = new Config(base.Config);
|
||||||
DiscoBallManager.Load();
|
DiscoBallManager.Load();
|
||||||
PoweredLightsAnimators.Load();
|
PoweredLightsAnimators.Load();
|
||||||
|
@ -598,7 +618,7 @@ namespace MuzikaGromche
|
||||||
}
|
}
|
||||||
else
|
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));
|
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.
|
// How often this track should be chosen, relative to the sum of weights of all tracks.
|
||||||
public ConfigEntry<int> Weight = null!;
|
public ConfigEntry<int> Weight = null!;
|
||||||
|
|
||||||
public string FileNameIntro => $"{Name}Intro.{Ext}";
|
private string? FileNameIntroOverride = null;
|
||||||
public string FileNameLoop => $"{Name}Loop.{Ext}";
|
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
|
private string Ext => AudioType switch
|
||||||
{
|
{
|
||||||
AudioType.MPEG => "mp3",
|
AudioType.MPEG => "mp3",
|
||||||
|
|
Loading…
Reference in New Issue