Ensure BagFile.GetStream returns unique streams.

GetStream must return a unique stream on each call to ensure multiple callers can read their streams without affecting each other. As bag file returned multiple references to the same underlying stream, it was possible for multiple callers to disturb reads of each other, and thus read bad audio from each file.
This commit is contained in:
RoosterDragon
2018-04-10 20:11:16 +01:00
committed by abcdefg30
parent 68ad4b6092
commit 4da9b6f00a

View File

@@ -46,8 +46,6 @@ namespace OpenRA.Mods.Cnc.FileSystem
if (!index.TryGetValue(filename, out entry))
return null;
s.Seek(entry.Offset, SeekOrigin.Begin);
var waveHeaderMemoryStream = new MemoryStream();
var channels = (entry.Flags & 1) > 0 ? 2 : 1;
@@ -100,7 +98,8 @@ namespace OpenRA.Mods.Cnc.FileSystem
waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin);
// Construct a merged stream
var mergedStream = new MergedStream(waveHeaderMemoryStream, s);
var waveStream = SegmentStream.CreateWithoutOwningStream(s, entry.Offset, (int)entry.Length);
var mergedStream = new MergedStream(waveHeaderMemoryStream, waveStream);
mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length);
return mergedStream;