mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
- Increased loading speed of AudioClip preview - Optimized memory consumption of AudioClip preview - Fixed incorrect length detection for some sound types - Added channel count info (audio channels)
109 lines
3.4 KiB
C#
109 lines
3.4 KiB
C#
using System.IO;
|
|
|
|
namespace AssetStudio
|
|
{
|
|
public class ResourceReader
|
|
{
|
|
private bool needSearch;
|
|
private string path;
|
|
private SerializedFile assetsFile;
|
|
private long size;
|
|
private BinaryReader reader;
|
|
|
|
public int Size
|
|
{
|
|
get => (int)size;
|
|
set => size = value;
|
|
}
|
|
public long Offset { get; set; }
|
|
|
|
public ResourceReader() { }
|
|
|
|
public ResourceReader(string path, SerializedFile assetsFile, long offset, long size)
|
|
{
|
|
needSearch = true;
|
|
this.path = path;
|
|
this.assetsFile = assetsFile;
|
|
this.Offset = offset;
|
|
this.size = size;
|
|
}
|
|
|
|
public ResourceReader(BinaryReader reader, long offset, long size)
|
|
{
|
|
this.reader = reader;
|
|
this.Offset = offset;
|
|
this.size = size;
|
|
}
|
|
|
|
private BinaryReader GetReader()
|
|
{
|
|
if (needSearch)
|
|
{
|
|
var resourceFileName = Path.GetFileName(path);
|
|
if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader))
|
|
{
|
|
needSearch = false;
|
|
return reader;
|
|
}
|
|
var assetsFileDirectory = Path.GetDirectoryName(assetsFile.fullName);
|
|
var resourceFilePath = Path.Combine(assetsFileDirectory, resourceFileName);
|
|
if (!File.Exists(resourceFilePath))
|
|
{
|
|
var findFiles = Directory.GetFiles(assetsFileDirectory, resourceFileName, SearchOption.AllDirectories);
|
|
if (findFiles.Length > 0)
|
|
{
|
|
resourceFilePath = findFiles[0];
|
|
}
|
|
}
|
|
if (File.Exists(resourceFilePath))
|
|
{
|
|
needSearch = false;
|
|
if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader))
|
|
{
|
|
return reader;
|
|
}
|
|
reader = new BinaryReader(File.OpenRead(resourceFilePath));
|
|
assetsFile.assetsManager.resourceFileReaders.TryAdd(resourceFileName, reader);
|
|
return reader;
|
|
}
|
|
throw new FileNotFoundException($"Can't find the resource file {resourceFileName}");
|
|
}
|
|
else
|
|
{
|
|
return reader;
|
|
}
|
|
}
|
|
|
|
public byte[] GetData()
|
|
{
|
|
var binaryReader = GetReader();
|
|
lock (binaryReader)
|
|
{
|
|
binaryReader.BaseStream.Position = Offset;
|
|
return binaryReader.ReadBytes((int)size);
|
|
}
|
|
}
|
|
|
|
public void GetData(byte[] buff, out int read, int startIndex = 0)
|
|
{
|
|
read = -1;
|
|
var binaryReader = GetReader();
|
|
lock (binaryReader)
|
|
{
|
|
binaryReader.BaseStream.Position = Offset;
|
|
read = binaryReader.Read(buff, startIndex, (int)size);
|
|
}
|
|
}
|
|
|
|
public void WriteData(string path)
|
|
{
|
|
var binaryReader = GetReader();
|
|
binaryReader.BaseStream.Position = Offset;
|
|
using (var writer = File.OpenWrite(path))
|
|
{
|
|
binaryReader.BaseStream.CopyTo(writer, size);
|
|
}
|
|
}
|
|
}
|
|
}
|