Files
YarikStudio/AssetStudio.Utility/ACL/ACL.cs
2023-10-03 01:39:59 +04:00

122 lines
4.1 KiB
C#

using System;
using System.Runtime.InteropServices;
using AssetStudio.PInvoke;
namespace ACLLibs
{
public struct DecompressedClip
{
public IntPtr Values;
public int ValuesCount;
public IntPtr Times;
public int TimesCount;
}
public static class ACL
{
private const string DLL_NAME = "acl";
static ACL()
{
DllLoader.PreloadDll(DLL_NAME);
}
public static void DecompressAll(byte[] data, out float[] values, out float[] times)
{
var decompressedClip = new DecompressedClip();
DecompressAll(data, ref decompressedClip);
values = new float[decompressedClip.ValuesCount];
Marshal.Copy(decompressedClip.Values, values, 0, decompressedClip.ValuesCount);
times = new float[decompressedClip.TimesCount];
Marshal.Copy(decompressedClip.Times, times, 0, decompressedClip.TimesCount);
Dispose(ref decompressedClip);
}
#region importfunctions
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void DecompressAll(byte[] data, ref DecompressedClip decompressedClip);
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void Dispose(ref DecompressedClip decompressedClip);
#endregion
}
public static class SRACL
{
private const string DLL_NAME = "sracl";
static SRACL()
{
DllLoader.PreloadDll(DLL_NAME);
}
public static void DecompressAll(byte[] data, out float[] values, out float[] times)
{
var decompressedClip = new DecompressedClip();
DecompressAll(data, ref decompressedClip);
values = new float[decompressedClip.ValuesCount];
Marshal.Copy(decompressedClip.Values, values, 0, decompressedClip.ValuesCount);
times = new float[decompressedClip.TimesCount];
Marshal.Copy(decompressedClip.Times, times, 0, decompressedClip.TimesCount);
Dispose(ref decompressedClip);
}
#region importfunctions
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void DecompressAll(byte[] data, ref DecompressedClip decompressedClip);
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void Dispose(ref DecompressedClip decompressedClip);
#endregion
}
public static class DBACL
{
private const string DLL_NAME = "acldb";
static DBACL()
{
DllLoader.PreloadDll(DLL_NAME);
}
public static void DecompressTracks(byte[] data, byte[] db, out float[] values, out float[] times)
{
var decompressedClip = new DecompressedClip();
var dataPtr = Marshal.AllocHGlobal(data.Length + 8);
var dataAligned = new IntPtr(16 * (((long)dataPtr + 15) / 16));
Marshal.Copy(data, 0, dataPtr, data.Length);
var dbPtr = Marshal.AllocHGlobal(db.Length + 8);
var dbAligned = new IntPtr(16 * (((long)dbPtr + 15) / 16));
Marshal.Copy(db, 0, dbAligned, db.Length);
DecompressTracks(dataAligned, dbAligned, ref decompressedClip);
Marshal.FreeHGlobal(dataPtr);
Marshal.FreeHGlobal(dbPtr);
values = new float[decompressedClip.ValuesCount];
Marshal.Copy(decompressedClip.Values, values, 0, decompressedClip.ValuesCount);
times = new float[decompressedClip.TimesCount];
Marshal.Copy(decompressedClip.Times, times, 0, decompressedClip.TimesCount);
Dispose(ref decompressedClip);
}
#region importfunctions
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void DecompressTracks(nint data, nint db, ref DecompressedClip decompressedClip);
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern void Dispose(ref DecompressedClip decompressedClip);
#endregion
}
}