Files
PCK-Studio/MinecraftUSkinEditor/Classes/Bink.cs
2021-05-13 19:54:15 -04:00

188 lines
5.6 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
namespace PckStudio.Classes
{
internal class Bink
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll")]
public static extern IntPtr FreeLibrary(IntPtr library);
public unsafe static string Binka(string infile, string outDir = null, bool last = true, string working = null)
{
bool flag = working == null;
string text;
string text2;
string path;
if (flag)
{
working = Path.GetTempPath() + DateTime.Now.Second.ToString();
text = PckStudio.Classes.Bink.ExtractResource("Resources.binka_encode.exe", working, "binka_encode.exe");
text2 = PckStudio.Classes.Bink.ExtractResource("Resources.mss32.dll", working, "mss32.dll");
path = PckStudio.Classes.Bink.ExtractResource("Resources.binkawin.asi", working, "binkawin.asi");
PckStudio.Classes.Bink.library = PckStudio.Classes.Bink.LoadLibrary(text2);
}
else
{
text = working + "\\binka_encode.exe";
text2 = working + "\\mss32.dll";
path = working + "\\binkawin.asi";
}
bool flag2 = PckStudio.Classes.Bink.getType(infile) == "WAV";
if (flag2)
{
string[] array = PckStudio.Classes.Bink.createArg(infile, outDir);
Process process = new Process();
process.StartInfo.FileName = text;
process.StartInfo.Arguments = string.Concat(new string[]
{
" \"",
array[0],
"\" \"",
array[1],
"\""
});
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
process.WaitForExit();
}
else
{
bool flag3 = PckStudio.Classes.Bink.getType(infile) == "BINKA";
if (flag3)
{
string[] array2 = PckStudio.Classes.Bink.createArg(infile, outDir);
byte[] array3 = File.ReadAllBytes(array2[0]);
uint num = 0U;
PckStudio.Classes.Bink.AIL_set_redist_directory(".");
PckStudio.Classes.Bink.AIL_startup();
IntPtr intPtr;
bool flag4 = PckStudio.Classes.Bink.AIL_decompress_ASI(array3, (uint)array3.Length, ".binka", &intPtr, &num, 0U) == 0;
if (flag4)
{
throw new Exception("AIL ERROR");
}
byte[] array4 = new byte[num];
Marshal.Copy(intPtr, array4, 0, array4.Length);
PckStudio.Classes.Bink.AIL_mem_free_lock(intPtr);
PckStudio.Classes.Bink.AIL_shutdown();
File.WriteAllBytes(array2[1], array4);
}
}
if (last)
{
PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library);
PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library);
File.Delete(text);
File.Delete(path);
while (File.Exists(text2))
{
try
{
File.Delete(text2);
}
catch
{
PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library);
}
}
}
return working;
}
private static string getType(string loc)
{
string a = Path.GetExtension(loc).ToLower();
bool flag = a == ".binka";
string result;
if (flag)
{
result = "BINKA";
}
else
{
bool flag2 = !(a == ".wav");
if (flag2)
{
throw new Exception("File type not valid. To use MP3 or other audio formats, convert to wav format before using tool");
}
result = "WAV";
}
return result;
}
private static string[] createArg(string inFile, string outdir = null)
{
string[] array = new string[2];
array[0] = inFile;
string[] array2 = array;
string type = PckStudio.Classes.Bink.getType(inFile);
bool flag = type == "BINKA";
if (flag)
{
array2[1] = ((outdir.Length <= 3) ? Path.GetFullPath(inFile.Replace(".binka", ".wav")) : (outdir + "\\" + Path.GetFileName(inFile.Replace(".binka", ".wav"))));
}
else
{
bool flag2 = type == "WAV";
if (flag2)
{
array2[1] = ((outdir.Length <= 3) ? Path.GetFullPath(inFile.Replace(".wav", ".binka")) : (outdir + "\\" + Path.GetFileName(inFile.Replace(".wav", ".binka"))));
}
}
bool flag3 = !Directory.Exists(Path.GetDirectoryName(array2[1]));
if (flag3)
{
Directory.CreateDirectory(Path.GetDirectoryName(array2[1]));
}
return array2;
}
internal static string ExtractResource(string resource, string path, string filename)
{
Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
byte[] array = new byte[(int)manifestResourceStream.Length];
manifestResourceStream.Read(array, 0, array.Length);
manifestResourceStream.Close();
bool flag = !Directory.Exists(path);
if (flag)
{
Directory.CreateDirectory(path);
}
path = path + "\\" + filename;
File.WriteAllBytes(path, array);
return path;
}
[DllImport("mss32.dll", EntryPoint = "_AIL_decompress_ASI@24")]
private unsafe static extern int AIL_decompress_ASI([MarshalAs(UnmanagedType.LPArray)] byte[] indata, uint insize, [MarshalAs(UnmanagedType.LPStr)] string ext, IntPtr* result, uint* resultsize, uint zero);
[DllImport("mss32.dll", EntryPoint = "_AIL_last_error@0")]
private static extern IntPtr AIL_last_error();
[DllImport("mss32.dll", EntryPoint = "_AIL_set_redist_directory@4")]
private static extern IntPtr AIL_set_redist_directory([MarshalAs(UnmanagedType.LPStr)] string redistDir);
[DllImport("mss32.dll", EntryPoint = "_AIL_mem_free_lock@4")]
private static extern void AIL_mem_free_lock(IntPtr ptr);
[DllImport("mss32.dll", EntryPoint = "_AIL_startup@0")]
private static extern int AIL_startup();
[DllImport("mss32.dll", EntryPoint = "_AIL_shutdown@0")]
private static extern int AIL_shutdown();
public Bink()
{
}
private static IntPtr library;
}
}