diff --git a/OpenRA.Game/FileSystem/MixFile.cs b/OpenRA.Game/FileSystem/MixFile.cs index 8a8f7b0d6e..64747f779e 100644 --- a/OpenRA.Game/FileSystem/MixFile.cs +++ b/OpenRA.Game/FileSystem/MixFile.cs @@ -78,9 +78,12 @@ namespace OpenRA.FileSystem { if (kv.Key == dbNameClassic || kv.Key == dbNameCRC) { - var db = new XccLocalDatabase(GetContent(kv.Value)); - foreach (var e in db.Entries) - allPossibleFilenames.Add(e); + using (var content = GetContent(kv.Value)) + { + var db = new XccLocalDatabase(content); + foreach (var e in db.Entries) + allPossibleFilenames.Add(e); + } break; } diff --git a/OpenRA.Game/GameRules/MusicInfo.cs b/OpenRA.Game/GameRules/MusicInfo.cs index e14297a2d6..67108271d0 100644 --- a/OpenRA.Game/GameRules/MusicInfo.cs +++ b/OpenRA.Game/GameRules/MusicInfo.cs @@ -42,18 +42,24 @@ namespace OpenRA.GameRules if (!fileSystem.TryOpen(Filename, out stream)) return; - Exists = true; - ISoundFormat soundFormat; - foreach (var loader in Game.ModData.SoundLoaders) + try { - if (loader.TryParseSound(stream, out soundFormat)) + Exists = true; + foreach (var loader in Game.ModData.SoundLoaders) { - Length = (int)soundFormat.LengthInSeconds; - break; + ISoundFormat soundFormat; + if (loader.TryParseSound(stream, out soundFormat)) + { + Length = (int)soundFormat.LengthInSeconds; + soundFormat.Dispose(); + break; + } } } - - stream.Dispose(); + finally + { + stream.Dispose(); + } } } } diff --git a/OpenRA.Game/Sound/Sound.cs b/OpenRA.Game/Sound/Sound.cs index aab58260ab..8c17f8db75 100644 --- a/OpenRA.Game/Sound/Sound.cs +++ b/OpenRA.Game/Sound/Sound.cs @@ -23,7 +23,7 @@ namespace OpenRA bool TryParseSound(Stream stream, out ISoundFormat sound); } - public interface ISoundFormat + public interface ISoundFormat : IDisposable { int Channels { get; } int SampleBits { get; } @@ -67,8 +67,12 @@ namespace OpenRA { stream.Position = 0; if (loader.TryParseSound(stream, out soundFormat)) - return soundEngine.AddSoundSourceFromMemory( + { + var source = soundEngine.AddSoundSourceFromMemory( soundFormat.GetPCMInputStream().ReadAllBytes(), soundFormat.Channels, soundFormat.SampleBits, soundFormat.SampleRate); + soundFormat.Dispose(); + return source; + } } } diff --git a/OpenRA.Mods.Common/AudioLoaders/AudLoader.cs b/OpenRA.Mods.Common/AudioLoaders/AudLoader.cs index 5561f15400..17e9420968 100644 --- a/OpenRA.Mods.Common/AudioLoaders/AudLoader.cs +++ b/OpenRA.Mods.Common/AudioLoaders/AudLoader.cs @@ -51,13 +51,14 @@ namespace OpenRA.Mods.Common.AudioLoaders } } - public class AudFormat : ISoundFormat + public sealed class AudFormat : ISoundFormat { public int Channels { get { return 1; } } public int SampleBits { get { return 16; } } public int SampleRate { get { return sampleRate; } } public float LengthInSeconds { get { return AudReader.SoundLength(stream); } } public Stream GetPCMInputStream() { return new MemoryStream(rawData.Value); } + public void Dispose() { stream.Dispose(); } int sampleRate; Lazy rawData; diff --git a/OpenRA.Mods.Common/AudioLoaders/VocLoader.cs b/OpenRA.Mods.Common/AudioLoaders/VocLoader.cs index 142ad41069..580b291100 100644 --- a/OpenRA.Mods.Common/AudioLoaders/VocLoader.cs +++ b/OpenRA.Mods.Common/AudioLoaders/VocLoader.cs @@ -35,13 +35,14 @@ namespace OpenRA.Mods.Common.AudioLoaders } } - public class VocFormat : ISoundFormat + public sealed class VocFormat : ISoundFormat { public int SampleBits { get { return 8; } } public int Channels { get { return 1; } } public int SampleRate { get; private set; } public float LengthInSeconds { get { return (float)totalSamples / SampleRate; } } public Stream GetPCMInputStream() { return new VocStream(this); } + public void Dispose() { stream.Dispose(); } int totalSamples = 0; int samplePosition = 0; diff --git a/OpenRA.Mods.Common/AudioLoaders/WavLoader.cs b/OpenRA.Mods.Common/AudioLoaders/WavLoader.cs index e651c21083..6bacf051d8 100644 --- a/OpenRA.Mods.Common/AudioLoaders/WavLoader.cs +++ b/OpenRA.Mods.Common/AudioLoaders/WavLoader.cs @@ -48,13 +48,14 @@ namespace OpenRA.Mods.Common.AudioLoaders } } - public class WavFormat : ISoundFormat + public sealed class WavFormat : ISoundFormat { public int Channels { get { return reader.Value.Channels; } } public int SampleBits { get { return reader.Value.BitsPerSample; } } public int SampleRate { get { return reader.Value.SampleRate; } } public float LengthInSeconds { get { return WavReader.WaveLength(stream); } } public Stream GetPCMInputStream() { return new MemoryStream(reader.Value.RawOutput); } + public void Dispose() { stream.Dispose(); } Lazy reader;