Dispose some sound streams.

This commit is contained in:
RoosterDragon
2016-12-23 19:37:17 +00:00
parent 53bd29351b
commit 226c0a050a
6 changed files with 32 additions and 16 deletions

View File

@@ -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;
}

View File

@@ -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();
}
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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<byte[]> rawData;

View File

@@ -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;

View File

@@ -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<WavReader> reader;