mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-06-01 05:55:29 +00:00
188 lines
5.6 KiB
C#
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;
|
|
}
|
|
}
|