using System.Collections.Generic; using System.IO; namespace ADOFAIRenderer.Util.Audio.Clip; /// /// File path of every external audio clip the game loads, keyed by the game's audioLib key. /// /// The game loads external clips with AudioManager.FindOrLoadAudioClipExternal(path, ...) and stores them in audioLib under /// Path.GetFileName(path) + "*external" (the same string becomes AudioClip.name). Recorded paths: /// - Song: Path.Combine(Path.GetDirectoryName(levelPath), levelData.songFilename) (scnGame song loading). /// - PlaySound event sound: Path.Combine(Path.GetDirectoryName(levelPath), hitsound) (scnGame.LoadSoundCo); /// ffxPlaySound plays it as hitsound + "*external". /// is called only when the game actually loads the file (the key is not in audioLib yet), /// so the recorded path is the file of the clip audioLib holds under that key. /// Thread-safe. /// internal static class AudioClipPaths { /// Suffix of the game's audioLib keys for external clips. public const string ExternalSuffix = "*external"; /// File path by audioLib key; also the lock object. Entries are kept for the whole game session. private static readonly Dictionary Paths = new(); /// audioLib key of an external clip loaded from . public static string KeyOf(string path) => Path.GetFileName(path) + ExternalSuffix; /// Records under (path), replacing an earlier path of the same key. public static void Record(string path) { if (string.IsNullOrEmpty(path)) return; lock (Paths) { Paths[KeyOf(path)] = path; } } /// Recorded path for an audioLib key (or AudioClip.name) of an external clip. public static bool TryGetPath(string key, out string path) { lock (Paths) { return Paths.TryGetValue(key, out path!); } } }