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:
@@ -46,8 +46,6 @@ namespace OpenRA.Mods.Cnc.FileSystem
|
|||||||
if (!index.TryGetValue(filename, out entry))
|
if (!index.TryGetValue(filename, out entry))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
s.Seek(entry.Offset, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
var waveHeaderMemoryStream = new MemoryStream();
|
var waveHeaderMemoryStream = new MemoryStream();
|
||||||
|
|
||||||
var channels = (entry.Flags & 1) > 0 ? 2 : 1;
|
var channels = (entry.Flags & 1) > 0 ? 2 : 1;
|
||||||
@@ -100,7 +98,8 @@ namespace OpenRA.Mods.Cnc.FileSystem
|
|||||||
waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin);
|
waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
// Construct a merged stream
|
// 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);
|
mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length);
|
||||||
|
|
||||||
return mergedStream;
|
return mergedStream;
|
||||||
|
|||||||
Reference in New Issue
Block a user