public static SongData Load(FormatData data) { if (FormatData.LocalSongCache && Cache.ContainsKey(data)) { return(Cache[data]); } CacheMutex.WaitOne(); SongData song; try { Stream stream = data.GetStream("songdata"); song = SongData.Create(stream); data.CloseStream(stream); } catch (Exception ex) { CacheMutex.ReleaseMutex(); throw ex; } CacheMutex.ReleaseMutex(); song.PropertyChanged += new Action <SongData>(data.Song_PropertyChanged); if (FormatData.LocalSongCache) { Cache[data] = song; } return(song); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); DirectoryNode dir = data.GetDirectoryStructure(path); List <DirectoryNode> dirs = new List <DirectoryNode>(); dirs.Add(dir); dirs.AddRange(dir.Directories); progress.NewTask(dirs.Count); foreach (DirectoryNode songdir in dirs) { data.Session["songdir"] = songdir; FileNode datafile = songdir.Navigate("data", false, true) as FileNode; FileNode newdatafile = songdir.Navigate("songdata", false, true) as FileNode; if (datafile == null && newdatafile == null) { Exceptions.Warning("Unable to find a custom in " + songdir.Filename); continue; } try { SongData song = null; if (datafile != null) { song = HarmonixMetadata.GetSongData(data, DTB.Create(new EndianReader(datafile.Data, Endianness.LittleEndian))); datafile.Data.Close(); AddSongOld(data, song, progress); } else { song = SongData.Create(newdatafile.Data); newdatafile.Data.Close(); AddSongNew(data, song, progress); } } catch (Exception exception) { Exceptions.Error(exception, "Unable to open the custom from " + songdir.Filename); } progress.Progress(); } progress.EndTask(); return(data); }