62 lines
1.5 KiB
C#
62 lines
1.5 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.IO;
|
|
|
|
namespace BizHawk.Emulation.DiscSystem
|
|
{
|
|
partial class Disc
|
|
{
|
|
internal class Blob_RawFile : IBlob
|
|
{
|
|
public string PhysicalPath
|
|
{
|
|
get
|
|
{
|
|
return physicalPath;
|
|
}
|
|
set
|
|
{
|
|
physicalPath = value;
|
|
length = new FileInfo(physicalPath).Length;
|
|
}
|
|
}
|
|
string physicalPath;
|
|
long length;
|
|
|
|
public long Offset = 0;
|
|
|
|
BufferedStream fs;
|
|
public void Dispose()
|
|
{
|
|
if (fs != null)
|
|
{
|
|
fs.Dispose();
|
|
fs = null;
|
|
}
|
|
}
|
|
public int Read(long byte_pos, byte[] buffer, int offset, int count)
|
|
{
|
|
//use quite a large buffer, because normally we will be reading these sequentially but in small chunks.
|
|
//this enhances performance considerably
|
|
|
|
//NOTE: wouldnt very large buffering create stuttering? this would depend on how it's implemented.
|
|
//really, we need a smarter asynchronous read-ahead buffer. that requires substantially more engineering, some kind of 'DiscUniverse' of carefully managed threads and such.
|
|
|
|
const int buffersize = 2352 * 75 * 2;
|
|
if (fs == null)
|
|
fs = new BufferedStream(new FileStream(physicalPath, FileMode.Open, FileAccess.Read, FileShare.Read), buffersize);
|
|
long target = byte_pos + Offset;
|
|
if (fs.Position != target)
|
|
fs.Position = target;
|
|
return fs.Read(buffer, offset, count);
|
|
}
|
|
public long Length
|
|
{
|
|
get
|
|
{
|
|
return length;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |