mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
Lib enhancements
This commit is contained in:
parent
1de07d0ee4
commit
0efdecb719
2 changed files with 169 additions and 3 deletions
|
@ -2012,14 +2012,14 @@ namespace FMOD
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
public RESULT createSound (uint8[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound)
|
public RESULT createSound (Span<uint8> data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound)
|
||||||
{
|
{
|
||||||
sound = null;
|
sound = null;
|
||||||
|
|
||||||
exinfo.cbsize = (int32)sizeof(CREATESOUNDEXINFO);
|
exinfo.cbsize = (int32)sizeof(CREATESOUNDEXINFO);
|
||||||
|
|
||||||
int soundraw;
|
int soundraw;
|
||||||
RESULT result = FMOD_System_CreateSound(rawPtr, (char8*)&data[0], mode, ref exinfo, out soundraw);
|
RESULT result = FMOD_System_CreateSound(rawPtr, (.)data.Ptr, mode, ref exinfo, out soundraw);
|
||||||
sound = new Sound(soundraw);
|
sound = new Sound(soundraw);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -34,21 +34,91 @@ Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://ww
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
#define TINFL_USE_64BIT_BITBUF
|
#define TINFL_USE_64BIT_BITBUF
|
||||||
#define MINIZ_HAS_64BIT_REGISTERS
|
#define MINIZ_HAS_64BIT_REGISTERS
|
||||||
#define MINIZ_LITTLE_ENDIAN
|
#define MINIZ_LITTLE_ENDIAN
|
||||||
#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES
|
#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES
|
||||||
|
|
||||||
|
#if BF_PLATFORM_WINDOWS
|
||||||
|
#define ALLOW_FILE_MAPPING
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace MiniZ
|
namespace MiniZ
|
||||||
{
|
{
|
||||||
class ZipFile
|
class ZipFile
|
||||||
{
|
{
|
||||||
|
class RangeStream : Stream
|
||||||
|
{
|
||||||
|
public bool mOwnsStream;
|
||||||
|
public Stream mStream ~ { if (mOwnsStream) delete _; };
|
||||||
|
public Range mRange;
|
||||||
|
|
||||||
|
public override bool CanRead => mStream.CanRead;
|
||||||
|
public override bool CanWrite => mStream.CanWrite;
|
||||||
|
public override int64 Length => mRange.Length;
|
||||||
|
|
||||||
|
public override int64 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return mStream.Position - mRange.Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
set
|
||||||
|
{
|
||||||
|
mStream.Position = value + mRange.Start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute)
|
||||||
|
{
|
||||||
|
//return mStream.Seek(pos, seekKind);
|
||||||
|
|
||||||
|
switch (seekKind)
|
||||||
|
{
|
||||||
|
case .Absolute:
|
||||||
|
return mStream.Seek(pos + mRange.Start, .Absolute);
|
||||||
|
case .Relative:
|
||||||
|
return mStream.Seek(pos, .Relative);
|
||||||
|
case .FromEnd:
|
||||||
|
return mStream.Seek(mRange.End - pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<int> TryRead(Span<uint8> data)
|
||||||
|
{
|
||||||
|
return mStream.TryRead(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<int, FileError> TryRead(Span<uint8> data, int timeoutMS)
|
||||||
|
{
|
||||||
|
return mStream.TryRead(data, timeoutMS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<int> TryWrite(Span<uint8> data)
|
||||||
|
{
|
||||||
|
return mStream.TryWrite(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<void> Close()
|
||||||
|
{
|
||||||
|
return mStream.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Result<void> Flush()
|
||||||
|
{
|
||||||
|
return mStream.Flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class Entry
|
public class Entry
|
||||||
{
|
{
|
||||||
ZipFile mZipFile;
|
ZipFile mZipFile;
|
||||||
MiniZ.ZipArchiveFileStat mFileStat;
|
MiniZ.ZipArchiveFileStat mFileStat;
|
||||||
int32 mFileIdx;
|
int32 mFileIdx;
|
||||||
|
Span<uint8> mAllocatedData ~ delete mAllocatedData.Ptr;
|
||||||
|
|
||||||
public bool IsDirectory
|
public bool IsDirectory
|
||||||
{
|
{
|
||||||
|
@ -65,6 +135,17 @@ namespace MiniZ
|
||||||
return .Ok;
|
return .Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Result<Span<uint8>> ExtractToMemory()
|
||||||
|
{
|
||||||
|
if (mAllocatedData.IsEmpty)
|
||||||
|
{
|
||||||
|
mAllocatedData = .(new uint8[mFileStat.mUncompSize]*, mFileStat.mUncompSize);
|
||||||
|
if (!MiniZ.ZipReaderExtractToMem(&mZipFile.[Friend]mFile, mFileIdx, mAllocatedData.Ptr, mAllocatedData.Length, .None))
|
||||||
|
return .Err;
|
||||||
|
}
|
||||||
|
return .Ok(mAllocatedData);
|
||||||
|
}
|
||||||
|
|
||||||
int GetStrLen(char8* ptr, int max)
|
int GetStrLen(char8* ptr, int max)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -97,10 +178,27 @@ namespace MiniZ
|
||||||
outComment.Append(&mFileStat.mComment, GetStrLen(&mFileStat.mComment, mFileStat.mComment.Count));
|
outComment.Append(&mFileStat.mComment, GetStrLen(&mFileStat.mComment, mFileStat.mComment.Count));
|
||||||
return .Ok;
|
return .Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DateTime GetDateTime()
|
||||||
|
{
|
||||||
|
int64 time = (int64)mFileStat.mTime * 10000000L + 116444736000000000L;
|
||||||
|
return DateTime(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Platform.BfpTimeStamp GetTimestamp()
|
||||||
|
{
|
||||||
|
return (.)(mFileStat.mTime * 10000000L + 116444736000000000L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MiniZ.ZipArchive mFile;
|
MiniZ.ZipArchive mFile;
|
||||||
bool mInitialized;
|
bool mInitialized;
|
||||||
|
#if ALLOW_FILE_MAPPING
|
||||||
|
Windows.FileHandle mShareFileHandle ~ _.Close();
|
||||||
|
Windows.Handle mShareFileMapping ~ _.Close();
|
||||||
|
Span<uint8> mMappedData;
|
||||||
|
#endif
|
||||||
|
Stream mOwnedStream ~ delete _;
|
||||||
|
|
||||||
public ~this()
|
public ~this()
|
||||||
{
|
{
|
||||||
|
@ -117,6 +215,74 @@ namespace MiniZ
|
||||||
return .Ok;
|
return .Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Result<void> Open(StringView fileName, Range range)
|
||||||
|
{
|
||||||
|
Debug.Assert(!mInitialized);
|
||||||
|
|
||||||
|
FileStream fileStream = new FileStream();
|
||||||
|
if (fileStream.Open(fileName, .Read, .Read) case .Err)
|
||||||
|
{
|
||||||
|
delete fileStream;
|
||||||
|
return .Err;
|
||||||
|
}
|
||||||
|
|
||||||
|
RangeStream rangeStream = new RangeStream() { mStream = fileStream, mOwnsStream = true, mRange = range };
|
||||||
|
mOwnedStream = rangeStream;
|
||||||
|
if (!MiniZ.ZipReaderInitStream(&mFile, rangeStream, .None))
|
||||||
|
return .Err;
|
||||||
|
mInitialized = true;
|
||||||
|
return .Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result<void> Open(Span<uint8> data)
|
||||||
|
{
|
||||||
|
Debug.Assert(!mInitialized);
|
||||||
|
if (!MiniZ.ZipReaderInitMem(&mFile, data.Ptr, data.Length, .None))
|
||||||
|
return .Err;
|
||||||
|
mInitialized = true;
|
||||||
|
return .Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result<void> OpenMapped(StringView fileName)
|
||||||
|
{
|
||||||
|
#if ALLOW_FILE_MAPPING
|
||||||
|
mShareFileHandle = Windows.CreateFileA(fileName.ToScopeCStr!(), Windows.GENERIC_READ, .Read, null, .Open, 0, default);
|
||||||
|
uint32 sizeHigh = 0;
|
||||||
|
uint32 sizeLow = (.)Windows.GetFileSize(mShareFileHandle, (.)&sizeHigh);
|
||||||
|
mShareFileMapping = Windows.CreateFileMappingA(mShareFileHandle, null, Windows.PAGE_READONLY, sizeHigh, sizeLow, null);
|
||||||
|
mMappedData = .((.)Windows.MapViewOfFile(mShareFileMapping, Windows.FILE_MAP_READ, 0, 0, sizeLow), sizeLow);
|
||||||
|
|
||||||
|
Debug.Assert(!mInitialized);
|
||||||
|
if (!MiniZ.ZipReaderInitMem(&mFile, mMappedData.Ptr, mMappedData.Length, .None))
|
||||||
|
return .Err;
|
||||||
|
mInitialized = true;
|
||||||
|
return .Ok;
|
||||||
|
#else
|
||||||
|
return Open(fileName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result<void> OpenMapped(StringView fileName, Range range)
|
||||||
|
{
|
||||||
|
#if ALLOW_FILE_MAPPING
|
||||||
|
mShareFileHandle = Windows.CreateFileA(fileName.ToScopeCStr!(), Windows.GENERIC_READ, .Read, null, .Open, 0, default);
|
||||||
|
uint32 sizeHigh = 0;
|
||||||
|
uint32 sizeLow = (.)range.End;
|
||||||
|
|
||||||
|
mShareFileMapping = Windows.CreateFileMappingA(mShareFileHandle, null, Windows.PAGE_READONLY, sizeHigh, sizeLow, null);
|
||||||
|
uint8* ptr = (.)Windows.MapViewOfFile(mShareFileMapping, Windows.FILE_MAP_READ, 0, 0, sizeLow);
|
||||||
|
mMappedData = .(ptr + range.Start, range.Length);
|
||||||
|
|
||||||
|
Debug.Assert(!mInitialized);
|
||||||
|
if (!MiniZ.ZipReaderInitMem(&mFile, mMappedData.Ptr, mMappedData.Length, .None))
|
||||||
|
return .Err;
|
||||||
|
mInitialized = true;
|
||||||
|
return .Ok;
|
||||||
|
#else
|
||||||
|
return Open(fileName, range);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
public Result<void> Init(Stream stream)
|
public Result<void> Init(Stream stream)
|
||||||
{
|
{
|
||||||
Debug.Assert(!mInitialized);
|
Debug.Assert(!mInitialized);
|
||||||
|
@ -3115,7 +3281,7 @@ namespace MiniZ
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool zip_reader_init_mem(ZipArchive* pZip, void* pMem, int size, ZipFlags flags)
|
public static bool ZipReaderInitMem(ZipArchive* pZip, void* pMem, int size, ZipFlags flags)
|
||||||
{
|
{
|
||||||
if (!zip_reader_init_internal(pZip, flags))
|
if (!zip_reader_init_internal(pZip, flags))
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue